From: <asa...@us...> - 2014-01-23 08:57:18
|
Revision: 9039 http://sourceforge.net/p/htmlunit/code/9039 Author: asashour Date: 2014-01-23 08:57:11 +0000 (Thu, 23 Jan 2014) Log Message: ----------- Revert: new HttpWebConnection Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-01-23 08:53:21 UTC (rev 9038) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2014-01-23 08:57:11 UTC (rev 9039) @@ -53,8 +53,6 @@ import org.apache.http.auth.Credentials; import org.apache.http.client.CookieStore; import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.config.CookieSpecs; -import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpHead; @@ -64,37 +62,41 @@ import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpTrace; import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.client.params.ClientPNames; +import org.apache.http.client.params.HttpClientParams; import org.apache.http.client.utils.DateUtils; import org.apache.http.client.utils.URIUtils; import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.params.ConnRoutePNames; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.cookie.ClientCookie; import org.apache.http.cookie.Cookie; import org.apache.http.cookie.CookieAttributeHandler; import org.apache.http.cookie.CookieOrigin; import org.apache.http.cookie.CookiePathComparator; import org.apache.http.cookie.CookieSpec; -import org.apache.http.cookie.CookieSpecProvider; +import org.apache.http.cookie.CookieSpecFactory; import org.apache.http.cookie.MalformedCookieException; import org.apache.http.cookie.SetCookie; +import org.apache.http.cookie.params.CookieSpecPNames; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.InputStreamBody; +import org.apache.http.impl.client.AbstractHttpClient; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultRedirectStrategy; -import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingClientConnectionManager; import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.http.impl.cookie.BasicPathHandler; -import org.apache.http.impl.cookie.BestMatchSpecFactory; import org.apache.http.impl.cookie.BrowserCompatSpec; -import org.apache.http.impl.cookie.BrowserCompatSpecFactory; -import org.apache.http.impl.cookie.IgnoreSpecFactory; -import org.apache.http.impl.cookie.NetscapeDraftSpecFactory; -import org.apache.http.impl.cookie.RFC2109SpecFactory; -import org.apache.http.impl.cookie.RFC2965SpecFactory; import org.apache.http.message.BasicHeader; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.CoreConnectionPNames; +import org.apache.http.params.HttpParams; +import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import com.gargoylesoftware.htmlunit.util.KeyDataPair; @@ -103,8 +105,6 @@ /** * Default implementation of {@link WebConnection}, using the HttpClient library to perform HTTP requests. - * This is meant to use the new API in HttpClient 4.3, and should be renamed to HttpWebConnection, - * after the old code is removed. * * @version $Revision$ * @author <a href="mailto:mb...@Ga...">Mike Bowler</a> @@ -120,13 +120,13 @@ public class HttpWebConnection implements WebConnection { private static final String HACKED_COOKIE_POLICY = "mine"; - private HttpClientBuilder httpClientBuilder_; + private AbstractHttpClient httpClient_; private final WebClient webClient_; /** Use single HttpContext, so there is no need to re-send authentication for each and every request. */ - private HttpContext httpContext_ = new HttpClientContext(); + private HttpContext httpContext_ = new BasicHttpContext(); private String virtualHost_; - private final CookieSpecProvider htmlUnitCookieSpecProvider_; + private final CookieSpecFactory htmlUnitCookieSpecFactory_; private final WebClientOptions usedOptions_ = new WebClientOptions(); /** @@ -135,9 +135,8 @@ */ public HttpWebConnection(final WebClient webClient) { webClient_ = webClient; - htmlUnitCookieSpecProvider_ = new CookieSpecProvider() { - @Override - public CookieSpec create(final HttpContext context) { + htmlUnitCookieSpecFactory_ = new CookieSpecFactory() { + public CookieSpec newInstance(final HttpParams params) { return new HtmlUnitBrowserCompatCookieSpec(webClient_.getIncorrectnessListener()); } }; @@ -148,7 +147,7 @@ */ public WebResponse getResponse(final WebRequest request) throws IOException { final URL url = request.getUrl(); - final HttpClientBuilder builder = reconfigureHttpClientIfNeeded(getHttpClientBuilder()); + final AbstractHttpClient httpClient = getHttpClient(); HttpUriRequest httpMethod = null; try { @@ -160,19 +159,18 @@ + " (reason: " + e.getMessage() + ")", e); } final HttpHost hostConfiguration = getHostConfiguration(request); -// setProxy(httpMethod, request); + setProxy(httpMethod, request); final long startTime = System.currentTimeMillis(); HttpResponse httpResponse = null; try { - httpResponse = builder.build().execute(hostConfiguration, httpMethod, httpContext_); + httpResponse = httpClient.execute(hostConfiguration, httpMethod, httpContext_); } catch (final SSLPeerUnverifiedException s) { // Try to use only SSLv3 instead if (webClient_.getOptions().isUseInsecureSSL()) { - // TODO: asashour - // HtmlUnitSSLSocketFactory.setUseSSL3Only(getHttpClient().getParams(), true); - httpResponse = builder.build().execute(hostConfiguration, httpMethod); + HtmlUnitSSLSocketFactory.setUseSSL3Only(getHttpClient().getParams(), true); + httpResponse = httpClient.execute(hostConfiguration, httpMethod); } else { throw s; @@ -184,7 +182,7 @@ // come out of connections and throw a ConnectionPoolTimeoutException. // => best solution, discard the HttpClient instance. synchronized (this) { - httpClientBuilder_ = null; + httpClient_ = null; } throw e; } @@ -220,39 +218,17 @@ return hostConfiguration; } -// private static void setProxy(final HttpUriRequest httpUriRequest, final WebRequest webRequest) { -// if (webRequest.getProxyHost() != null) { -// final HttpHost proxy = new HttpHost(webRequest.getProxyHost(), webRequest.getProxyPort()); -// final HttpParams httpRequestParams = httpUriRequest.getParams(); -// if (webRequest.isSocksProxy()) { -// SocksSocketFactory.setSocksProxy(httpRequestParams, proxy); -// } -// else { -// httpRequestParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); -// } -// } -// } - - private void setProxy(final HttpRequestBase httpRequest, final WebRequest webRequest) { - RequestConfig.Builder requestBuilder = createRequestConfig(); - configureTimeout(requestBuilder, webClient_.getOptions().getTimeout()); - + private static void setProxy(final HttpUriRequest httpUriRequest, final WebRequest webRequest) { if (webRequest.getProxyHost() != null) { final HttpHost proxy = new HttpHost(webRequest.getProxyHost(), webRequest.getProxyPort()); - requestBuilder.setProxy(proxy); - httpRequest.setConfig(requestBuilder.build()); - -// if (webRequest.isSocksProxy()) { -// SocksSocketFactory.setSocksProxy(httpRequestParams, proxy); -// } -// else { -// httpRequestParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); -// } + final HttpParams httpRequestParams = httpUriRequest.getParams(); + if (webRequest.isSocksProxy()) { + SocksSocketFactory.setSocksProxy(httpRequestParams, proxy); + } + else { + httpRequestParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); + } } - else { - requestBuilder.setProxy(null); - httpRequest.setConfig(requestBuilder.build()); - } } /** @@ -278,7 +254,6 @@ URI uri = URIUtils.createURI(url.getProtocol(), url.getHost(), url.getPort(), url.getPath(), escapeQuery(url.getQuery()), null); final HttpRequestBase httpMethod = buildHttpMethod(webRequest.getHttpMethod(), uri); - setProxy(httpMethod, webRequest); if (!(httpMethod instanceof HttpEntityEnclosingRequest)) { // this is the case for GET as well as TRACE, DELETE, OPTIONS and HEAD if (!webRequest.getRequestParameters().isEmpty()) { @@ -319,8 +294,7 @@ buildFilePart((KeyDataPair) pair, builder); } else { - builder.addTextBody(pair.getName(), pair.getValue(), - ContentType.create("text/plain", webRequest.getCharset())); + builder.addTextBody(pair.getName(), pair.getValue()); } } method.setEntity(builder.build()); @@ -351,8 +325,10 @@ writeRequestHeadersToHttpMethod(httpMethod, webRequest.getAdditionalHeaders()); // getHttpClient().getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, true); - final HttpClientBuilder httpClient = getHttpClientBuilder(); + final AbstractHttpClient httpClient = getHttpClient(); + reconfigureHttpClientIfNeeded(httpClient); + // Tell the client where to get its credentials from // (it may have changed on the webClient since last call to getHttpClientFor(...)) final CredentialsProvider credentialsProvider = webClient_.getCredentialsProvider(); @@ -365,7 +341,6 @@ final AuthScope authScope = new AuthScope(requestUrl.getHost(), requestUrl.getPort()); // updating our client to keep the credentials for the next request credentialsProvider.setCredentials(authScope, requestUrlCredentials); - httpContext_.removeAttribute(HttpClientContext.TARGET_AUTH_STATE); } // if someone has set credentials to this request, we have to add this @@ -375,22 +350,19 @@ final AuthScope authScope = new AuthScope(requestUrl.getHost(), requestUrl.getPort()); // updating our client to keep the credentials for the next request credentialsProvider.setCredentials(authScope, requestCredentials); - httpContext_.removeAttribute(HttpClientContext.TARGET_AUTH_STATE); } - httpContext_.removeAttribute(HttpClientContext.CREDS_PROVIDER); - httpClient.setDefaultCredentialsProvider(credentialsProvider); + httpClient.setCredentialsProvider(credentialsProvider); - httpContext_.removeAttribute(HttpClientContext.COOKIE_STORE); if (webClient_.getCookieManager().isCookiesEnabled()) { // Cookies are enabled. Note that it's important that we enable single cookie headers, // for compatibility purposes. - // TODO: asashour -// httpClient.getParams().setParameter(CookieSpecPNames.SINGLE_COOKIE_HEADER, Boolean.TRUE); - httpClient.setDefaultCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); + httpClient.getParams().setParameter(CookieSpecPNames.SINGLE_COOKIE_HEADER, Boolean.TRUE); + httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, HACKED_COOKIE_POLICY); + httpClient.setCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); } else { // Cookies are disabled. - httpClient.setDefaultCookieStore(new CookieStore() { + httpClient.setCookieStore(new CookieStore() { public void addCookie(final Cookie cookie) { /* empty */ } public void clear() { /* empty */ } public boolean clearExpired(final Date date) { @@ -529,27 +501,16 @@ * * @return the initialized HTTP client */ - protected synchronized HttpClientBuilder getHttpClientBuilder() { - if (httpClientBuilder_ == null) { - httpClientBuilder_ = createHttpClient(); + protected synchronized AbstractHttpClient getHttpClient() { + if (httpClient_ == null) { + httpClient_ = createHttpClient(); // this factory is required later // to be sure this is done, we do it outside the createHttpClient() call - final RegistryBuilder<CookieSpecProvider> registeryBuilder - = RegistryBuilder.<CookieSpecProvider>create() - .register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory()) - .register(CookieSpecs.STANDARD, new RFC2965SpecFactory()) - .register(CookieSpecs.BROWSER_COMPATIBILITY, new BrowserCompatSpecFactory()) - .register(CookieSpecs.NETSCAPE, new NetscapeDraftSpecFactory()) - .register(CookieSpecs.IGNORE_COOKIES, new IgnoreSpecFactory()) - .register("rfc2109", new RFC2109SpecFactory()) - .register("rfc2965", new RFC2965SpecFactory()); - - registeryBuilder.register(HACKED_COOKIE_POLICY, htmlUnitCookieSpecProvider_); - httpClientBuilder_.setDefaultCookieSpecRegistry(registeryBuilder.build()); + httpClient_.getCookieSpecs().register(HACKED_COOKIE_POLICY, htmlUnitCookieSpecFactory_); } - return httpClientBuilder_; + return httpClient_; } /** @@ -570,40 +531,25 @@ * some tracking; see feature request 1438216). * @return the <tt>HttpClient</tt> that will be used by this WebConnection */ - protected HttpClientBuilder createHttpClient() { - // TODO: asashour -// final HttpParams httpParams = new BasicHttpParams(); -// -// HttpClientParams.setRedirecting(httpParams, false); -// // Set timeouts -// configureTimeout(httpParams, webClient_.getOptions().getTimeout()); -// -// final SchemeRegistry schemeRegistry = new SchemeRegistry(); -// schemeRegistry.register(new Scheme("http", 80, new SocksSocketFactory())); -// configureHttpsScheme(schemeRegistry); -// -// final PoolingClientConnectionManager connectionManager = -// new PoolingClientConnectionManager(schemeRegistry); -// connectionManager.setDefaultMaxPerRoute(6); -// -// final DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, httpParams); -// httpClient.setCookieStore(new HtmlUnitCookieStore2(webClient_.getCookieManager())); -// -// httpClient.setRedirectStrategy(new DefaultRedirectStrategy() { -// @Override -// public boolean isRedirected(final HttpRequest request, final HttpResponse response, -// final HttpContext context) throws ProtocolException { -// return super.isRedirected(request, response, context) -// && response.getFirstHeader("location") != null; -// } -// }); -// -// if (getVirtualHost() != null) { -// httpClient.getParams().setParameter(ClientPNames.VIRTUAL_HOST, virtualHost_); -// } + protected AbstractHttpClient createHttpClient() { + final HttpParams httpParams = new BasicHttpParams(); - final HttpClientBuilder builder = HttpClientBuilder.create(); - builder.setRedirectStrategy(new DefaultRedirectStrategy() { + HttpClientParams.setRedirecting(httpParams, false); + // Set timeouts + configureTimeout(httpParams, webClient_.getOptions().getTimeout()); + + final SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", 80, new SocksSocketFactory())); + configureHttpsScheme(schemeRegistry); + + final PoolingClientConnectionManager connectionManager = + new PoolingClientConnectionManager(schemeRegistry); + connectionManager.setDefaultMaxPerRoute(6); + + final DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, httpParams); + httpClient.setCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); + + httpClient.setRedirectStrategy(new DefaultRedirectStrategy() { @Override public boolean isRedirected(final HttpRequest request, final HttpResponse response, final HttpContext context) throws ProtocolException { @@ -611,57 +557,45 @@ && response.getFirstHeader("location") != null; } }); - configureTimeout(builder, webClient_.getOptions().getTimeout()); - return builder; - } - private void configureTimeout(final HttpClientBuilder builder, final int timeout) { - RequestConfig.Builder requestBuilder = createRequestConfig(); - configureTimeout(requestBuilder, timeout); + if (getVirtualHost() != null) { + httpClient.getParams().setParameter(ClientPNames.VIRTUAL_HOST, virtualHost_); + } - builder.setDefaultRequestConfig(requestBuilder.build()); - httpContext_.removeAttribute(HttpClientContext.REQUEST_CONFIG); - usedOptions_.setTimeout(timeout); + return httpClient; } - private RequestConfig.Builder createRequestConfig() { - RequestConfig.Builder requestBuilder = RequestConfig.custom() - .setCookieSpec(HACKED_COOKIE_POLICY) - .setRedirectsEnabled(false); - return requestBuilder; - } + private void configureTimeout(final HttpParams httpParams, final int timeout) { + httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout); + httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); - private void configureTimeout(final RequestConfig.Builder builder, final int timeout) { - builder.setConnectTimeout(timeout) - .setConnectionRequestTimeout(timeout) - .setSocketTimeout(timeout); + usedOptions_.setTimeout(timeout); } /** * React on changes that may have occurred on the WebClient settings. * Registering as a listener would be probably better. */ - private HttpClientBuilder reconfigureHttpClientIfNeeded(final HttpClientBuilder httpClientBuilder) { + private void reconfigureHttpClientIfNeeded(final AbstractHttpClient httpClient) { final WebClientOptions options = webClient_.getOptions(); // register new SSL factory only if settings have changed if (options.isUseInsecureSSL() != usedOptions_.isUseInsecureSSL() || options.getSSLClientCertificateUrl() != usedOptions_.getSSLClientCertificateUrl()) { - configureHttpsScheme(httpClientBuilder); + configureHttpsScheme(httpClient.getConnectionManager().getSchemeRegistry()); } if (options.getTimeout() != usedOptions_.getTimeout()) { - configureTimeout(httpClientBuilder, options.getTimeout()); + configureTimeout(httpClient.getParams(), options.getTimeout()); } - return httpClientBuilder; } - private void configureHttpsScheme(final HttpClientBuilder builder) { + private void configureHttpsScheme(final SchemeRegistry schemeRegistry) { final WebClientOptions options = webClient_.getOptions(); - final SSLConnectionSocketFactory socketFactory = HtmlUnitSSLConnectionSocketFactory.buildSSLSocketFactory(options); + final SSLSocketFactory socketFactory = HtmlUnitSSLSocketFactory.buildSSLSocketFactory(options); - builder.setSSLSocketFactory(socketFactory); + schemeRegistry.register(new Scheme("https", 443, socketFactory)); usedOptions_.setUseInsecureSSL(options.isUseInsecureSSL()); usedOptions_.setSSLClientCertificate(options.getSSLClientCertificateUrl(), @@ -675,8 +609,7 @@ public void setVirtualHost(final String virtualHost) { virtualHost_ = virtualHost; if (virtualHost_ != null) { - // TODO: asashour - //getHttpClient().getParams().setParameter(ClientPNames.VIRTUAL_HOST, virtualHost_); + getHttpClient().getParams().setParameter(ClientPNames.VIRTUAL_HOST, virtualHost_); } } @@ -692,7 +625,7 @@ * Converts an HttpMethod into a WebResponse. */ private WebResponse makeWebResponse(final HttpResponse httpResponse, - final WebRequest request, final DownloadedContent responseBody, final long loadTime) { + final WebRequest request, final DownloadedContent downloadedContent, final long loadTime) { String statusMessage = httpResponse.getStatusLine().getReasonPhrase(); if (statusMessage == null) { @@ -703,7 +636,7 @@ for (final Header header : httpResponse.getAllHeaders()) { headers.add(new NameValuePair(header.getName(), header.getValue())); } - final WebResponseData responseData = new WebResponseData(responseBody, statusCode, statusMessage, headers); + final WebResponseData responseData = new WebResponseData(downloadedContent, statusCode, statusMessage, headers); return newWebResponseInstance(responseData, loadTime, request); } @@ -788,17 +721,11 @@ * Shutdown the connection manager. */ public synchronized void shutdown() { - if (httpClientBuilder_ != null) { - // TODO: asashour - //httpClientBuilder_.getConnectionManager().shutdown(); - httpClientBuilder_ = null; + if (httpClient_ != null) { + httpClient_.getConnectionManager().shutdown(); + httpClient_ = null; } } - - //TODO: should we really do this? -// public void clearCredentials() { -// httpContext_.removeAttribute(HttpClientContext.TARGET_AUTH_STATE); -// } } /** @@ -949,5 +876,4 @@ public synchronized void clear() { manager_.clearCookies(); } - } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java 2014-01-23 08:53:21 UTC (rev 9038) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/HttpWebConnectionTest.java 2014-01-23 08:57:11 UTC (rev 9039) @@ -44,7 +44,6 @@ import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; import org.apache.log4j.Level; @@ -245,9 +244,9 @@ final boolean[] tabCalled = {false}; final WebConnection myWebConnection = new HttpWebConnection(webClient) { @Override - protected HttpClientBuilder createHttpClient() { + protected AbstractHttpClient createHttpClient() { tabCalled[0] = true; - return HttpClientBuilder.create(); + return new DefaultHttpClient(); } }; |