Skip to content

Commit fc246cc

Browse files
committed
#marmotta-606
in sparqlwebservice, only the first "Accept" header of the HttpServletRequest was checked. Added method in MarmottaHttpUtils#parseAcceptHeader(Enumeration) to return the ordered list of content types. Changed SparqlWebService to check the list
1 parent eb5a77a commit fc246cc

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java

+34
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,54 @@
1818
package org.apache.marmotta.commons.http;
1919

2020
import org.apache.commons.lang3.StringUtils;
21+
2122
import org.openrdf.query.resultio.QueryResultFormat;
2223

2324
import java.nio.charset.Charset;
2425
import java.util.ArrayList;
2526
import java.util.Collection;
2627
import java.util.Collections;
28+
import java.util.Enumeration;
2729
import java.util.List;
2830

31+
import javax.servlet.http.HttpServletRequest;
32+
2933
/**
3034
* Add file description here!
3135
* <p/>
3236
* Author: Sebastian Schaffert
3337
*/
3438
public class MarmottaHttpUtils {
39+
public static final String ACCEPT = "Accept";
40+
/**
41+
* A utility method for parsing Content-Type and Accept header
42+
* @param request the {@link HttpServletRequest} provided
43+
* @return An ordered list of {@link ContentType} elements
44+
*/
45+
public static List<ContentType> parseAcceptHeader(HttpServletRequest request) {
46+
Enumeration<String> acceptHeaderStrings = request.getHeaders(ACCEPT);
47+
return parseAcceptHeader(acceptHeaderStrings);
48+
}
49+
/**
50+
* A utility method for parsing Content-Type out of the provided Accept headers.
51+
*
52+
* @param request the {@link HttpServletRequest} provided
53+
* @return An ordered list of {@link ContentType} elements.
54+
* @see HttpServletRequest#getHeaders(String)
55+
*/
56+
public static List<ContentType> parseAcceptHeader(Enumeration<String> acceptHeaderStrings) {
57+
List<ContentType> contentTypes = new ArrayList<>();
58+
while ( acceptHeaderStrings.hasMoreElements() ) {
59+
ContentType contentType = parseContentType(acceptHeaderStrings.nextElement());
60+
if ( contentType != null ) {
61+
contentTypes.add(contentType);
62+
}
63+
}
64+
//
65+
Collections.sort(contentTypes);
66+
67+
return contentTypes;
68+
}
3569

3670
/**
3771
* A utility method for parsing HTTP Content-Type and Accept header, taking into account different parameters that

platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,12 @@ public Response selectPost(@QueryParam("output") String resultType, @Context Htt
232232
*/
233233
private Response select(String query, String resultType, HttpServletRequest request) {
234234
try {
235+
// MARMOTTA-606 - check all "Accept" Headers, not only the first one
236+
List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT));
235237
String acceptHeader = StringUtils.defaultString(request.getHeader(ACCEPT), "");
236238
if (StringUtils.isBlank(query)) { //empty query
239+
// combine the list of accepted types to search for HTML header
240+
acceptHeader = StringUtils.join(acceptedTypes, ",");
237241
if (acceptHeader.contains("html")) {
238242
return Response.seeOther(new URI(configurationService.getServerUri() + "sparql/admin/squebi.html")).build();
239243
} else {
@@ -242,13 +246,14 @@ private Response select(String query, String resultType, HttpServletRequest requ
242246
} else {
243247
//query duck typing
244248
QueryType queryType = sparqlService.getQueryType(QueryLanguage.SPARQL, query);
245-
List<ContentType> acceptedTypes;
249+
// List<ContentType> acceptedTypes;
246250
List<ContentType> offeredTypes;
247251
if (resultType != null) {
248252
acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(resultType);
249-
} else {
250-
acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(acceptHeader);
251-
}
253+
}
254+
// else {
255+
// acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(acceptHeader);
256+
// }
252257
if (QueryType.TUPLE.equals(queryType)) {
253258
offeredTypes = MarmottaHttpUtils.parseQueryResultFormatList(TupleQueryResultWriterRegistry.getInstance().getKeys());
254259
} else if (QueryType.BOOL.equals(queryType)) {
@@ -389,7 +394,8 @@ private Response update(String update, String resultType, HttpServletRequest req
389394
return Response.ok().build();
390395
} else {
391396
if (resultType == null) {
392-
List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT));
397+
// MARMOTTA-606: Check all provdes accept headers, not only the first one
398+
List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT));
393399
List<ContentType> offeredTypes = MarmottaHttpUtils.parseStringList(Lists.newArrayList("*/*", "text/html"));
394400
ContentType bestType = MarmottaHttpUtils.bestContentType(offeredTypes, acceptedTypes);
395401
if (bestType != null) {
@@ -464,7 +470,8 @@ private Response createServiceDescriptionResponse(final HttpServletRequest reque
464470
if (StringUtils.isBlank(request.getHeader(ACCEPT))) {
465471
acceptedTypes = Collections.singletonList(MarmottaHttpUtils.parseContentType(RDFXML.getDefaultMIMEType()));
466472
} else {
467-
acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT));
473+
// MARMOTTA-606 - retrieve all headers instead of the first one
474+
acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT));
468475
}
469476

470477
ContentType _bestType = null;

0 commit comments

Comments
 (0)