SPR-8367 - 3.1.0.M2 update of the RestTemplate for Apache HTTP Components will default to sending 2 requests on authentication and doesn't support HttpContext parameters without significant extention/rewrite

This commit is contained in:
Arjen Poutsma 2011-12-07 01:22:07 +00:00
parent 29e969039d
commit f9144ea1ea
2 changed files with 27 additions and 12 deletions

View File

@ -21,6 +21,9 @@ import java.net.URI;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
@ -28,9 +31,7 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
/** /**
* {@link org.springframework.http.client.ClientHttpRequest} implementation that uses * {@link org.springframework.http.client.ClientHttpRequest} implementation that uses
@ -49,10 +50,13 @@ final class HttpComponentsClientHttpRequest extends AbstractBufferingClientHttpR
private final HttpUriRequest httpRequest; private final HttpUriRequest httpRequest;
private final HttpContext httpContext;
public HttpComponentsClientHttpRequest(HttpClient httpClient, HttpUriRequest httpRequest) {
public HttpComponentsClientHttpRequest(HttpClient httpClient, HttpUriRequest httpRequest, HttpContext httpContext) {
this.httpClient = httpClient; this.httpClient = httpClient;
this.httpRequest = httpRequest; this.httpRequest = httpRequest;
this.httpContext = httpContext;
} }
@ -81,7 +85,7 @@ final class HttpComponentsClientHttpRequest extends AbstractBufferingClientHttpR
HttpEntity requestEntity = new ByteArrayEntity(bufferedOutput); HttpEntity requestEntity = new ByteArrayEntity(bufferedOutput);
entityEnclosingRequest.setEntity(requestEntity); entityEnclosingRequest.setEntity(requestEntity);
} }
HttpResponse httpResponse = this.httpClient.execute(this.httpRequest); HttpResponse httpResponse = this.httpClient.execute(this.httpRequest, this.httpContext);
return new HttpComponentsClientHttpResponse(httpResponse); return new HttpComponentsClientHttpResponse(httpResponse);
} }

View File

@ -19,6 +19,10 @@ package org.springframework.http.client;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
@ -35,10 +39,7 @@ import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HttpContext;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;
/** /**
* {@link org.springframework.http.client.ClientHttpRequestFactory} implementation that uses * {@link org.springframework.http.client.ClientHttpRequestFactory} implementation that uses
@ -126,11 +127,10 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest
getHttpClient().getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout); getHttpClient().getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout);
} }
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
HttpUriRequest httpRequest = createHttpUriRequest(httpMethod, uri); HttpUriRequest httpRequest = createHttpUriRequest(httpMethod, uri);
postProcessHttpRequest(httpRequest); postProcessHttpRequest(httpRequest);
return new HttpComponentsClientHttpRequest(getHttpClient(), httpRequest); return new HttpComponentsClientHttpRequest(getHttpClient(), httpRequest, createHttpContext(httpMethod, uri));
} }
/** /**
@ -169,6 +169,17 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest
protected void postProcessHttpRequest(HttpUriRequest request) { protected void postProcessHttpRequest(HttpUriRequest request) {
} }
/**
* Template methods that creates a {@link HttpContext} for the given HTTP method and URI.
* <p>The default implementation returns {@code null}.
* @param httpMethod the HTTP method
* @param uri the URI
* @return the http context
*/
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
return null;
}
/** /**
* Shutdown hook that closes the underlying * Shutdown hook that closes the underlying
* {@link org.apache.http.conn.ClientConnectionManager ClientConnectionManager}'s * {@link org.apache.http.conn.ClientConnectionManager ClientConnectionManager}'s