You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2017/10/10 15:31:40 UTC

svn commit: r1811713 - in /velocity/tools/trunk: src/changes/changes.xml velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java

Author: cbrisson
Date: Tue Oct 10 15:31:40 2017
New Revision: 1811713

URL: http://svn.apache.org/viewvc?rev=1811713&view=rev
Log:
[tools] ImportTool: query string parameters of local url inclusion should overwrite original request ones ()

Modified:
    velocity/tools/trunk/src/changes/changes.xml
    velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java
    velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java

Modified: velocity/tools/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/src/changes/changes.xml?rev=1811713&r1=1811712&r2=1811713&view=diff
==============================================================================
--- velocity/tools/trunk/src/changes/changes.xml (original)
+++ velocity/tools/trunk/src/changes/changes.xml Tue Oct 10 15:31:40 2017
@@ -24,13 +24,16 @@
     <title>Changelog</title>
   </properties>
   <body>
-
     <release version="3.0-SNAPSHOT" date="In Subversion">
+      <action type="fix" dev="cbrisson">
+        Removed deprecated components velocity-tools-uberjar and velocity-tools-assembly
+      </action>
       <action type="add" dev="cbrisson">
         ImportTool reenginering:
         <ul>
           <li>the ImportSupport utility class has been splitted between o.a.v.generic.ImportSupport and o.a.v.view.ViewImportSupport</li>
           <li>the ImportTool now has a generic version (for remote URLs import) and a view version (for local URLs import) which cannot use remote URLs in safe mode</li>
+          <li>the local URLs import respects the 3.1 servlets specification: query parameters of the included URL do overwrite original ones</li>
         </ul>
       </action>
       <action type="add" dev="cbrisson">

Modified: velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java?rev=1811713&r1=1811712&r2=1811713&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java (original)
+++ velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ViewImportSupport.java Tue Oct 10 15:31:40 2017
@@ -29,7 +29,11 @@ import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.util.Locale;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -38,6 +42,7 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
 
+import org.apache.velocity.tools.Toolbox;
 import org.apache.velocity.tools.generic.ImportSupport;
 import org.apache.velocity.tools.generic.ValueParser;
 import org.slf4j.Logger;
@@ -183,6 +188,14 @@ public class ViewImportSupport extends I
         // strip the session id from the url
         url = stripSession(url);
 
+        // According to the 3.1 Servlet API specification, the query string parameters of the URL to include
+        // take *precedence* over the original query string parameters. It means that:
+        // - we must merge both query strings
+        // - we must set aside the cached request toolbox during the include
+        url = mergeQueryStrings(url);
+        Object parentToolbox = request.getAttribute(Toolbox.KEY);
+        request.removeAttribute(Toolbox.KEY);
+        
         // from this context, get a dispatcher
         RequestDispatcher rd = application.getRequestDispatcher(url);
         if (rd == null)
@@ -207,6 +220,10 @@ public class ViewImportSupport extends I
             throw new IOException("Problem importing the local URL \"" + url + "\": " + se.getMessage(), se);
 
         }
+        finally
+        {
+            request.setAttribute(Toolbox.KEY, parentToolbox);
+        }
         /* let RuntimeExceptions go through */
 
         // disallow inappropriate response codes per JSTL spec
@@ -491,6 +508,57 @@ public class ViewImportSupport extends I
     }
 
     //*********************************************************************
+    // Merge query strings
+
+    /**
+     * Merge original parameters into the query string
+     *
+     * @param url the url to include
+     * @return the merged url
+     */
+    protected String mergeQueryStrings(String url)
+    {
+        Map<String, String[]> originalParameters = request.getParameterMap();
+        if (originalParameters.size() > 0)
+        {
+            StringBuilder builder = new StringBuilder(url);
+            Set<String> newParameterNames = new HashSet<String>();
+            int qm = url.indexOf('?');
+            if (qm != -1)
+            {
+                
+                String[] newParameters = url.substring(qm + 1).split("&");
+                for (String newParam : newParameters)
+                {
+                    int eq = newParam.indexOf('=');
+                    if (eq != -1)
+                    {
+                        newParam = newParam.substring(eq);
+                    }
+                    newParameterNames.add(newParam);
+                }
+            }
+            char separator = ( qm == -1 ? '?' : '&' );
+            for (Map.Entry<String, String[]> entry : originalParameters.entrySet())
+            {
+                String key = entry.getKey();
+                if (!newParameterNames.contains(key))
+                {
+                    key = URLEncoder.encode(key);
+                    for (String value : entry.getValue())
+                    {
+                        builder.append(separator);
+                        separator = '&';
+                        builder.append(key).append('=').append(URLEncoder.encode(value));
+                    }
+                }
+            }
+            url = builder.toString();
+        }
+        return url;
+    }
+
+    //*********************************************************************
     // Fetch local resource
 
     @Override

Modified: velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java?rev=1811713&r1=1811712&r2=1811713&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java (original)
+++ velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/test/blackbox/RequestAdaptor.java Tue Oct 10 15:31:40 2017
@@ -158,6 +158,18 @@ public class RequestAdaptor implements I
         {
             return new IteratorEnumeration(_params.keySet().iterator());
         }
+        else if("getAttribute".equals(methodName))
+        {
+            return null;
+        }
+        else if("setAttribute".equals(methodName))
+        {
+            return null;
+        }
+        else if("removeAttribute".equals(methodName))
+        {
+            return null;
+        }
         else if("getSession".equals(methodName))
         {
             return null;