示例#1
0
  protected void rewriteRequestURI(final RequestWrapper request, final HttpRoute route)
      throws ProtocolException {
    try {

      URI uri = request.getURI();
      if (route.getProxyHost() != null && !route.isTunnelled()) {
        // Make sure the request URI is absolute
        if (!uri.isAbsolute()) {
          HttpHost target = route.getTargetHost();
          uri = URIUtils.rewriteURI(uri, target);
          request.setURI(uri);
        }
      } else {
        // Make sure the request URI is relative
        if (uri.isAbsolute()) {
          uri = URIUtils.rewriteURI(uri, null);
          request.setURI(uri);
        }
      }

    } catch (URISyntaxException ex) {
      throw new ProtocolException("Invalid URI: " + request.getRequestLine().getUri(), ex);
    }
  }
  @Override
  public URI getLocationURI(final HttpResponse response, final HttpContext context)
      throws ProtocolException {
    if (response == null) {
      throw new IllegalArgumentException("HTTP response may not be null");
    }
    // get the location header to find out where to redirect to
    Header locationHeader = response.getFirstHeader("location");
    if (locationHeader == null) {
      // got a redirect response, but no location header
      throw new ProtocolException(
          "Received redirect response " + response.getStatusLine() + " but no location header");
    }
    // HERE IS THE MODIFIED LINE OF CODE
    String location = locationHeader.getValue().replaceAll(" ", "%20");

    URI uri;
    try {
      uri = new URI(location);
    } catch (URISyntaxException ex) {
      throw new ProtocolException("Invalid redirect URI: " + location, ex);
    }

    HttpParams params = response.getParams();
    // rfc2616 demands the location value be a complete URI
    // Location       = "Location" ":" absoluteURI
    if (!uri.isAbsolute()) {
      if (params.isParameterTrue(ClientPNames.REJECT_RELATIVE_REDIRECT)) {
        throw new ProtocolException("Relative redirect location '" + uri + "' not allowed");
      }
      // Adjust location URI
      HttpHost target = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
      if (target == null) {
        throw new IllegalStateException("Target host not available " + "in the HTTP context");
      }

      HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);

      try {
        URI requestURI = new URI(request.getRequestLine().getUri());
        URI absoluteRequestURI = URIUtils.rewriteURI(requestURI, target, true);
        uri = URIUtils.resolve(absoluteRequestURI, uri);
      } catch (URISyntaxException ex) {
        throw new ProtocolException(ex.getMessage(), ex);
      }
    }

    if (params.isParameterFalse(ClientPNames.ALLOW_CIRCULAR_REDIRECTS)) {

      RedirectLocations redirectLocations =
          (RedirectLocations) context.getAttribute(REDIRECT_LOCATIONS);

      if (redirectLocations == null) {
        redirectLocations = new RedirectLocations();
        context.setAttribute(REDIRECT_LOCATIONS, redirectLocations);
      }

      URI redirectURI;
      if (uri.getFragment() != null) {
        try {
          HttpHost target = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
          redirectURI = URIUtils.rewriteURI(uri, target, true);
        } catch (URISyntaxException ex) {
          throw new ProtocolException(ex.getMessage(), ex);
        }
      } else {
        redirectURI = uri;
      }

      if (redirectLocations.contains(redirectURI)) {
        throw new CircularRedirectException("Circular redirect to '" + redirectURI + "'");
      } else {
        redirectLocations.add(redirectURI);
      }
    }

    return uri;
  }