*/
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;
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
}
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.";
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();