jmeter-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sebb <seb...@gmail.com>
Subject Re: 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 Wed, 06 Nov 2013 01:12:18 GMT
On 2 November 2013 21:53,  <pmouawad@apache.org> 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>
>
>

Mime
View raw message