You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2017/09/20 21:05:15 UTC

svn commit: r1809082 - in /sling/whiteboard/pauls/engine/src: main/java/org/apache/sling/engine/impl/ main/java/org/apache/sling/engine/impl/parameters/ main/java/org/apache/sling/engine/impl/request/ test/java/org/apache/sling/engine/impl/ test/java/o...

Author: pauls
Date: Wed Sep 20 21:05:14 2017
New Revision: 1809082

URL: http://svn.apache.org/viewvc?rev=1809082&view=rev
Log:
Support streaming of request body.

Removed:
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportConfigurer.java
Modified:
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplBase.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportFilter.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java
    sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
    sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplTest.java
    sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapperTest.java
    sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java
    sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/RequestDataTest.java

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java Wed Sep 20 21:05:14 2017
@@ -18,23 +18,19 @@
  */
 package org.apache.sling.engine.impl;
 
-import java.io.IOException;
-import java.net.URL;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.sling.api.request.RequestParameter;
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.auth.core.AuthenticationSupport;
 import org.apache.sling.commons.mime.MimeTypeService;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
-import org.apache.sling.engine.impl.request.RequestData;
 import org.apache.sling.engine.impl.request.SlingRequestProgressTracker;
 import org.osgi.service.http.context.ServletContextHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URL;
+
 /**
  * The <code>SlingHttpContext</code> implements the OSGi HttpContext used to
  * register the {@link SlingMainServlet} with the OSGi HttpService.
@@ -126,14 +122,8 @@ class SlingHttpContext extends ServletCo
         final AuthenticationSupport authenticator = this.authenticationSupport;
         if (authenticator != null) {
 
-            // SLING-559: ensure correct parameter handling according to
-            // ParameterSupport if path is configured to match
-            if (ParameterSupport.matches(request.getRequestURI())) {
-                request = ParameterSupport.getParameterSupportRequestWrapper(request);
-            }
-            else {
-                request = new SlingHttpServletRequestImplBase(request);
-            }
+            // ensure correct parameter handling
+           request = SlingHttpServletRequestImplBase.wrap(request);
 
             final boolean result = authenticator.handleSecurity(request, response);
             t.logTimer(timerName, "authenticator {0} returns {1}", authenticator, result);

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java Wed Sep 20 21:05:14 2017
@@ -20,51 +20,32 @@ package org.apache.sling.engine.impl;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestDispatcherOptions;
-import org.apache.sling.api.request.RequestParameter;
-import org.apache.sling.api.request.RequestParameterMap;
 import org.apache.sling.api.request.RequestPathInfo;
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.engine.impl.helper.NullResourceBundle;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
-import org.apache.sling.engine.impl.parameters.Util;
 import org.apache.sling.engine.impl.request.ContentData;
 import org.apache.sling.engine.impl.request.RequestData;
 import org.apache.sling.engine.impl.request.SlingRequestDispatcher;
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.useradmin.Authorization;
-import sun.misc.IOUtils;
 
 import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.Part;
 import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.security.Principal;
-import java.util.AbstractMap;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.ResourceBundle;
-import java.util.Set;
 
 public class SlingHttpServletRequestImpl extends SlingHttpServletRequestImplBase implements
         SlingHttpServletRequest {

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplBase.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplBase.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplBase.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplBase.java Wed Sep 20 21:05:14 2017
@@ -18,9 +18,11 @@
  */
 package org.apache.sling.engine.impl;
 
-import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestParameter;
 import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.engine.impl.parameters.ParameterMap;
+import org.apache.sling.engine.impl.parameters.ParameterSupport;
+import org.apache.sling.engine.impl.parameters.ParameterSupportHttpServletRequestWrapper;
 import org.apache.sling.engine.impl.parameters.Util;
 
 import javax.servlet.http.HttpServletRequest;
