jmeter-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pmoua...@apache.org
Subject svn commit: r1538291 - in /jmeter/trunk: src/protocol/http/org/apache/jmeter/protocol/http/sampler/ src/protocol/http/org/apache/jmeter/protocol/http/util/ xdocs/
Date Sat, 02 Nov 2013 21:53:49 GMT
Author: pmouawad
Date: Sat Nov  2 21:53:49 2013
New Revision: 1538291

URL: http://svn.apache.org/r1538291
Log:
Bug 55717 - Bad handling of Redirect when URLs are in relative format by HttpClient4 and HttpClient31
Bugzilla Id: 55717

Modified:
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java?rev=1538291&r1=1538290&r2=1538291&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
(original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
Sat Nov  2 21:53:49 2013
@@ -321,7 +321,12 @@ public class HTTPHC3Impl extends HTTPHCA
                     throw new IllegalArgumentException("Missing location header");
                 }
                 try {
-                    res.setRedirectLocation(ConversionUtils.sanitizeUrl(new URL(headerLocation.getValue())).toString());
+                    String redirectLocation = headerLocation.getValue();
+                    if(!(redirectLocation.startsWith("http://")||redirectLocation.startsWith("https://")))
{
+                        redirectLocation = ConversionUtils.buildFullUrlFromRelative(url,
redirectLocation);
+                    }
+
+                    res.setRedirectLocation(ConversionUtils.sanitizeUrl(new URL(redirectLocation)).toString());
                 } catch (Exception e) {
                     log.error("Error sanitizing URL:"+headerLocation.getValue()+", message:"+e.getMessage());
                 }

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java?rev=1538291&r1=1538290&r2=1538291&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
(original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
Sat Nov  2 21:53:49 2013
@@ -332,7 +332,10 @@ public class HTTPHC4Impl extends HTTPHCA
                 if (headerLocation == null) { // HTTP protocol violation, but avoids NPE
                     throw new IllegalArgumentException("Missing location header in redirect
for " + httpRequest.getRequestLine());
                 }
-                final String redirectLocation = headerLocation.getValue();
+                String redirectLocation = headerLocation.getValue();
+                if(!(redirectLocation.startsWith("http://")|| redirectLocation.startsWith("https://")))
{
+                    redirectLocation = ConversionUtils.buildFullUrlFromRelative(url, redirectLocation);
+                }
                 try {
                     final URL redirectUrl = new URL(redirectLocation);
                     res.setRedirectLocation(ConversionUtils.sanitizeUrl(redirectUrl).toString());

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java?rev=1538291&r1=1538290&r2=1538291&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
(original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/ConversionUtils.java
Sat Nov  2 21:53:49 2013
@@ -262,4 +262,54 @@ public class ConversionUtils {
         s.replace(pathStartIndex, pathEndIndex, newPath.toString());
         return s.toString();
     }
+
+    /**
+     * Builds Full url (containing scheme, host,port) from relative URL
+     * as per RFC http://tools.ietf.org/html/rfc3986#section-4.2
+     * @param lastUrl URL
+     * @param redirectLocation absolute URL
+     * @return Full URL
+     * 
+     */
+    public static final String buildFullUrlFromRelative(URL lastUrl,
+            String redirectLocation) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(lastUrl.getProtocol())
+            .append("://")
+            .append(lastUrl.getHost());
+        if(lastUrl.getPort()!= -1) {
+            builder.append(":").append(lastUrl.getPort());
+        }
+        if(redirectLocation.startsWith("/")) {
+            // A relative reference that begins with a single slash 
+            // character is termed an absolute-path reference
+            builder.append(redirectLocation);
+        } else {
+            // A relative reference that does not begin with a
+            // slash character is termed a relative-path reference
+            // We need to merge a relative-path reference with the path of the base URI
+            // http://tools.ietf.org/html/rfc3986#section-5.2.3
+            if(lastUrl.getPath().isEmpty()) {
+                // If the base URI has a defined authority component and an empty
+                // path, then return a string consisting of "/" concatenated with the
+                // reference's path; otherwise,
+                builder.append("/").append(redirectLocation);
+            } else {
+                // string consisting of the reference's path component
+                // appended to all but the last segment of the base URI's path (i.e.,
+                // excluding any characters after the right-most "/" in the base URI
+                // path, or excluding the entire base URI path if it does not contain
+                // any "/" characters).     
+                String path = lastUrl.getPath();
+                int index = path.lastIndexOf("/");
+                if(index == -1) {
+                    builder.append("/").append(redirectLocation);
+                } else {
+                    builder.append(path.substring(0, index+1))
+                        .append(redirectLocation);
+                }
+            }
+        }
+        return builder.toString();
+    }
 }

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1538291&r1=1538290&r2=1538291&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Sat Nov  2 21:53:49 2013
@@ -128,6 +128,7 @@ A workaround is to use a Java 7 update 4
 
 <h3>HTTP Samplers and Proxy</h3>
 <ul>
+<li><bugzilla>55717</bugzilla> - Bad handling of Redirect when URLs are
in relative format by HttpClient4 and HttpClient31</li>
 </ul>
 
 <h3>Other Samplers</h3>



Mime
View raw message