Repository: marmotta Updated Branches: refs/heads/master eb5a77a1f -> fc246cc6f
#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 Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/fc246cc6 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/fc246cc6 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/fc246cc6 Branch: refs/heads/master Commit: fc246cc6f09adceafaffbdfa36d70d414233b586 Parents: eb5a77a Author: Dietmar Glachs <[email protected]> Authored: Tue Apr 7 10:10:10 2015 +0200 Committer: Dietmar Glachs <[email protected]> Committed: Tue Apr 7 10:10:10 2015 +0200 ---------------------------------------------------------------------- .../commons/http/MarmottaHttpUtils.java | 34 ++++++++++++++++++++ .../sparql/webservices/SparqlWebService.java | 19 +++++++---- 2 files changed, 47 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/fc246cc6/commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java ---------------------------------------------------------------------- diff --git a/commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java b/commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java index 199dde9..102c991 100644 --- a/commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java +++ b/commons/marmotta-commons/src/main/java/org/apache/marmotta/commons/http/MarmottaHttpUtils.java @@ -18,20 +18,54 @@ package org.apache.marmotta.commons.http; import org.apache.commons.lang3.StringUtils; + import org.openrdf.query.resultio.QueryResultFormat; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.List; +import javax.servlet.http.HttpServletRequest; + /** * Add file description here! * <p/> * Author: Sebastian Schaffert */ public class MarmottaHttpUtils { + public static final String ACCEPT = "Accept"; + /** + * A utility method for parsing Content-Type and Accept header + * @param request the {@link HttpServletRequest} provided + * @return An ordered list of {@link ContentType} elements + */ + public static List<ContentType> parseAcceptHeader(HttpServletRequest request) { + Enumeration<String> acceptHeaderStrings = request.getHeaders(ACCEPT); + return parseAcceptHeader(acceptHeaderStrings); + } + /** + * A utility method for parsing Content-Type out of the provided Accept headers. + * + * @param request the {@link HttpServletRequest} provided + * @return An ordered list of {@link ContentType} elements. + * @see HttpServletRequest#getHeaders(String) + */ + public static List<ContentType> parseAcceptHeader(Enumeration<String> acceptHeaderStrings) { + List<ContentType> contentTypes = new ArrayList<>(); + while ( acceptHeaderStrings.hasMoreElements() ) { + ContentType contentType = parseContentType(acceptHeaderStrings.nextElement()); + if ( contentType != null ) { + contentTypes.add(contentType); + } + } + // + Collections.sort(contentTypes); + + return contentTypes; + } /** * A utility method for parsing HTTP Content-Type and Accept header, taking into account different parameters that http://git-wip-us.apache.org/repos/asf/marmotta/blob/fc246cc6/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java index 3fde761..6db8476 100644 --- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java +++ b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java @@ -232,8 +232,12 @@ public class SparqlWebService { */ private Response select(String query, String resultType, HttpServletRequest request) { try { + // MARMOTTA-606 - check all "Accept" Headers, not only the first one + List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT)); String acceptHeader = StringUtils.defaultString(request.getHeader(ACCEPT), ""); if (StringUtils.isBlank(query)) { //empty query + // combine the list of accepted types to search for HTML header + acceptHeader = StringUtils.join(acceptedTypes, ","); if (acceptHeader.contains("html")) { return Response.seeOther(new URI(configurationService.getServerUri() + "sparql/admin/squebi.html")).build(); } else { @@ -242,13 +246,14 @@ public class SparqlWebService { } else { //query duck typing QueryType queryType = sparqlService.getQueryType(QueryLanguage.SPARQL, query); - List<ContentType> acceptedTypes; + // List<ContentType> acceptedTypes; List<ContentType> offeredTypes; if (resultType != null) { acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(resultType); - } else { - acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(acceptHeader); - } + } +// else { +// acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(acceptHeader); +// } if (QueryType.TUPLE.equals(queryType)) { offeredTypes = MarmottaHttpUtils.parseQueryResultFormatList(TupleQueryResultWriterRegistry.getInstance().getKeys()); } else if (QueryType.BOOL.equals(queryType)) { @@ -389,7 +394,8 @@ public class SparqlWebService { return Response.ok().build(); } else { if (resultType == null) { - List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT)); + // MARMOTTA-606: Check all provdes accept headers, not only the first one + List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT)); List<ContentType> offeredTypes = MarmottaHttpUtils.parseStringList(Lists.newArrayList("*/*", "text/html")); ContentType bestType = MarmottaHttpUtils.bestContentType(offeredTypes, acceptedTypes); if (bestType != null) { @@ -464,7 +470,8 @@ public class SparqlWebService { if (StringUtils.isBlank(request.getHeader(ACCEPT))) { acceptedTypes = Collections.singletonList(MarmottaHttpUtils.parseContentType(RDFXML.getDefaultMIMEType())); } else { - acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT)); + // MARMOTTA-606 - retrieve all headers instead of the first one + acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeaders(ACCEPT)); } ContentType _bestType = null;
