You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2009/04/03 13:33:58 UTC

svn commit: r761626 - in /jakarta/jmeter/trunk: src/protocol/http/org/apache/jmeter/protocol/http/modifier/ src/protocol/http/org/apache/jmeter/protocol/http/parser/ src/protocol/http/org/apache/jmeter/protocol/http/sampler/ src/protocol/http/org/apach...

Author: sebb
Date: Fri Apr  3 11:33:57 2009
New Revision: 761626

URL: http://svn.apache.org/viewvc?rev=761626&view=rev
Log:
Bug 46690 - handling of 302 redirects with invalid relative paths.
JMeter now removes extraneous leading "../" segments (as do many browsers)

Modified:
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/modifier/AnchorModifier.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/URLCollection.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
    jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/TestHTTPUtils.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/modifier/AnchorModifier.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/modifier/AnchorModifier.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/modifier/AnchorModifier.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/modifier/AnchorModifier.java Fri Apr  3 11:33:57 2009
@@ -34,6 +34,7 @@
 import org.apache.jmeter.protocol.http.parser.HtmlParsingUtils;
 import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jmeter.protocol.http.util.HTTPConstants;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.Sampler;
@@ -184,7 +185,7 @@
                 continue; // No point trying these
             }
             try {
-                HTTPSamplerBase newUrl = HtmlParsingUtils.createUrlFromAnchor(hrefStr, new URL(result.getURL(), base));
+                HTTPSamplerBase newUrl = HtmlParsingUtils.createUrlFromAnchor(hrefStr, ConversionUtils.makeRelativeURL(result.getURL(), base));
                 newUrl.setMethod(HTTPConstants.GET);
                 if (log.isDebugEnabled()) {
                     log.debug("Potential <a href> match: " + newUrl);
@@ -217,7 +218,7 @@
            String hrefStr = namedItem.getNodeValue();
            try {
                HTTPSamplerBase newUrl = HtmlParsingUtils.createUrlFromAnchor(
-                       hrefStr, new URL(result.getURL(), base));
+                       hrefStr, ConversionUtils.makeRelativeURL(result.getURL(), base));
                newUrl.setMethod(HTTPConstants.GET);
                if (log.isDebugEnabled()) {
                    log.debug("Potential <frame src> match: " + newUrl);

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java Fri Apr  3 11:33:57 2009
@@ -22,6 +22,7 @@
 import java.net.URL;
 import java.util.Iterator;
 
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 import org.htmlparser.Node;
@@ -131,7 +132,7 @@
                 try {
                     if (!baseref.equals(""))// Bugzilla 30713
                     {
-                        baseUrl.url = new URL(baseUrl.url, baseHref.getBaseUrl());
+                        baseUrl.url = ConversionUtils.makeRelativeURL(baseUrl.url, baseHref.getBaseUrl());
                     }
                 } catch (MalformedURLException e1) {
                     throw new HTMLParseException(e1);

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java Fri Apr  3 11:33:57 2009
@@ -30,6 +30,7 @@
 import org.apache.jmeter.config.Arguments;
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory;
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jmeter.testelement.property.PropertyIterator;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
@@ -260,7 +261,7 @@
         if (log.isDebugEnabled()) {
             log.debug("Creating URL from Anchor: " + parsedUrlString + ", base: " + context);
         }
-        URL url = new URL(context, parsedUrlString);
+        URL url = ConversionUtils.makeRelativeURL(context, parsedUrlString);
         HTTPSamplerBase sampler =HTTPSamplerFactory.newInstance();
         sampler.setDomain(url.getHost());
         sampler.setProtocol(url.getProtocol());

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java Fri Apr  3 11:33:57 2009
@@ -23,6 +23,7 @@
 import java.net.URL;
 import java.util.Iterator;
 
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 import org.w3c.dom.Document;
@@ -102,7 +103,7 @@
                 String tmp = getValue(attrs, ATT_HREF);
                 if (tmp != null) {
                     try {
-                        baseUrl = new URL(baseUrl, tmp);
+                        baseUrl = ConversionUtils.makeRelativeURL(baseUrl, tmp);
                     } catch (MalformedURLException e) {
                         throw new HTMLParseException(e);
                     }

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java Fri Apr  3 11:33:57 2009
@@ -22,6 +22,7 @@
 import java.net.URL;
 import java.util.Iterator;
 
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
@@ -165,7 +166,7 @@
                         log.debug("new baseUrl: " + s + " - " + baseUrl.toString());
                     }
                     try {
-                        baseUrl = new URL(baseUrl, s);
+                        baseUrl = ConversionUtils.makeRelativeURL(baseUrl, s);
                     } catch (MalformedURLException e) {
                         // Doesn't even look like a URL?
                         // Maybe it isn't: Ignore the exception.

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/URLCollection.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/URLCollection.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/URLCollection.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/parser/URLCollection.java Fri Apr  3 11:33:57 2009
@@ -24,6 +24,7 @@
 import java.util.Iterator;
 
 import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 
 /**
  * Collection class designed for handling URLs
@@ -91,7 +92,7 @@
         url=StringEscapeUtils.unescapeXml(url);
         boolean b = false;
         try {
-            b = this.add(new URL(baseUrl, url));
+            b = this.add(ConversionUtils.makeRelativeURL(baseUrl, url));
         } catch (MalformedURLException mfue) {
             // TODO log a warning message?
             b = this.add(url);// Add the string if cannot create the URL

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java Fri Apr  3 11:33:57 2009
@@ -45,6 +45,7 @@
 import org.apache.jmeter.protocol.http.control.HeaderManager;
 import org.apache.jmeter.protocol.http.parser.HTMLParseException;
 import org.apache.jmeter.protocol.http.parser.HTMLParser;
+import org.apache.jmeter.protocol.http.util.ConversionUtils;
 import org.apache.jmeter.protocol.http.util.EncoderCache;
 import org.apache.jmeter.protocol.http.util.HTTPArgument;
 import org.apache.jmeter.protocol.http.util.HTTPFileArg;
@@ -1292,7 +1293,7 @@
             // this behaviour.
             String location = encodeSpaces(lastRes.getRedirectLocation());
             try {
-                lastRes = sample(new URL(lastRes.getURL(), location), GET, true, frameDepth);
+                lastRes = sample(ConversionUtils.makeRelativeURL(lastRes.getURL(), location), GET, true, frameDepth);
             } catch (MalformedURLException e) {
                 lastRes = errorResult(e, lastRes);
                 // The redirect URL we got was not a valid URL

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java Fri Apr  3 11:33:57 2009
@@ -18,7 +18,11 @@
 
 package org.apache.jmeter.protocol.http.util;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.nio.charset.Charset;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.jorphan.util.JOrphanUtils;
 
@@ -69,4 +73,32 @@
         }
         return charSet;
     }
+    
+    /**
+     * Generate a relative URL, allowing for extraneous leading "../" segments.
+     * The Java {@link URL#URL(URL, String)} constructor does not remove these.
+     * 
+     * @param baseURL
+     * @param location relative location, possibly with extraneous leading "../"
+     * @return URL with extraneous ../ removed
+     * @throws MalformedURLException
+     */
+    public static URL makeRelativeURL(URL baseURL, String location) throws MalformedURLException{
+        URL initial = new URL(baseURL,location);
+        // skip expensive processing if it cannot apply
+        if (!location.startsWith("../")){// $NON-NLS-1$
+            return initial;
+        }
+        String path = initial.getPath();
+        // Match /../[../] etc.
+        Pattern p = Pattern.compile("^/((?:\\.\\./)+)"); // $NON-NLS-1$
+        Matcher m = p.matcher(path);
+        if (m.lookingAt()){
+            String prefix = m.group(1); // get ../ or ../../ etc.
+            if (location.startsWith(prefix)){
+                return new URL(baseURL, location.substring(prefix.length()));
+            }
+        }
+        return initial;
+    }
 }

Modified: jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/TestHTTPUtils.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/TestHTTPUtils.java?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/TestHTTPUtils.java (original)
+++ jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/TestHTTPUtils.java Fri Apr  3 11:33:57 2009
@@ -18,6 +18,8 @@
 
 package org.apache.jmeter.protocol.http.util;
 
+import java.net.URL;
+
 import junit.framework.TestCase;
 
 public class TestHTTPUtils extends TestCase {
@@ -35,4 +37,14 @@
             assertNull(ConversionUtils.getEncodingFromContentType(";charset=;"));
             assertNull(ConversionUtils.getEncodingFromContentType(";charset=no-such-charset;"));
 		}
+		
+		public void testMakeRelativeURL() throws Exception {
+		    URL base = new URL("http://host/a/b/c");
+		    assertEquals(new URL("http://host/a/b/d"),ConversionUtils.makeRelativeURL(base,"d"));
+            assertEquals(new URL("http://host/a/d"),ConversionUtils.makeRelativeURL(base,"../d"));
+            assertEquals(new URL("http://host/d"),ConversionUtils.makeRelativeURL(base,"../../d"));
+            assertEquals(new URL("http://host/d"),ConversionUtils.makeRelativeURL(base,"../../../d"));
+            assertEquals(new URL("http://host/d"),ConversionUtils.makeRelativeURL(base,"../../../../d"));
+            assertEquals(new URL("http://host/../d"),ConversionUtils.makeRelativeURL(base,"/../d"));
+		}
 }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=761626&r1=761625&r2=761626&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Fri Apr  3 11:33:57 2009
@@ -193,6 +193,10 @@
 <li>Check validity of cookies before storing them.</li>
 <li>FTP Sampler now logs out before disconnecting.</li>
 <li>Bug 46838 - if there was no data, still need to set latency in HTTPSampler</li>
+<li>
+Bug 46690 - handling of 302 redirects with invalid relative paths.
+JMeter now removes extraneous leading "../" segments (as do many browsers)
+</li>
 </ul>
 
 <h3>Improvements</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org