@@ -31,20 +33,75 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
-import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+
+import static org.apache.sling.engine.impl.parameters.ParameterSupport.SLING_UPLOADMODE_HEADER;
+import static org.apache.sling.engine.impl.parameters.ParameterSupport.STREAM_UPLOAD;
+import static org.apache.sling.engine.impl.parameters.ParameterSupport.UPLOADMODE_PARAM;
 
 public class SlingHttpServletRequestImplBase extends HttpServletRequestWrapper {
+    public static final String MARKER = SlingHttpServletRequestImplBase.class.getName();
+
+    private final Map<String, RequestParameter[]> postQueryMap;
+
+    public static HttpServletRequest wrap(HttpServletRequest request) {
+        if (ParameterSupport.matches(request.getRequestURI()) || STREAM_UPLOAD.equals(request.getHeader(SLING_UPLOADMODE_HEADER))) {
+            request.setAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING, "true");
+            return new ParameterSupportHttpServletRequestWrapper(request);
+        }
+        else {
+            SlingHttpServletRequestImplBase wrapper = new SlingHttpServletRequestImplBase(request);
+            RequestParameter[] rp = wrapper.postQueryMap.get(UPLOADMODE_PARAM);
+            if ( rp != null && rp.length == 1 && STREAM_UPLOAD.equals(rp[0].getString())) {
+                request.setAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING, "true");
+                return new ParameterSupportHttpServletRequestWrapper(request);
+            }
+            else {
+                return wrapper;
+            }
+        }
+    }
 
     public SlingHttpServletRequestImplBase(HttpServletRequest request) {
         super(request);
+        Map<String, RequestParameter[]> cached = (Map<String, RequestParameter[]>) request.getAttribute(MARKER);
+        if (cached == null) {
+            if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
+                final String query = request.getQueryString();
+                if (query != null && !query.isEmpty()) {
+                    String encoding = request.getCharacterEncoding();
+                    if (encoding == null) {
+                        encoding = Util.ENCODING_DIRECT;
+                    }
+                    ParameterMap parameters = new ParameterMap();
+                    InputStream input = Util.toInputStream(query);
+                    try {
+                        Util.parseQueryString(input, encoding, parameters, false);
+                    } catch (IOException e) {
+                        // TODO: log this or something
+                        parameters.clear();
+                    }
+                    cached = new LinkedHashMap<>();
+                    for (String name : parameters.keySet()) {
+                        cached.put(name, parameters.getValues(name));
+                    }
+                } else {
+                    cached = Collections.EMPTY_MAP;
+                }
+            }
+            else {
+                cached = Collections.EMPTY_MAP;
+            }
+        }
+        postQueryMap = cached;
+        request.setAttribute(MARKER, postQueryMap);
     }
 
     @Override
