Return-Path: X-Original-To: apmail-marmotta-commits-archive@minotaur.apache.org Delivered-To: apmail-marmotta-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8C9F618F7A for ; Wed, 1 Jul 2015 10:28:16 +0000 (UTC) Received: (qmail 82030 invoked by uid 500); 1 Jul 2015 10:28:16 -0000 Delivered-To: apmail-marmotta-commits-archive@marmotta.apache.org Received: (qmail 81979 invoked by uid 500); 1 Jul 2015 10:28:16 -0000 Mailing-List: contact commits-help@marmotta.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@marmotta.apache.org Delivered-To: mailing list commits@marmotta.apache.org Received: (qmail 81955 invoked by uid 99); 1 Jul 2015 10:28:16 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Jul 2015 10:28:16 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CEF9CDFE60; Wed, 1 Jul 2015 10:28:15 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: wikier@apache.org To: commits@marmotta.apache.org Date: Wed, 01 Jul 2015 10:28:15 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [01/30] marmotta git commit: Allow multiple accept headers in SPARQL web service Repository: marmotta Updated Branches: refs/heads/MARMOTTA-588 b18758d12 -> 78ca9bfcf Allow multiple accept headers in SPARQL web service Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/73491437 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/73491437 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/73491437 Branch: refs/heads/MARMOTTA-588 Commit: 73491437505fe9c05955730bd620f58066f3d101 Parents: 0b8f748 Author: Kai Schlegel Authored: Mon Feb 9 16:10:26 2015 +0100 Committer: Kai Schlegel Committed: Mon Feb 9 16:10:26 2015 +0100 ---------------------------------------------------------------------- .../commons/http/MarmottaHttpUtils.java | 22 ++++++++++++++++++++ .../sparql/webservices/SparqlWebService.java | 19 ++++++++++------- .../webservices/SparqlWebServiceTest.java | 14 +++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/73491437/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 34f0213..46f38f5 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 @@ -64,6 +64,28 @@ public class MarmottaHttpUtils { return contentTypes; } + /** + * A utility method for parsing HTTP Content-Type and Accept header, taking into account different parameters that + * are typically passed. Recognized parameters: + * - charset: gives the charset of the content + * - q: gives the precedence of the content + * The result is an ordered list of content types in order of the computed preference in the header value passed as + * string argument. + *

+ * Author: Kai Schlegel + */ + public static List parseAcceptHeaders(List headers) { + List result = new ArrayList<>(); + + for(String header : headers) { + result.addAll(parseAcceptHeader(header)); + } + + Collections.sort(result); + + return result; + } + public static List parseStringList(Collection types) { List contentTypes = new ArrayList(types.size()); http://git-wip-us.apache.org/repos/asf/marmotta/blob/73491437/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 5ee8aa3..7d5f76b 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 @@ -19,6 +19,7 @@ package org.apache.marmotta.platform.sparql.webservices; import com.google.common.collect.Lists; import com.google.common.io.CharStreams; +import org.apache.commons.collections.EnumerationUtils; import org.apache.commons.lang3.StringUtils; import org.apache.marmotta.commons.http.ContentType; import org.apache.marmotta.commons.http.MarmottaHttpUtils; @@ -234,13 +235,15 @@ public class SparqlWebService { */ private Response select(String query, String resultType, HttpServletRequest request) { try { - String acceptHeader = StringUtils.defaultString(request.getHeader(ACCEPT), ""); + List acceptHeaders = EnumerationUtils.toList(request.getHeaders(ACCEPT)); if (StringUtils.isBlank(query)) { //empty query - if (acceptHeader.contains("html")) { - return Response.seeOther(new URI(configurationService.getServerUri() + "sparql/admin/squebi.html")).build(); - } else { - return Response.status(Status.ACCEPTED).entity("no SPARQL query specified").build(); + for(String acceptHeader : acceptHeaders) { + if (acceptHeader.contains("html")) { + return Response.seeOther(new URI(configurationService.getServerUri() + "sparql/admin/squebi.html")).build(); + } } + + return Response.status(Status.ACCEPTED).entity("no SPARQL query specified").build(); } else { //query duck typing QueryType queryType = sparqlService.getQueryType(QueryLanguage.SPARQL, query); @@ -249,7 +252,7 @@ public class SparqlWebService { if (resultType != null) { acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(resultType); } else { - acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(acceptHeader); + acceptedTypes = MarmottaHttpUtils.parseAcceptHeaders(acceptHeaders); } if (QueryType.TUPLE.equals(queryType)) { offeredTypes = MarmottaHttpUtils.parseQueryResultFormatList(TupleQueryResultWriterRegistry.getInstance().getKeys()); @@ -391,7 +394,7 @@ public class SparqlWebService { return Response.ok().build(); } else { if (resultType == null) { - List acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT)); + List acceptedTypes = MarmottaHttpUtils.parseAcceptHeaders(EnumerationUtils.toList(request.getHeaders(ACCEPT))); List offeredTypes = MarmottaHttpUtils.parseStringList(Lists.newArrayList("*/*", "text/html")); ContentType bestType = MarmottaHttpUtils.bestContentType(offeredTypes, acceptedTypes); if (bestType != null) { @@ -466,7 +469,7 @@ public class SparqlWebService { if (StringUtils.isBlank(request.getHeader(ACCEPT))) { acceptedTypes = Collections.singletonList(MarmottaHttpUtils.parseContentType(RDFXML.getDefaultMIMEType())); } else { - acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(request.getHeader(ACCEPT)); + acceptedTypes = MarmottaHttpUtils.parseAcceptHeaders(EnumerationUtils.toList(request.getHeaders(ACCEPT))); } ContentType _bestType = null; http://git-wip-us.apache.org/repos/asf/marmotta/blob/73491437/platform/marmotta-sparql/src/test/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebServiceTest.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-sparql/src/test/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebServiceTest.java b/platform/marmotta-sparql/src/test/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebServiceTest.java index ce12c00..f74b831 100644 --- a/platform/marmotta-sparql/src/test/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebServiceTest.java +++ b/platform/marmotta-sparql/src/test/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebServiceTest.java @@ -190,4 +190,18 @@ public class SparqlWebServiceTest { get("/sparql/select"); } + @Test + public void testMultipleAcceptHeaders() throws IOException, InterruptedException { + expect(). + log().ifError(). + statusCode(200). + contentType("application/rdf+json"). + given(). + header("Accept", "application/na"). + header("Accept", "application/rdf+json; q=1.0"). + param("query", "DESCRIBE "). + when(). + get("/sparql/select"); + } + }