You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by dg...@apache.org on 2015/04/07 10:10:25 UTC

marmotta git commit: #marmotta-606

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 <dg...@gmail.com>
Authored: Tue Apr 7 10:10:10 2015 +0200
Committer: Dietmar Glachs <dg...@gmail.com>
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;