You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2013/04/22 18:56:21 UTC

svn commit: r1470617 - in /lucene/dev/branches/branch_4x: ./ lucene/ lucene/tools/ lucene/tools/forbiddenApis/ solr/ solr/core/ solr/core/src/java/org/apache/solr/servlet/ solr/core/src/test/org/apache/solr/servlet/ solr/example/ solr/example/solr/coll...

Author: rmuir
Date: Mon Apr 22 16:56:20 2013
New Revision: 1470617

URL: http://svn.apache.org/r1470617
Log:
SOLR-2079: Add option to pass HttpServletRequest in the SolrQueryRequest context map

Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/lucene/   (props changed)
    lucene/dev/branches/branch_4x/lucene/tools/   (props changed)
    lucene/dev/branches/branch_4x/lucene/tools/forbiddenApis/servlet-api.txt
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
    lucene/dev/branches/branch_4x/solr/example/   (props changed)
    lucene/dev/branches/branch_4x/solr/example/solr/collection1/conf/solrconfig.xml

Modified: lucene/dev/branches/branch_4x/lucene/tools/forbiddenApis/servlet-api.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/tools/forbiddenApis/servlet-api.txt?rev=1470617&r1=1470616&r2=1470617&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/tools/forbiddenApis/servlet-api.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/tools/forbiddenApis/servlet-api.txt Mon Apr 22 16:56:20 2013
@@ -20,6 +20,8 @@ javax.servlet.ServletRequest#getParamete
 javax.servlet.ServletRequest#getParameterNames() 
 javax.servlet.ServletRequest#getParameterValues(java.lang.String) 
 
+javax.servlet.http.HttpServletRequest#getSession() @ Servlet API getter has side effect of creating sessions
+
 @defaultMessage Servlet API method is broken and slow in some environments (e.g., Jetty's UTF-8 readers)
 
 javax.servlet.ServletRequest#getReader()

Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1470617&r1=1470616&r2=1470617&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Mon Apr 22 16:56:20 2013
@@ -50,6 +50,9 @@ Other Changes
 
 * SOLR-4737: Update Guava to 14.0.1 (Mark Miller)
 
+* SOLR-2079: Add option to pass HttpServletRequest in the SolrQueryRequest context map.
+  (Tomás Fernández Löbbe via Robert Muir)
+
 ==================  4.3.0 ==================
 
 Versions of Major Components

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java?rev=1470617&r1=1470616&r2=1470617&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java Mon Apr 22 16:56:20 2013
@@ -72,7 +72,8 @@ public class SolrRequestParsers 
   private final boolean enableRemoteStreams;
   private StandardRequestParser standard;
   private boolean handleSelect = true;
-  
+  private boolean addHttpRequestToContext;
+
   /** Default instance for e.g. admin requests. Limits to 2 MB uploads and does not allow remote streams. */
   public static final SolrRequestParsers DEFAULT = new SolrRequestParsers();
   
@@ -86,6 +87,7 @@ public class SolrRequestParsers 
       multipartUploadLimitKB = formUploadLimitKB = Integer.MAX_VALUE; 
       enableRemoteStreams = true;
       handleSelect = true;
+      addHttpRequestToContext = false;
     } else {
       multipartUploadLimitKB = globalConfig.getInt( 
           "requestDispatcher/requestParsers/@multipartUploadLimitInKB", 2048 );
@@ -99,6 +101,9 @@ public class SolrRequestParsers 
       // Let this filter take care of /select?xxx format
       handleSelect = globalConfig.getBool( 
           "requestDispatcher/@handleSelect", true ); 
+      
+      addHttpRequestToContext = globalConfig.getBool( 
+          "requestDispatcher/requestParsers/@addHttpRequestToContext", false ); 
     }
     init(multipartUploadLimitKB, formUploadLimitKB);
   }
@@ -106,6 +111,7 @@ public class SolrRequestParsers 
   private SolrRequestParsers() {
     enableRemoteStreams = false;
     handleSelect = false;
+    addHttpRequestToContext = false;
     init(2048, 2048);
   }
 