@@ -109,6 +166,10 @@ public class SlingHttpServletRequestImpl
         if (getContentType() != null && getContentType().startsWith("multipart/form-data")) {
             try {
                 List<RequestParameter> result = new ArrayList<>();
+                RequestParameter[] queryParams = postQueryMap.get(name);
+                if (queryParams != null) {
+                    result.addAll(Arrays.asList(queryParams));
+                }
                 for (Part part : getParts()) {
                     if (part.getName().equals(name)) {
                         result.add(new PartRequestParameterImpl(name, part));
@@ -149,6 +210,11 @@ public class SlingHttpServletRequestImpl
 
         if (getContentType() != null && getContentType().startsWith("multipart/form-data")) {
             try {
+                for (String name : postQueryMap.keySet()) {
+                    if (!result.containsKey(name)) {
+                        result.put(name, getRequestParameters(name));
+                    }
+                }
                 for (Part part : getParts()) {
                     if (!result.containsKey(part.getName())) {
                         result.put(part.getName(), getRequestParameters(part.getName()));
@@ -173,25 +239,8 @@ public class SlingHttpServletRequestImpl
      */
     public List<RequestParameter> getRequestParameterList() {
         List<RequestParameter> result = new ArrayList<>();
-        if (getContentType().startsWith("multipart/form-data")) {
-            try {
-                for (Part part : getParts()) {
-                    RequestParameter[] params = getRequestParameters(part.getName());
-                    if (params != null) {
-                        result.addAll(Arrays.asList(params));
-                    }
-                }
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-        else {
-            for (Enumeration<String> names = getRequest().getParameterNames(); names.hasMoreElements(); ) {
-                RequestParameter[] params = getRequestParameters(names.nextElement());
-                if (params != null) {
-                    result.addAll(Arrays.asList(params));
-                }
-            }
+        for (RequestParameter[] params : getRequestParameterMap().values()) {
+            result.addAll(Arrays.asList(params));
         }
         return result;
     }

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Wed Sep 20 21:05:14 2017
@@ -18,23 +18,6 @@
  */
 package org.apache.sling.engine.impl;
 
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.annotation.MultipartConfig;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.sling.api.adapter.AdapterManager;
 import org.apache.sling.api.request.SlingRequestEvent;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -68,6 +51,22 @@ import org.osgi.service.metatype.annotat
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.GenericServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.MultipartConfig;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
 /**
  * The <code>SlingMainServlet</code>
  */

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java Wed Sep 20 21:05:14 2017
@@ -18,24 +18,6 @@
  */
 package org.apache.sling.engine.impl;
 
-import static org.apache.sling.api.SlingConstants.ERROR_SERVLET_NAME;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.security.AccessControlException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.UnavailableException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
@@ -60,6 +42,23 @@ import org.apache.sling.engine.servlets.
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.FilterChain;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.UnavailableException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.security.AccessControlException;
+
+import static org.apache.sling.api.SlingConstants.ERROR_SERVLET_NAME;
+
 public class SlingRequestProcessorImpl implements SlingRequestProcessor {
 
     /** default log */

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java Wed Sep 20 21:05:14 2017
@@ -43,7 +43,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.regex.Pattern;
 
 public class ParameterSupport {
 

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportFilter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportFilter.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportFilter.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/RequestParameterSupportFilter.java Wed Sep 20 21:05:14 2017
@@ -39,13 +39,13 @@ import javax.servlet.http.HttpServletReq
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.regex.Pattern;
 
 @Component(
         name = RequestParameterSupportFilter.PID,
         property = {
                 Constants.SERVICE_RANKING + ":Integer=" + Integer.MAX_VALUE,
-                "osgi.http.whiteboard.context.select=(osgi.http.whiteboard.context.name=org.apache.sling)"
+                "osgi.http.whiteboard.context.select=(osgi.http.whiteboard.context.name=org.apache.sling)",
+                "osgi.http.whiteboard.filter.pattern=/"
         },
         service = Filter.class)
 @Designate(ocd=RequestParameterSupportFilter.Config.class)
@@ -58,9 +58,7 @@ public class RequestParameterSupportFilt
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-        if (request instanceof HttpServletRequest) {
-            log.info("Request: " + ((HttpServletRequest) request).getRequestURI());
-
+        if ("true".equals(request.getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING))) {
             chain.doFilter(ParameterSupport.getParameterSupportRequestWrapper((HttpServletRequest) request), response);
         }
         else {
@@ -123,9 +121,10 @@ public class RequestParameterSupportFilt
 
         @AttributeDefinition(
                 name = "Path patterns",
-                description = "Requests with a path matching the pattern will get parameter support - default is null (i.e., none)"
+                description = "Requests with a path matching the pattern will get request parameter ordering and streaming via request parameter support " +
+                        "- default is null (i.e., none)"
         )
-        String[] osgi_http_whiteboard_filter_pattern();
+        String[] patterns();
     }
 
     static final String PID = "org.apache.sling.engine.parameters";
@@ -147,7 +146,7 @@ public class RequestParameterSupportFilt
         final long maxFileSize = config.file_max();
         final int fileSizeThreshold = config.file_threshold();
         final boolean checkAddParameters = config.sling_default_parameter_checkForAdditionalContainerParameters();
-        String[] pattern = config.osgi_http_whiteboard_filter_pattern();
+        String[] patterns = config.patterns();
 
         if (log.isInfoEnabled()) {
             log.info("Default Character Encoding: {}", fixEncoding);
@@ -157,13 +156,13 @@ public class RequestParameterSupportFilt
             log.info("Maximum File Size: {}", maxFileSize);
             log.info("Tempory File Creation Threshold: {}", fileSizeThreshold);
             log.info("Check for additional container parameters: {}", checkAddParameters);
-            log.info("Patterns: {}", pattern != null ? Arrays.asList(pattern) : null);
+            log.info("Patterns: {}", patterns != null ? Arrays.asList(patterns) : null);
         }
 
         Util.setDefaultFixEncoding(fixEncoding);
         ParameterMap.setMaxParameters(maxParams);
         ParameterSupport.configure(maxRequestSize, fileLocation, maxFileSize,
-                fileSizeThreshold, checkAddParameters, pattern);
+                fileSizeThreshold, checkAddParameters, patterns);
     }
 
     private String getFileLocation(String fileLocation) {

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java Wed Sep 20 21:05:14 2017
@@ -103,7 +103,7 @@ public class Util {
         return data;
     }
 
-    static InputStream toInputStream(String source) {
+    public static InputStream toInputStream(String source) {
         byte[] data = fromIdentityEncodedString(source);
         return new ByteArrayInputStream(data);
     }

Modified: sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java (original)
+++ sling/whiteboard/pauls/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java Wed Sep 20 21:05:14 2017
@@ -18,24 +18,6 @@
  */
 package org.apache.sling.engine.impl.request;
 
-import static org.apache.sling.api.SlingConstants.SLING_CURRENT_SERVLET_NAME;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletRequestWrapper;
-import javax.servlet.ServletResponse;
-import javax.servlet.ServletResponseWrapper;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.request.RecursionTooDeepException;
@@ -58,6 +40,23 @@ import org.apache.sling.engine.impl.adap
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletResponseWrapper;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+
+import static org.apache.sling.api.SlingConstants.SLING_CURRENT_SERVLET_NAME;
+
 /**
  * The <code>RequestData</code> class provides access to objects which are set
  * on a Servlet Request wide basis such as the repository session, the

Modified: sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplTest.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplTest.java (original)
+++ sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/SlingHttpServletRequestImplTest.java Wed Sep 20 21:05:14 2017
@@ -19,9 +19,11 @@
 package org.apache.sling.engine.impl;
 
 import java.security.Principal;
+import java.util.Collections;
 
 import javax.servlet.http.HttpServletRequest;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.apache.sling.engine.impl.request.RequestData;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -43,6 +45,15 @@ public class SlingHttpServletRequestImpl
         final HttpServletRequest servletRequest = context.mock(HttpServletRequest.class);
         
         context.checking(new Expectations() {{
+            ignoring(servletRequest).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(servletRequest).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(servletRequest).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(servletRequest).getContentType();
+            will(returnValue(null));
+
             one(servletRequest).getServletPath();
             will(returnValue("/path"));
             allowing(servletRequest).getPathInfo();
@@ -70,6 +81,15 @@ public class SlingHttpServletRequestImpl
         final HttpServletRequest servletRequest = context.mock(HttpServletRequest.class);
         
         context.checking(new Expectations() {{
+            ignoring(servletRequest).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(servletRequest).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(servletRequest).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(servletRequest).getContentType();
+            will(returnValue(null));
+
             one(servletRequest).getServletPath();
             will(returnValue("/path"));
             allowing(servletRequest).getPathInfo();
@@ -97,6 +117,15 @@ public class SlingHttpServletRequestImpl
         final HttpServletRequest servletRequest = context.mock(HttpServletRequest.class);
         
         context.checking(new Expectations() {{
+            ignoring(servletRequest).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(servletRequest).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(servletRequest).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(servletRequest).getContentType();
+            will(returnValue(null));
+
             one(servletRequest).getServletPath();
             will(returnValue("/path"));
             allowing(servletRequest).getPathInfo();

Modified: sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapperTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapperTest.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapperTest.java (original)
+++ sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapperTest.java Wed Sep 20 21:05:14 2017
@@ -30,8 +30,10 @@ import javax.servlet.http.HttpServletRes
 import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.apache.sling.engine.impl.SlingHttpServletRequestImpl;
+import org.apache.sling.engine.impl.SlingHttpServletRequestImplBase;
 import org.apache.sling.engine.impl.SlingHttpServletResponseImpl;
 import org.apache.sling.engine.impl.helper.ExternalServletContextWrapper.RequestDispatcherWrapper;
+import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.integration.junit4.JMock;
@@ -39,6 +41,8 @@ import org.jmock.integration.junit4.JUni
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Collections;
+
 @RunWith(JMock.class)
 public class ExternalServletContextWrapperTest {
     Mockery context = new JUnit4Mockery();
@@ -111,6 +115,15 @@ public class ExternalServletContextWrapp
         final HttpServletRequest req = context.mock(HttpServletRequest.class);
         
         context.checking(new Expectations(){{
+            ignoring(req).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(req).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(req).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(req).getContentType();
+            will(returnValue(null));
+
             allowing(req).getServletPath();
             will(returnValue("/"));
             allowing(req).getPathInfo();
@@ -136,6 +149,15 @@ public class ExternalServletContextWrapp
         final HttpServletRequest req = context.mock(HttpServletRequest.class);
         
         context.checking(new Expectations(){{
+            ignoring(req).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(req).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(req).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(req).getContentType();
+            will(returnValue(null));
+
             allowing(req).getServletPath();
             will(returnValue("/"));
             allowing(req).getPathInfo();

Modified: sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java (original)
+++ sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java Wed Sep 20 21:05:14 2017
@@ -18,12 +18,15 @@ package org.apache.sling.engine.impl.req
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.engine.impl.SlingHttpServletRequestImplBase;
+import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Before;
@@ -73,6 +76,15 @@ public class InitResourceTest {
         resourceResolver = context.mock(ResourceResolver.class);
 
         context.checking(new Expectations() {{
+            ignoring(req).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(req).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(req).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(req).getContentType();
+            will(returnValue(null));
+
             allowing(req).getRequestURL();
             will(returnValue(new StringBuffer(requestURL)));
 

Modified: sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/RequestDataTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/RequestDataTest.java?rev=1809082&r1=1809081&r2=1809082&view=diff
==============================================================================
--- sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/RequestDataTest.java (original)
+++ sling/whiteboard/pauls/engine/src/test/java/org/apache/sling/engine/impl/request/RequestDataTest.java Wed Sep 20 21:05:14 2017
@@ -30,13 +30,17 @@ import org.apache.sling.api.SlingHttpSer
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.api.request.TooManyCallsException;
 import org.apache.sling.engine.impl.SlingHttpServletRequestImpl;
+import org.apache.sling.engine.impl.SlingHttpServletRequestImplBase;
 import org.apache.sling.engine.impl.SlingHttpServletResponseImpl;
+import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.legacy.ClassImposteriser;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Collections;
+
 public class RequestDataTest {
 
     private Mockery context;
@@ -60,6 +64,15 @@ public class RequestDataTest {
         final ServletConfig servletConfig = context.mock(ServletConfig.class);
 
         context.checking(new Expectations() {{
+            ignoring(req).getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
+
+            ignoring(req).getAttribute(SlingHttpServletRequestImplBase.MARKER);
+            will(returnValue(null));
+            ignoring(req).setAttribute(SlingHttpServletRequestImplBase.MARKER, Collections.EMPTY_MAP);
+
+            ignoring(req).getContentType();
+            will(returnValue(null));
+
             allowing(req).getServletPath();
             will(returnValue("/"));