You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2013/07/28 01:16:20 UTC
svn commit: r1507743 - in /lucene/dev/branches/branch_4x: ./ solr/ solr/core/
solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
Author: uschindler
Date: Sat Jul 27 23:16:20 2013
New Revision: 1507743
URL: http://svn.apache.org/r1507743
Log:
Merged revision(s) 1507742 from lucene/dev/trunk:
SOLR-5083: Move JDK-1.0-style hidden classes into inner classes of SolrRequestParsers (to prevent uptodate javac bugs)
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/solr/ (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
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=1507743&r1=1507742&r2=1507743&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 Sat Jul 27 23:16:20 2013
@@ -361,281 +361,272 @@ public class SolrRequestParsers
public void setAddRequestHeadersToContext(boolean addRequestHeadersToContext) {
this.addHttpRequestToContext = addRequestHeadersToContext;
}
-}
-//-----------------------------------------------------------------
-//-----------------------------------------------------------------
+ //-----------------------------------------------------------------
+ //-----------------------------------------------------------------
-// I guess we don't really even need the interface, but i'll keep it here just for kicks
-interface SolrRequestParser
-{
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception;
-}
-
-
-//-----------------------------------------------------------------
-//-----------------------------------------------------------------
-
-/**
- * The simple parser just uses the params directly, does not support POST URL-encoded forms
- */
-class SimpleRequestParser implements SolrRequestParser
-{
- @Override
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ // I guess we don't really even need the interface, but i'll keep it here just for kicks
+ interface SolrRequestParser
{
- return SolrRequestParsers.parseQueryString(req.getQueryString());
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception;
}
-}
-/**
- * Wrap an HttpServletRequest as a ContentStream
- */
-class HttpRequestContentStream extends ContentStreamBase
-{
- private final HttpServletRequest req;
-
- public HttpRequestContentStream( HttpServletRequest req ) {
- this.req = req;
-
- contentType = req.getContentType();
- // name = ???
- // sourceInfo = ???
-
- String v = req.getHeader( "Content-Length" );
- if( v != null ) {
- size = Long.valueOf( v );
+
+ //-----------------------------------------------------------------
+ //-----------------------------------------------------------------
+
+ /**
+ * The simple parser just uses the params directly, does not support POST URL-encoded forms
+ */
+ static class SimpleRequestParser implements SolrRequestParser
+ {
+ @Override
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ {
+ return parseQueryString(req.getQueryString());
}
}
- @Override
- public InputStream getStream() throws IOException {
- return req.getInputStream();
+ /**
+ * Wrap an HttpServletRequest as a ContentStream
+ */
+ static class HttpRequestContentStream extends ContentStreamBase
+ {
+ private final HttpServletRequest req;
+
+ public HttpRequestContentStream( HttpServletRequest req ) {
+ this.req = req;
+
+ contentType = req.getContentType();
+ // name = ???
+ // sourceInfo = ???
+
+ String v = req.getHeader( "Content-Length" );
+ if( v != null ) {
+ size = Long.valueOf( v );
+ }
+ }
+
+ @Override
+ public InputStream getStream() throws IOException {
+ return req.getInputStream();
+ }
}
-}
-/**
- * Wrap a FileItem as a ContentStream
- */
-class FileItemContentStream extends ContentStreamBase
-{
- private final FileItem item;
-
- public FileItemContentStream( FileItem f )
+ /**
+ * Wrap a FileItem as a ContentStream
+ */
+ static class FileItemContentStream extends ContentStreamBase
{
- item = f;
- contentType = item.getContentType();
- name = item.getName();
- sourceInfo = item.getFieldName();
- size = item.getSize();
- }
+ private final FileItem item;
- @Override
- public InputStream getStream() throws IOException {
- return item.getInputStream();
+ public FileItemContentStream( FileItem f )
+ {
+ item = f;
+ contentType = item.getContentType();
+ name = item.getName();
+ sourceInfo = item.getFieldName();
+ size = item.getSize();
+ }
+
+ @Override
+ public InputStream getStream() throws IOException {
+ return item.getInputStream();
+ }
}
-}
-/**
- * The raw parser just uses the params directly
- */
-class RawRequestParser implements SolrRequestParser
-{
- @Override
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ /**
+ * The raw parser just uses the params directly
+ */
+ static class RawRequestParser implements SolrRequestParser
{
- streams.add( new HttpRequestContentStream( req ) );
- return SolrRequestParsers.parseQueryString( req.getQueryString() );
+ @Override
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ {
+ streams.add( new HttpRequestContentStream( req ) );
+ return parseQueryString( req.getQueryString() );
+ }
}
-}
-/**
- * Extract Multipart streams
- */
-class MultipartRequestParser implements SolrRequestParser
-{
- private final int uploadLimitKB;
-
- public MultipartRequestParser( int limit )
- {
- uploadLimitKB = limit;
- }
-
- @Override
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ /**
+ * Extract Multipart streams
+ */
+ static class MultipartRequestParser implements SolrRequestParser
{
- if( !ServletFileUpload.isMultipartContent(req) ) {
- throw new SolrException( ErrorCode.BAD_REQUEST, "Not multipart content! "+req.getContentType() );
- }
+ private final int uploadLimitKB;
- MultiMapSolrParams params = SolrRequestParsers.parseQueryString( req.getQueryString() );
+ public MultipartRequestParser( int limit )
+ {
+ uploadLimitKB = limit;
+ }
- // Create a factory for disk-based file items
- DiskFileItemFactory factory = new DiskFileItemFactory();
-
- // Set factory constraints
- // TODO - configure factory.setSizeThreshold(yourMaxMemorySize);
- // TODO - configure factory.setRepository(yourTempDirectory);
-
- // Create a new file upload handler
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setSizeMax( ((long) uploadLimitKB) * 1024L );
-
- // Parse the request
- List items = upload.parseRequest(req);
- Iterator iter = items.iterator();
- while (iter.hasNext()) {
- FileItem item = (FileItem) iter.next();
-
- // If its a form field, put it in our parameter map
- if (item.isFormField()) {
- MultiMapSolrParams.addParam(
- item.getFieldName(),
- item.getString(), params.getMap() );
- }
- // Add the stream
- else {
- streams.add( new FileItemContentStream( item ) );
- }
+ @Override
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ {
+ if( !ServletFileUpload.isMultipartContent(req) ) {
+ throw new SolrException( ErrorCode.BAD_REQUEST, "Not multipart content! "+req.getContentType() );
+ }
+
+ MultiMapSolrParams params = parseQueryString( req.getQueryString() );
+
+ // Create a factory for disk-based file items
+ DiskFileItemFactory factory = new DiskFileItemFactory();
+
+ // Set factory constraints
+ // TODO - configure factory.setSizeThreshold(yourMaxMemorySize);
+ // TODO - configure factory.setRepository(yourTempDirectory);
+
+ // Create a new file upload handler
+ ServletFileUpload upload = new ServletFileUpload(factory);
+ upload.setSizeMax( ((long) uploadLimitKB) * 1024L );
+
+ // Parse the request
+ List items = upload.parseRequest(req);
+ Iterator iter = items.iterator();
+ while (iter.hasNext()) {
+ FileItem item = (FileItem) iter.next();
+
+ // If its a form field, put it in our parameter map
+ if (item.isFormField()) {
+ MultiMapSolrParams.addParam(
+ item.getFieldName(),
+ item.getString(), params.getMap() );
+ }
+ // Add the stream
+ else {
+ streams.add( new FileItemContentStream( item ) );
+ }
+ }
+ return params;
}
- return params;
}
-}
-/**
- * Extract application/x-www-form-urlencoded form data for POST requests
- */
-class FormDataRequestParser implements SolrRequestParser
-{
- private final int uploadLimitKB;
-
- public FormDataRequestParser( int limit )
+ /**
+ * Extract application/x-www-form-urlencoded form data for POST requests
+ */
+ static class FormDataRequestParser implements SolrRequestParser
{
- uploadLimitKB = limit;
- }
-
- @Override
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
- {
- if (!isFormData(req)) {
- throw new SolrException( ErrorCode.BAD_REQUEST, "Not application/x-www-form-urlencoded content: "+req.getContentType() );
- }
-
- final Map<String,String[]> map = new HashMap<String, String[]>();
+ private final int uploadLimitKB;
- // also add possible URL parameters and include into the map (parsed using UTF-8):
- final String qs = req.getQueryString();
- if (qs != null) {
- SolrRequestParsers.parseQueryString(qs, map);
+ public FormDataRequestParser( int limit )
+ {
+ uploadLimitKB = limit;
}
- // may be -1, so we check again later. But if its already greater we can stop processing!
- final long totalLength = req.getContentLength();
- final long maxLength = ((long) uploadLimitKB) * 1024L;
- if (totalLength > maxLength) {
- throw new SolrException(ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content length (" +
- totalLength + " bytes) exceeds upload limit of " + uploadLimitKB + " KB");
+ @Override
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ {
+ if (!isFormData(req)) {
+ throw new SolrException( ErrorCode.BAD_REQUEST, "Not application/x-www-form-urlencoded content: "+req.getContentType() );
+ }
+
+ final Map<String,String[]> map = new HashMap<String, String[]>();
+
+ // also add possible URL parameters and include into the map (parsed using UTF-8):
+ final String qs = req.getQueryString();
+ if (qs != null) {
+ parseQueryString(qs, map);
+ }
+
+ // may be -1, so we check again later. But if its already greater we can stop processing!
+ final long totalLength = req.getContentLength();
+ final long maxLength = ((long) uploadLimitKB) * 1024L;
+ if (totalLength > maxLength) {
+ throw new SolrException(ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content length (" +
+ totalLength + " bytes) exceeds upload limit of " + uploadLimitKB + " KB");
+ }
+
+ // get query String from request body, using the charset given in content-type:
+ final String cs = ContentStreamBase.getCharsetFromContentType(req.getContentType());
+ final Charset charset = (cs == null) ? IOUtils.CHARSET_UTF_8 : Charset.forName(cs);
+ InputStream in = null;
+ try {
+ in = req.getInputStream();
+ final long bytesRead = parseFormDataContent(FastInputStream.wrap(in), maxLength, charset, map);
+ if (bytesRead == 0L && totalLength > 0L) {
+ throw getParameterIncompatibilityException();
+ }
+ } catch (IOException ioe) {
+ throw new SolrException(ErrorCode.BAD_REQUEST, ioe);
+ } catch (IllegalStateException ise) {
+ throw (SolrException) getParameterIncompatibilityException().initCause(ise);
+ } finally {
+ IOUtils.closeWhileHandlingException(in);
+ }
+
+ return new MultiMapSolrParams(map);
}
- // get query String from request body, using the charset given in content-type:
- final String cs = ContentStreamBase.getCharsetFromContentType(req.getContentType());
- final Charset charset = (cs == null) ? IOUtils.CHARSET_UTF_8 : Charset.forName(cs);
- InputStream in = null;
- try {
- in = req.getInputStream();
- final long bytesRead = SolrRequestParsers.parseFormDataContent(FastInputStream.wrap(in), maxLength, charset, map);
- if (bytesRead == 0L && totalLength > 0L) {
- throw getParameterIncompatibilityException();
- }
- } catch (IOException ioe) {
- throw new SolrException(ErrorCode.BAD_REQUEST, ioe);
- } catch (IllegalStateException ise) {
- throw (SolrException) getParameterIncompatibilityException().initCause(ise);
- } finally {
- IOUtils.closeWhileHandlingException(in);
+ private SolrException getParameterIncompatibilityException() {
+ return new SolrException(ErrorCode.SERVER_ERROR,
+ "Solr requires that request parameters sent using application/x-www-form-urlencoded " +
+ "content-type can be read through the request input stream. Unfortunately, the " +
+ "stream was empty / not available. This may be caused by another servlet filter calling " +
+ "ServletRequest.getParameter*() before SolrDispatchFilter, please remove it."
+ );
}
- return new MultiMapSolrParams(map);
- }
-
- private SolrException getParameterIncompatibilityException() {
- return new SolrException(ErrorCode.SERVER_ERROR,
- "Solr requires that request parameters sent using application/x-www-form-urlencoded " +
- "content-type can be read through the request input stream. Unfortunately, the " +
- "stream was empty / not available. This may be caused by another servlet filter calling " +
- "ServletRequest.getParameter*() before SolrDispatchFilter, please remove it."
- );
- }
-
- public boolean isFormData(HttpServletRequest req) {
- String contentType = req.getContentType();
- if (contentType != null) {
- int idx = contentType.indexOf( ';' );
- if( idx > 0 ) { // remove the charset definition "; charset=utf-8"
- contentType = contentType.substring( 0, idx );
- }
- contentType = contentType.trim();
- if( "application/x-www-form-urlencoded".equalsIgnoreCase(contentType)) {
- return true;
+ public boolean isFormData(HttpServletRequest req) {
+ String contentType = req.getContentType();
+ if (contentType != null) {
+ int idx = contentType.indexOf( ';' );
+ if( idx > 0 ) { // remove the charset definition "; charset=utf-8"
+ contentType = contentType.substring( 0, idx );
+ }
+ contentType = contentType.trim();
+ if( "application/x-www-form-urlencoded".equalsIgnoreCase(contentType)) {
+ return true;
+ }
}
+ return false;
}
- return false;
}
-}
-/**
- * The default Logic
- */
-class StandardRequestParser implements SolrRequestParser
-{
- MultipartRequestParser multipart;
- RawRequestParser raw;
- FormDataRequestParser formdata;
-
- StandardRequestParser(MultipartRequestParser multi, RawRequestParser raw, FormDataRequestParser formdata)
+ /**
+ * The default Logic
+ */
+ static class StandardRequestParser implements SolrRequestParser
{
- this.multipart = multi;
- this.raw = raw;
- this.formdata = formdata;
- }
-
- @Override
- public SolrParams parseParamsAndFillStreams(
- final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
- {
- String method = req.getMethod().toUpperCase(Locale.ROOT);
- if ("GET".equals(method) || "HEAD".equals(method)
- || ("PUT".equals(method) && req.getRequestURI().contains("/schema"))) {
- return SolrRequestParsers.parseQueryString(req.getQueryString());
- }
- if ("POST".equals( method ) ) {
- if (formdata.isFormData(req)) {
- return formdata.parseParamsAndFillStreams(req, streams);
+ MultipartRequestParser multipart;
+ RawRequestParser raw;
+ FormDataRequestParser formdata;
+
+ StandardRequestParser(MultipartRequestParser multi, RawRequestParser raw, FormDataRequestParser formdata)
+ {
+ this.multipart = multi;
+ this.raw = raw;
+ this.formdata = formdata;
+ }
+
+ @Override
+ public SolrParams parseParamsAndFillStreams(
+ final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
+ {
+ String method = req.getMethod().toUpperCase(Locale.ROOT);
+ if ("GET".equals(method) || "HEAD".equals(method)
+ || ("PUT".equals(method) && req.getRequestURI().contains("/schema"))) {
+ return parseQueryString(req.getQueryString());
}
- if (ServletFileUpload.isMultipartContent(req)) {
- return multipart.parseParamsAndFillStreams(req, streams);
+ if ("POST".equals( method ) ) {
+ if (formdata.isFormData(req)) {
+ return formdata.parseParamsAndFillStreams(req, streams);
+ }
+ if (ServletFileUpload.isMultipartContent(req)) {
+ return multipart.parseParamsAndFillStreams(req, streams);
+ }
+ return raw.parseParamsAndFillStreams(req, streams);
}
- return raw.parseParamsAndFillStreams(req, streams);
+ throw new SolrException(ErrorCode.BAD_REQUEST, "Unsupported method: " + method + " for request " + req);
}
- throw new SolrException(ErrorCode.BAD_REQUEST, "Unsupported method: " + method + " for request " + req);
}
-}
-
-
-
-
-
-
-
-
-
+}
\ No newline at end of file
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=1507743&r1=1507742&r2=1507743&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 Sat Jul 27 23:16:20 2013
@@ -44,6 +44,10 @@ import org.apache.solr.common.params.Sol
import org.apache.solr.common.util.ContentStream;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.servlet.SolrRequestParsers.MultipartRequestParser;
+import org.apache.solr.servlet.SolrRequestParsers.FormDataRequestParser;
+import org.apache.solr.servlet.SolrRequestParsers.RawRequestParser;
+import org.apache.solr.servlet.SolrRequestParsers.StandardRequestParser;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;