From 89b08baab7b33547c555b833db19ba8746b75a4a Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Mon, 22 Apr 2013 16:44:16 +0000 Subject: [PATCH] SOLR-2079: Add option to pass HttpServletRequest in the SolrQueryRequest context map git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1470614 13f79535-47bb-0310-9956-ffa450edef68 --- lucene/tools/forbiddenApis/servlet-api.txt | 2 ++ solr/CHANGES.txt | 3 ++ .../solr/servlet/SolrRequestParsers.java | 20 ++++++++++++- .../solr/servlet/SolrRequestParserTest.java | 29 +++++++++++++++++++ .../solr/collection1/conf/solrconfig.xml | 10 ++++++- 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lucene/tools/forbiddenApis/servlet-api.txt b/lucene/tools/forbiddenApis/servlet-api.txt index 36715f11624..dc82e8fe45d 100644 --- a/lucene/tools/forbiddenApis/servlet-api.txt +++ b/lucene/tools/forbiddenApis/servlet-api.txt @@ -20,6 +20,8 @@ javax.servlet.ServletRequest#getParameterMap() 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() diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 76a63a8db80..18d497707d5 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -73,6 +73,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 diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java index 79346d286c3..7913b9c6f32 100644 --- a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java +++ b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java @@ -73,7 +73,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(); @@ -87,6 +88,7 @@ public class SolrRequestParsers multipartUploadLimitKB = formUploadLimitKB = Integer.MAX_VALUE; enableRemoteStreams = true; handleSelect = true; + addHttpRequestToContext = false; } else { multipartUploadLimitKB = globalConfig.getInt( "requestDispatcher/requestParsers/@multipartUploadLimitInKB", 2048 ); @@ -100,6 +102,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); } @@ -107,6 +112,7 @@ public class SolrRequestParsers private SolrRequestParsers() { enableRemoteStreams = false; handleSelect = false; + addHttpRequestToContext = false; init(2048, 2048); } @@ -140,6 +146,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; } @@ -343,6 +353,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; + } } //----------------------------------------------------------------- diff --git a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java index fb6d83f7a50..ea67de0d8cd 100644 --- a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java +++ b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java @@ -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 extends SolrTestCaseJ4 { 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 headers = new HashMap(); + headers.put("X-Forwarded-For", "10.0.0.1"); + expect(request.getHeaderNames()).andReturn(new Vector(headers.keySet()).elements()).anyTimes(); + for(Map.Entry entry:headers.entrySet()) { + Vector v = new Vector(); + 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()); + + } } diff --git a/solr/example/solr/collection1/conf/solrconfig.xml b/solr/example/solr/collection1/conf/solrconfig.xml index ea7ce7e86ff..c403ebe9f63 100755 --- a/solr/example/solr/collection1/conf/solrconfig.xml +++ b/solr/example/solr/collection1/conf/solrconfig.xml @@ -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 @@ --> + formdataUploadLimitInKB="2048" + addHttpRequestToContext="false"/>