@@ -139,6 +145,10 @@ public class SolrRequestParsers 
     // Handlers and login will want to know the path. If it contains a ':'
     // the handler could use it for RESTful URLs
     sreq.getContext().put( "path", path );
+    
+    if(addHttpRequestToContext) {
+      sreq.getContext().put("httpRequest", req);
+    }
     return sreq;
   }
   
@@ -342,6 +352,14 @@ public class SolrRequestParsers 
   public void setHandleSelect(boolean handleSelect) {
     this.handleSelect = handleSelect;
   }
+  
+  public boolean isAddRequestHeadersToContext() {
+    return addHttpRequestToContext;
+  }
+
+  public void setAddRequestHeadersToContext(boolean addRequestHeadersToContext) {
+    this.addHttpRequestToContext = addRequestHeadersToContext;
+  }
 }
 
 //-----------------------------------------------------------------

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java?rev=1470617&r1=1470616&r2=1470617&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java Mon Apr 22 16:56:20 2013
@@ -30,6 +30,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Vector;
 
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -314,4 +315,32 @@ public class SolrRequestParserTest exten
       assertEquals(500, solre.code());
     }
   }
+  
+  @Test
+  public void testAddHttpRequestToContext() throws Exception {
+    HttpServletRequest request = createMock(HttpServletRequest.class);
+    expect(request.getMethod()).andReturn("GET").anyTimes();
+    expect(request.getContentType()).andReturn( "application/x-www-form-urlencoded" ).anyTimes();
+    expect(request.getQueryString()).andReturn("q=title:solr").anyTimes();
+    Map<String, String> headers = new HashMap<String,String>();
+    headers.put("X-Forwarded-For", "10.0.0.1");
+    expect(request.getHeaderNames()).andReturn(new Vector<String>(headers.keySet()).elements()).anyTimes();
+    for(Map.Entry<String,String> entry:headers.entrySet()) {
+      Vector<String> v = new Vector<String>();
+      v.add(entry.getValue());
+      expect(request.getHeaders(entry.getKey())).andReturn(v.elements()).anyTimes();
+    }
+    replay(request);
+    
+    SolrRequestParsers parsers = new SolrRequestParsers(h.getCore().getSolrConfig());
+    assertFalse(parsers.isAddRequestHeadersToContext());
+    SolrQueryRequest solrReq = parsers.parse(h.getCore(), "/select", request);
+    assertFalse(solrReq.getContext().containsKey("httpRequest"));
+    
+    parsers.setAddRequestHeadersToContext(true);
+    solrReq = parsers.parse(h.getCore(), "/select", request);
+    assertEquals(request, solrReq.getContext().get("httpRequest"));
+    assertEquals("10.0.0.1", ((HttpServletRequest)solrReq.getContext().get("httpRequest")).getHeaders("X-Forwarded-For").nextElement());
+    
+  }
 }

Modified: lucene/dev/branches/branch_4x/solr/example/solr/collection1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/example/solr/collection1/conf/solrconfig.xml?rev=1470617&r1=1470616&r2=1470617&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/example/solr/collection1/conf/solrconfig.xml (original)
+++ lucene/dev/branches/branch_4x/solr/example/solr/collection1/conf/solrconfig.xml Mon Apr 22 16:56:20 2013
@@ -700,6 +700,13 @@
          POST. You can use POST to pass request parameters not
          fitting into the URL.
          
+         addHttpRequestToContext - if set to true, it will instruct
+         the requestParsers to include the original HttpServletRequest
+         object in the context map of the SolrQueryRequest under the 
+         key "httpRequest". It will not be used by any of the existing
+         Solr components, but may be useful when developing custom 
+         plugins.
+         
          *** WARNING ***
          The settings below authorize Solr to fetch remote files, You
          should make sure your system has some authentication before
@@ -708,7 +715,8 @@
       --> 
     <requestParsers enableRemoteStreaming="true" 
                     multipartUploadLimitInKB="2048000"
-                    formdataUploadLimitInKB="2048"/>
+                    formdataUploadLimitInKB="2048"
+                    addHttpRequestToContext="false"/>
 
     <!-- HTTP Caching