On 2 November 2013 21:53, <[email protected]> wrote: > 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 {
I thought redirects did not allow relative references? > + // 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> > >
