Skip to content

Commit e785fb3

Browse files
authored
Merge pull request #222 from evolvedbinary/6.x.x/hotfix/json-response
[6.x.x] Add media type to `writeResultJSON` response header
2 parents f02f867 + 4e83f07 commit e785fb3

2 files changed

Lines changed: 135 additions & 0 deletions

File tree

exist-core/src/main/java/org/exist/http/RESTServer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2313,6 +2313,19 @@ private void writeResultJSON(final HttpServletResponse response,
23132313
int start, final Properties outputProperties, final boolean wrap, final long compilationTime, final long executionTime)
23142314
throws BadRequestException {
23152315

2316+
// set output headers
2317+
final String encoding = outputProperties.getProperty(OutputKeys.ENCODING);
2318+
if (!response.containsHeader("Content-Type")) {
2319+
String mimeType = outputProperties.getProperty(OutputKeys.MEDIA_TYPE);
2320+
if (mimeType != null) {
2321+
final int semicolon = mimeType.indexOf(';');
2322+
if (semicolon != Constants.STRING_NOT_FOUND) {
2323+
mimeType = mimeType.substring(0, semicolon);
2324+
}
2325+
response.setContentType(mimeType + "; charset=" + encoding);
2326+
}
2327+
}
2328+
23162329
// calculate number of results to return
23172330
final int rlen = results.getItemCount();
23182331
if (!results.isEmpty()) {

exist-core/src/test/java/org/exist/http/RESTServiceTest.java

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.apache.http.HttpResponse;
6161
import org.apache.http.client.fluent.Request;
6262
import org.apache.http.entity.ContentType;
63+
import org.apache.http.util.EntityUtils;
6364
import org.eclipse.jetty.http.HttpStatus;
6465
import org.exist.EXistException;
6566
import org.exist.Namespaces;
@@ -230,6 +231,20 @@ public class RESTServiceTest {
230231
private static final XmldbURI TEST_XML_DOC_WITH_XSLPI_URI = XmldbURI.create("test-with-xslpi.xml");
231232

232233

234+
private static final String TEST_PRODUCES_XML_XQUERY =
235+
"xquery version \"3.0\";\n" +
236+
"declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";\n" +
237+
"declare option output:method \"xml\";\n" +
238+
"declare option output:media-type \"application/xml\";\n" +
239+
"<test>xml</test>";
240+
241+
private static final String TEST_PRODUCES_JSON_XQUERY =
242+
"xquery version \"3.0\";\n" +
243+
"declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";\n" +
244+
"declare option output:method \"json\";\n" +
245+
"declare option output:media-type \"application/json\";\n" +
246+
"<test><json1>json</json1> <json2>json</json2></test>";
247+
233248
private static String credentials;
234249
private static String badCredentials;
235250

@@ -1189,6 +1204,113 @@ public void getDocWithXslPi_twice() throws IOException {
11891204
getDocWithXslPi();
11901205
}
11911206

1207+
@Test
1208+
public void queryProducesXmlWithAcceptXml() throws IOException {
1209+
doPut(TEST_PRODUCES_XML_XQUERY, "produces-xml.xq", HttpStatus.CREATED_201);
1210+
final String uri = getCollectionUri() + "/produces-xml.xq";
1211+
1212+
final HttpResponse response = Request.Get(uri)
1213+
.setHeader("Accept", MediaType.APPLICATION_XML)
1214+
.setHeader("Authorization", "Basic " + credentials)
1215+
.execute()
1216+
.returnResponse();
1217+
1218+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1219+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1220+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1221+
assertResponseMediaType(MediaType.APPLICATION_XML, response);
1222+
assertEquals("<test>xml</test>", responseBody);
1223+
}
1224+
1225+
@Test
1226+
public void queryProducesJsonWithAcceptXml() throws IOException {
1227+
doPut(TEST_PRODUCES_JSON_XQUERY, "produces-json.xq", HttpStatus.CREATED_201);
1228+
final String uri = getCollectionUri() + "/produces-json.xq";
1229+
1230+
final HttpResponse response = Request.Get(uri)
1231+
.setHeader("Authorization", "Basic " + credentials)
1232+
.setHeader("Accept", MediaType.APPLICATION_XML)
1233+
.execute()
1234+
.returnResponse();
1235+
1236+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1237+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1238+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1239+
assertResponseMediaType("application/json", response);
1240+
assertEquals("{ \"json1\" : \"json\", \"json2\" : \"json\" }", responseBody);
1241+
}
1242+
1243+
@Test
1244+
public void queryProducesXmlWithAcceptJson() throws IOException {
1245+
doPut(TEST_PRODUCES_XML_XQUERY, "produces-xml.xq", HttpStatus.CREATED_201);
1246+
final String uri = getCollectionUri() + "/produces-xml.xq";
1247+
1248+
final HttpResponse response = Request.Get(uri)
1249+
.setHeader("Authorization", "Basic " + credentials)
1250+
.setHeader("Accept", "application/json")
1251+
.execute()
1252+
.returnResponse();
1253+
1254+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1255+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1256+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1257+
assertResponseMediaType(MediaType.APPLICATION_XML, response);
1258+
assertEquals("<test>xml</test>", responseBody);
1259+
}
1260+
1261+
@Test
1262+
public void queryProducesJsonWithAcceptJson() throws IOException {
1263+
doPut(TEST_PRODUCES_JSON_XQUERY, "produces-json.xq", HttpStatus.CREATED_201);
1264+
final String uri = getCollectionUri() + "/produces-json.xq";
1265+
1266+
final HttpResponse response = Request.Get(uri)
1267+
.setHeader("Authorization", "Basic " + credentials)
1268+
.setHeader("Accept", "application/json")
1269+
.execute()
1270+
.returnResponse();
1271+
1272+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1273+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1274+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1275+
assertResponseMediaType("application/json", response);
1276+
assertEquals("{ \"json1\" : \"json\", \"json2\" : \"json\" }", responseBody);
1277+
}
1278+
1279+
@Test
1280+
public void queryProducesXmlWithNoAccept() throws IOException {
1281+
doPut(TEST_PRODUCES_XML_XQUERY, "produces-xml.xq", HttpStatus.CREATED_201);
1282+
final String uri = getCollectionUri() + "/produces-xml.xq";
1283+
1284+
final HttpResponse response = Request.Get(uri)
1285+
.setHeader("Authorization", "Basic " + credentials)
1286+
.execute()
1287+
.returnResponse();
1288+
1289+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1290+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1291+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1292+
assertResponseMediaType(MediaType.APPLICATION_XML, response);
1293+
assertEquals("<test>xml</test>", responseBody);
1294+
}
1295+
1296+
@Test
1297+
public void queryProducesJsonWithNoAccept() throws IOException {
1298+
doPut(TEST_PRODUCES_JSON_XQUERY, "produces-json.xq", HttpStatus.CREATED_201);
1299+
final String uri = getCollectionUri() + "/produces-json.xq";
1300+
1301+
final HttpResponse response = Request.Get(uri)
1302+
.setHeader("Authorization", "Basic " + credentials)
1303+
.execute()
1304+
.returnResponse();
1305+
1306+
final int resultStatusCode = response.getStatusLine().getStatusCode();
1307+
final String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
1308+
assertEquals("Server returned response code: " + resultStatusCode, HttpStatus.OK_200, resultStatusCode);
1309+
assertResponseMediaType("application/json", response);
1310+
assertEquals("{ \"json1\" : \"json\", \"json2\" : \"json\" }", responseBody);
1311+
}
1312+
1313+
11921314
private void chmod(final String resourcePath, final String mode) throws IOException {
11931315
final String uri = getCollectionUri() +"?_query=" + URLEncoder.encode(
11941316
"sm:chmod(xs:anyURI('" + resourcePath + "'), '" + mode + "')",

0 commit comments

Comments
 (0)