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>
|