]> source.dussan.org Git - sonarqube.git/commitdiff
Unwrap JSON error message when calling WS
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 28 Jan 2015 16:14:09 +0000 (17:14 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 28 Jan 2015 17:11:06 +0000 (18:11 +0100)
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ServerClient.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java

index 2fed7682233cc1d2e336c4a92ca318a076b0dbbe..faeef8385d845634d44f785c965bad4feeb82e53 100644 (file)
  */
 package org.sonar.batch.bootstrap;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.io.Files;
 import com.google.common.io.InputSupplier;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
@@ -39,6 +44,8 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Replace the deprecated org.sonar.batch.ServerMetadata
@@ -127,11 +134,26 @@ public class ServerClient implements BatchComponent {
     }
     if (he.getResponseCode() == 403) {
       // SONAR-4397 Details are in response content
-      return new IllegalStateException(he.getResponseContent());
+      return new IllegalStateException(tryParseAsJsonError(he.getResponseContent()));
     }
     return new IllegalStateException(String.format("Fail to execute request [code=%s, url=%s]", he.getResponseCode(), he.getUri()), he);
   }
 
+  private String tryParseAsJsonError(String responseContent) {
+    try {
+      JsonParser parser = new JsonParser();
+      JsonObject obj = parser.parse(responseContent).getAsJsonObject();
+      JsonArray errors = obj.getAsJsonArray("errors");
+      List<String> errorMessages = new ArrayList<>();
+      for (JsonElement e : errors) {
+        errorMessages.add(e.getAsJsonObject().get("msg").getAsString());
+      }
+      return Joiner.on(", ").join(errorMessages);
+    } catch (Exception e) {
+      return responseContent;
+    }
+  }
+
   public String getMessageWhenNotAuthorized() {
     if (Strings.isNullOrEmpty(getLogin()) && Strings.isNullOrEmpty(getPassword())) {
       return "Not authorized. Analyzing this project requires to be authenticated. Please provide the values of the properties %s and %s.";
index b5843e2bad9b4b877f4b4b633e42eb0f1b6e3c62..1034c0209571333bca82a59cba19822715aaf5cf 100644 (file)
@@ -125,6 +125,17 @@ public class ServerClientTest {
     newServerClient().request("/foo");
   }
 
+  @Test
+  public void should_display_json_error_when_403() throws Exception {
+    server = new MockHttpServer();
+    server.start();
+    server.setMockResponseStatus(403);
+    server.setMockResponseData("{\"errors\":[{\"msg\":\"Insufficient privileges\"}]}");
+
+    thrown.expectMessage("Insufficient privileges");
+    newServerClient().request("/foo");
+  }
+
   @Test
   public void should_fail_if_error() throws Exception {
     server = new MockHttpServer();