*/
package org.sonar.server.qualityprofile.ws;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
import org.sonar.api.resources.Languages;
import org.sonar.api.server.ws.Request;
import org.sonar.server.qualityprofile.QProfileBackuper;
import org.sonar.server.qualityprofile.QProfileFactory;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-
public class BackupAction implements QProfileWsAction {
private final QProfileBackuper backuper;
try {
String profileKey = QProfileIdentificationParamUtils.getProfileKeyFromParameters(request, profileFactory, session);
backuper.backup(profileKey, writer);
+ response.setHeader("Content-Disposition", String.format("attachment; filename=%s.xml", profileKey));
} finally {
session.close();
IOUtils.closeQuietly(writer);
*/
package org.sonar.server.ws;
-import org.sonar.api.server.ws.Response;
-import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.utils.text.XmlWriter;
-import org.sonar.server.plugins.MimeTypes;
-
-import javax.annotation.CheckForNull;
-
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import org.sonar.api.server.ws.Response;
+import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.api.utils.text.XmlWriter;
+import org.sonar.server.plugins.MimeTypes;
public class ServletResponse implements Response {
+ private Map<String, String> headers = new HashMap<String, String>();
+
public static class ServletStream implements Stream {
private String mediaType;
private int httpStatus = 200;
stream.setStatus(204);
return this;
}
+
+ @Override
+ public Response setHeader(String name, String value) {
+ headers.put(name, value);
+ return this;
+ }
+
+ @Override
+ public Collection<String> getHeaderNames() {
+ return headers.keySet();
+ }
+
+ @Override
+ public String getHeader(String name) {
+ return headers.get(name);
+ }
}
*/
package org.sonar.server.qualityprofile.ws;
+import java.io.PrintWriter;
+import java.io.Writer;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.sonar.server.ws.WsTester;
import org.sonar.server.ws.WsTester.Result;
-import java.io.PrintWriter;
-import java.io.Writer;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
Result result = tester.newGetRequest("api/qualityprofiles", "backup").setParam("profileKey", profileKey).execute();
assertThat(result.outputAsString()).isEqualTo(response);
+ result.assertHeader("Content-Disposition", "attachment; filename=polop-palap-xoo-12345.xml");
}
@Test(expected = IllegalArgumentException.class)
package org.sonar.server.ws;
import com.google.common.collect.Maps;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.Map;
+import javax.annotation.Nullable;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.sonar.server.plugins.MimeTypes;
import org.sonar.server.tester.UserSessionRule;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Locale;
-import java.util.Map;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
assertThat(response.stream().mediaType()).isEqualTo(MimeTypes.JSON);
}
+ @Test
+ public void should_handle_headers() throws Exception {
+ ServletResponse response = new ServletResponse();
+ String name = "Content-Disposition";
+ String value = "attachment; filename=sonarqube.zip";
+ response.setHeader(name, value);
+ assertThat(response.getHeaderNames()).containsExactly(name);
+ assertThat(response.getHeader(name)).isEqualTo(value);
+ }
+
static class SystemWs implements WebService {
@Override
public void define(Context context) {
package org.sonar.server.ws;
import com.google.common.collect.Maps;
-import org.apache.commons.io.IOUtils;
-import org.sonar.api.server.ws.Response;
-import org.sonar.api.server.ws.WebService;
-import org.sonar.api.server.ws.internal.ValidatingRequest;
-import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.utils.text.XmlWriter;
-import org.sonar.server.ws.WsTester.TestResponse.TestStream;
-import org.sonar.test.JsonAssert;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
+import java.util.Collection;
import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.apache.commons.io.IOUtils;
+import org.sonar.api.server.ws.Response;
+import org.sonar.api.server.ws.WebService;
+import org.sonar.api.server.ws.internal.ValidatingRequest;
+import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.api.utils.text.XmlWriter;
+import org.sonar.server.ws.WsTester.TestResponse.TestStream;
+import org.sonar.test.JsonAssert;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.ws.RequestVerifier.verifyRequest;
private TestStream stream;
+ private Map<String, String> headers = Maps.newHashMap();
+
public class TestStream implements Response.Stream {
private String mediaType;
private int status;
public String outputAsString() {
return new String(output.toByteArray(), StandardCharsets.UTF_8);
}
+
+ @Override
+ public Response setHeader(String name, String value) {
+ headers.put(name, value);
+ return this;
+ }
+
+ @Override
+ public Collection<String> getHeaderNames() {
+ return headers.keySet();
+ }
+
+ @Override
+ public String getHeader(String name) {
+ return headers.get(name);
+ }
}
public static class Result {
return this;
}
+ public Result assertHeader(String name, String value) {
+ assertThat(response.getHeader(name)).isEqualTo(value);
+ return this;
+ }
}
private final WebService.Context context = new WebService.Context();
engine = Java::OrgSonarServerPlatform::Platform.component(Java::OrgSonarServerWs::WebServiceEngine.java_class)
engine.execute(ws_request, ws_response, params[:wspath], params[:wsaction])
+ ws_response.getHeaderNames().to_a.each do |name|
+ response.header[name] = ws_response.getHeader(name)
+ end
+
# response is already written to HttpServletResponse
render :text => ws_response.stream().output().toByteArray(),
:status => ws_response.stream().httpStatus(),
*/
package org.sonar.api.server.ws;
+import java.io.OutputStream;
+import java.util.Collection;
+import javax.annotation.CheckForNull;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.utils.text.XmlWriter;
-import java.io.OutputStream;
-
/**
* HTTP response
*
Response noContent();
+ Response setHeader(String name, String value);
+
+ Collection<String> getHeaderNames();
+
+ @CheckForNull
+ String getHeader(String name);
+
Stream stream();
}