mirror of
https://github.com/internetarchive/heritrix3.git
synced 2026-07-23 07:51:44 +00:00
1014 lines
40 KiB
Diff
1014 lines
40 KiB
Diff
Index: httpclient/httpclient/src/main/java/org/apache/http/client/methods/AbortableHttpRequestBase.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/client/methods/AbortableHttpRequestBase.java (revision 0)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/client/methods/AbortableHttpRequestBase.java (working copy)
|
|
@@ -0,0 +1,174 @@
|
|
+/*
|
|
+ * ====================================================================
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one
|
|
+ * or more contributor license agreements. See the NOTICE file
|
|
+ * distributed with this work for additional information
|
|
+ * regarding copyright ownership. The ASF licenses this file
|
|
+ * to you under the Apache License, Version 2.0 (the
|
|
+ * "License"); you may not use this file except in compliance
|
|
+ * with the License. You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing,
|
|
+ * software distributed under the License is distributed on an
|
|
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
+ * KIND, either express or implied. See the License for the
|
|
+ * specific language governing permissions and limitations
|
|
+ * under the License.
|
|
+ * ====================================================================
|
|
+ *
|
|
+ * This software consists of voluntary contributions made by many
|
|
+ * individuals on behalf of the Apache Software Foundation. For more
|
|
+ * information on the Apache Software Foundation, please see
|
|
+ * <http://www.apache.org/>.
|
|
+ *
|
|
+ */
|
|
+package org.apache.http.client.methods;
|
|
+
|
|
+import java.io.IOException;
|
|
+import java.util.concurrent.locks.Lock;
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
+
|
|
+import org.apache.http.HttpRequest;
|
|
+import org.apache.http.client.utils.CloneUtils;
|
|
+import org.apache.http.concurrent.Cancellable;
|
|
+import org.apache.http.conn.ClientConnectionRequest;
|
|
+import org.apache.http.conn.ConnectionReleaseTrigger;
|
|
+import org.apache.http.message.AbstractHttpMessage;
|
|
+
|
|
+@SuppressWarnings("deprecation")
|
|
+public abstract class AbortableHttpRequestBase extends AbstractHttpMessage implements
|
|
+ HttpExecutionAware, AbortableHttpRequest, Cloneable, HttpRequest {
|
|
+
|
|
+ private Lock abortLock = new ReentrantLock();
|
|
+ private volatile boolean aborted;
|
|
+ private Cancellable cancellable;
|
|
+
|
|
+ @Deprecated
|
|
+ @Override
|
|
+ public void setConnectionRequest(final ClientConnectionRequest connRequest) {
|
|
+ if (this.aborted) {
|
|
+ return;
|
|
+ }
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ this.cancellable = new Cancellable() {
|
|
+
|
|
+ public boolean cancel() {
|
|
+ connRequest.abortRequest();
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ };
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Deprecated
|
|
+ @Override
|
|
+ public void setReleaseTrigger(final ConnectionReleaseTrigger releaseTrigger) {
|
|
+ if (this.aborted) {
|
|
+ return;
|
|
+ }
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ this.cancellable = new Cancellable() {
|
|
+
|
|
+ public boolean cancel() {
|
|
+ try {
|
|
+ releaseTrigger.abortConnection();
|
|
+ return true;
|
|
+ } catch (IOException ex) {
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ };
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected void cancelExecution() {
|
|
+ if (this.cancellable != null) {
|
|
+ this.cancellable.cancel();
|
|
+ this.cancellable = null;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void abort() {
|
|
+ if (this.aborted) {
|
|
+ return;
|
|
+ }
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ this.aborted = true;
|
|
+ cancelExecution();
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isAborted() {
|
|
+ return this.aborted;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @since 4.2
|
|
+ */
|
|
+ @Override
|
|
+ public void setCancellable(final Cancellable cancellable) {
|
|
+ if (this.aborted) {
|
|
+ return;
|
|
+ }
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ this.cancellable = cancellable;
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected Object clone() throws CloneNotSupportedException {
|
|
+ AbortableHttpRequestBase clone = (AbortableHttpRequestBase) super.clone();
|
|
+ clone.abortLock = new ReentrantLock();
|
|
+ clone.aborted = false;
|
|
+ clone.cancellable = null;
|
|
+ clone.headergroup = CloneUtils.cloneObject(this.headergroup);
|
|
+ clone.params = CloneUtils.cloneObject(this.params);
|
|
+ return clone;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @since 4.2
|
|
+ */
|
|
+ public void completed() {
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ this.cancellable = null;
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Resets internal state of the request making it reusable.
|
|
+ *
|
|
+ * @since 4.2
|
|
+ */
|
|
+ public void reset() {
|
|
+ this.abortLock.lock();
|
|
+ try {
|
|
+ cancelExecution();
|
|
+ this.aborted = false;
|
|
+ } finally {
|
|
+ this.abortLock.unlock();
|
|
+ }
|
|
+ }
|
|
+
|
|
+}
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/client/methods/BasicAbortableHttpRequest.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/client/methods/BasicAbortableHttpRequest.java (revision 0)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/client/methods/BasicAbortableHttpRequest.java (working copy)
|
|
@@ -0,0 +1,85 @@
|
|
+package org.apache.http.client.methods;
|
|
+
|
|
+import org.apache.http.HttpVersion;
|
|
+import org.apache.http.ProtocolVersion;
|
|
+import org.apache.http.RequestLine;
|
|
+import org.apache.http.annotation.NotThreadSafe;
|
|
+import org.apache.http.message.BasicRequestLine;
|
|
+import org.apache.http.util.Args;
|
|
+
|
|
+/**
|
|
+ *
|
|
+ * @since 4.3
|
|
+ */
|
|
+@NotThreadSafe
|
|
+public class BasicAbortableHttpRequest extends AbortableHttpRequestBase {
|
|
+
|
|
+ private final String method;
|
|
+ private final String uri;
|
|
+
|
|
+ private RequestLine requestline;
|
|
+
|
|
+ /**
|
|
+ * Creates an instance of this class using the given request method
|
|
+ * and URI.
|
|
+ *
|
|
+ * @param method request method.
|
|
+ * @param uri request URI.
|
|
+ */
|
|
+ public BasicAbortableHttpRequest(final String method, final String uri) {
|
|
+ super();
|
|
+ this.method = Args.notNull(method, "Method name");
|
|
+ this.uri = Args.notNull(uri, "Request URI");
|
|
+ this.requestline = null;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Creates an instance of this class using the given request method, URI
|
|
+ * and the HTTP protocol version.
|
|
+ *
|
|
+ * @param method request method.
|
|
+ * @param uri request URI.
|
|
+ * @param ver HTTP protocol version.
|
|
+ */
|
|
+ public BasicAbortableHttpRequest(final String method, final String uri, final ProtocolVersion ver) {
|
|
+ this(new BasicRequestLine(method, uri, ver));
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Creates an instance of this class using the given request line.
|
|
+ *
|
|
+ * @param requestline request line.
|
|
+ */
|
|
+ public BasicAbortableHttpRequest(final RequestLine requestline) {
|
|
+ super();
|
|
+ this.requestline = Args.notNull(requestline, "Request line");
|
|
+ this.method = requestline.getMethod();
|
|
+ this.uri = requestline.getUri();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns the HTTP protocol version to be used for this request.
|
|
+ *
|
|
+ * @see #BasicHttpRequest(String, String)
|
|
+ */
|
|
+ public ProtocolVersion getProtocolVersion() {
|
|
+ return getRequestLine().getProtocolVersion();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns the request line of this request.
|
|
+ *
|
|
+ * @see #BasicHttpRequest(String, String)
|
|
+ */
|
|
+ public RequestLine getRequestLine() {
|
|
+ if (this.requestline == null) {
|
|
+ this.requestline = new BasicRequestLine(this.method, this.uri, HttpVersion.HTTP_1_1);
|
|
+ }
|
|
+ return this.requestline;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public String toString() {
|
|
+ return this.method + " " + this.uri + " " + this.headergroup;
|
|
+ }
|
|
+}
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/client/methods/HttpRequestBase.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/client/methods/HttpRequestBase.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/client/methods/HttpRequestBase.java (working copy)
|
|
@@ -27,20 +27,12 @@
|
|
|
|
package org.apache.http.client.methods;
|
|
|
|
-import java.io.IOException;
|
|
import java.net.URI;
|
|
-import java.util.concurrent.locks.Lock;
|
|
-import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
import org.apache.http.ProtocolVersion;
|
|
import org.apache.http.RequestLine;
|
|
import org.apache.http.annotation.NotThreadSafe;
|
|
import org.apache.http.client.config.RequestConfig;
|
|
-import org.apache.http.client.utils.CloneUtils;
|
|
-import org.apache.http.concurrent.Cancellable;
|
|
-import org.apache.http.conn.ClientConnectionRequest;
|
|
-import org.apache.http.conn.ConnectionReleaseTrigger;
|
|
-import org.apache.http.message.AbstractHttpMessage;
|
|
import org.apache.http.message.BasicRequestLine;
|
|
import org.apache.http.params.HttpProtocolParams;
|
|
|
|
@@ -51,22 +43,14 @@
|
|
*/
|
|
@SuppressWarnings("deprecation")
|
|
@NotThreadSafe
|
|
-public abstract class HttpRequestBase extends AbstractHttpMessage
|
|
- implements HttpUriRequest, Configurable, HttpExecutionAware, AbortableHttpRequest, Cloneable {
|
|
+public abstract class HttpRequestBase extends AbortableHttpRequestBase
|
|
+ implements HttpUriRequest, Configurable {
|
|
|
|
- private Lock abortLock;
|
|
- private volatile boolean aborted;
|
|
-
|
|
private ProtocolVersion version;
|
|
private URI uri;
|
|
- private Cancellable cancellable;
|
|
private RequestConfig config;
|
|
-
|
|
- public HttpRequestBase() {
|
|
- super();
|
|
- this.abortLock = new ReentrantLock();
|
|
- }
|
|
-
|
|
+
|
|
+ @Override
|
|
public abstract String getMethod();
|
|
|
|
/**
|
|
@@ -76,6 +60,7 @@
|
|
this.version = version;
|
|
}
|
|
|
|
+ @Override
|
|
public ProtocolVersion getProtocolVersion() {
|
|
return version != null ? version : HttpProtocolParams.getVersion(getParams());
|
|
}
|
|
@@ -86,10 +71,12 @@
|
|
* Please note URI remains unchanged in the course of request execution and
|
|
* is not updated if the request is redirected to another location.
|
|
*/
|
|
+ @Override
|
|
public URI getURI() {
|
|
return this.uri;
|
|
}
|
|
|
|
+ @Override
|
|
public RequestLine getRequestLine() {
|
|
String method = getMethod();
|
|
ProtocolVersion ver = getProtocolVersion();
|
|
@@ -104,10 +91,8 @@
|
|
return new BasicRequestLine(method, uritext, ver);
|
|
}
|
|
|
|
- public void setURI(final URI uri) {
|
|
- this.uri = uri;
|
|
- }
|
|
|
|
+ @Override
|
|
public RequestConfig getConfig() {
|
|
return config;
|
|
}
|
|
@@ -116,74 +101,10 @@
|
|
this.config = config;
|
|
}
|
|
|
|
- @Deprecated
|
|
- public void setConnectionRequest(final ClientConnectionRequest connRequest) {
|
|
- if (this.aborted) {
|
|
- return;
|
|
- }
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- this.cancellable = new Cancellable() {
|
|
-
|
|
- public boolean cancel() {
|
|
- connRequest.abortRequest();
|
|
- return true;
|
|
- }
|
|
-
|
|
- };
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
+ public void setURI(final URI uri) {
|
|
+ this.uri = uri;
|
|
}
|
|
|
|
- @Deprecated
|
|
- public void setReleaseTrigger(final ConnectionReleaseTrigger releaseTrigger) {
|
|
- if (this.aborted) {
|
|
- return;
|
|
- }
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- this.cancellable = new Cancellable() {
|
|
-
|
|
- public boolean cancel() {
|
|
- try {
|
|
- releaseTrigger.abortConnection();
|
|
- return true;
|
|
- } catch (IOException ex) {
|
|
- return false;
|
|
- }
|
|
- }
|
|
-
|
|
- };
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
- }
|
|
-
|
|
- private void cancelExecution() {
|
|
- if (this.cancellable != null) {
|
|
- this.cancellable.cancel();
|
|
- this.cancellable = null;
|
|
- }
|
|
- }
|
|
-
|
|
- public void abort() {
|
|
- if (this.aborted) {
|
|
- return;
|
|
- }
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- this.aborted = true;
|
|
- cancelExecution();
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
- }
|
|
-
|
|
- public boolean isAborted() {
|
|
- return this.aborted;
|
|
- }
|
|
-
|
|
/**
|
|
* @since 4.2
|
|
*/
|
|
@@ -191,48 +112,6 @@
|
|
}
|
|
|
|
/**
|
|
- * @since 4.2
|
|
- */
|
|
- public void setCancellable(final Cancellable cancellable) {
|
|
- if (this.aborted) {
|
|
- return;
|
|
- }
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- this.cancellable = cancellable;
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * @since 4.2
|
|
- */
|
|
- public void completed() {
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- this.cancellable = null;
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Resets internal state of the request making it reusable.
|
|
- *
|
|
- * @since 4.2
|
|
- */
|
|
- public void reset() {
|
|
- this.abortLock.lock();
|
|
- try {
|
|
- cancelExecution();
|
|
- this.aborted = false;
|
|
- } finally {
|
|
- this.abortLock.unlock();
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
* A convenience method to simplify migration from HttpClient 3.1 API. This method is
|
|
* equivalent to {@link #reset()}.
|
|
*
|
|
@@ -243,17 +122,6 @@
|
|
}
|
|
|
|
@Override
|
|
- public Object clone() throws CloneNotSupportedException {
|
|
- HttpRequestBase clone = (HttpRequestBase) super.clone();
|
|
- clone.abortLock = new ReentrantLock();
|
|
- clone.aborted = false;
|
|
- clone.cancellable = null;
|
|
- clone.headergroup = CloneUtils.cloneObject(this.headergroup);
|
|
- clone.params = CloneUtils.cloneObject(this.params);
|
|
- return clone;
|
|
- }
|
|
-
|
|
- @Override
|
|
public String toString() {
|
|
return getMethod() + " " + getURI() + " " + getProtocolVersion();
|
|
}
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java (working copy)
|
|
@@ -37,6 +37,7 @@
|
|
import org.apache.http.HttpHost;
|
|
import org.apache.http.HttpRequest;
|
|
import org.apache.http.HttpRequestInterceptor;
|
|
+import org.apache.http.HttpResponse;
|
|
import org.apache.http.HttpResponseInterceptor;
|
|
import org.apache.http.annotation.GuardedBy;
|
|
import org.apache.http.annotation.ThreadSafe;
|
|
@@ -821,6 +822,7 @@
|
|
}
|
|
|
|
try {
|
|
+ HttpResponse response = director.execute(target, request, execContext);
|
|
if (connectionBackoffStrategy != null && backoffManager != null) {
|
|
HttpHost targetForRoute = (target != null) ? target
|
|
: (HttpHost) determineParams(request).getParameter(
|
|
@@ -830,7 +832,7 @@
|
|
CloseableHttpResponse out;
|
|
try {
|
|
out = CloseableHttpResponseProxy.newProxy(
|
|
- director.execute(target, request, execContext));
|
|
+ response);
|
|
} catch (RuntimeException re) {
|
|
if (connectionBackoffStrategy.shouldBackoff(re)) {
|
|
backoffManager.backOff(route);
|
|
@@ -852,7 +854,7 @@
|
|
return out;
|
|
} else {
|
|
return CloseableHttpResponseProxy.newProxy(
|
|
- director.execute(target, request, execContext));
|
|
+ response);
|
|
}
|
|
} catch(HttpException httpException) {
|
|
throw new ClientProtocolException(httpException);
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java (working copy)
|
|
@@ -76,7 +76,7 @@
|
|
|
|
if (userPrincipal == null) {
|
|
HttpConnection conn = clientContext.getConnection();
|
|
- if (conn instanceof SocketClientConnection) {
|
|
+ if (conn instanceof SocketClientConnection && conn.isOpen()) {
|
|
SSLSession sslsession = ((SocketClientConnection) conn).getSSLSession();
|
|
if (sslsession != null) {
|
|
userPrincipal = sslsession.getLocalPrincipal();
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java (working copy)
|
|
@@ -163,7 +163,7 @@
|
|
private ServiceUnavailableRetryStrategy serviceUnavailStrategy;
|
|
private Lookup<AuthSchemeProvider> authSchemeRegistry;
|
|
private Lookup<CookieSpecProvider> cookieSpecRegistry;
|
|
- private Map<String, AuthSchemeProvider> authShemes;
|
|
+ private Map<String, AuthSchemeProvider> authSchemes;
|
|
private Map<String, CookieSpecProvider> cookieSpecs;
|
|
private CookieStore cookieStore;
|
|
private CredentialsProvider credentialsProvider;
|
|
@@ -362,10 +362,10 @@
|
|
|
|
public final HttpClientBuilder registerAuthScheme(
|
|
final String name, final AuthSchemeProvider authSchemeProvider) {
|
|
- if (this.authShemes == null) {
|
|
- this.authShemes = new HashMap<String, AuthSchemeProvider>();
|
|
+ if (this.authSchemes == null) {
|
|
+ this.authSchemes = new HashMap<String, AuthSchemeProvider>();
|
|
}
|
|
- this.authShemes.put(name, authSchemeProvider);
|
|
+ this.authSchemes.put(name, authSchemeProvider);
|
|
return this;
|
|
}
|
|
|
|
@@ -653,8 +653,8 @@
|
|
.register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
|
|
.register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
|
|
.build();
|
|
- if (authShemes != null) {
|
|
- for (Map.Entry<String, AuthSchemeProvider> entry: authShemes.entrySet()) {
|
|
+ if (authSchemes != null) {
|
|
+ for (Map.Entry<String, AuthSchemeProvider> entry: authSchemes.entrySet()) {
|
|
b.register(entry.getKey(), entry.getValue());
|
|
}
|
|
}
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java (working copy)
|
|
@@ -171,6 +171,9 @@
|
|
config = ((Configurable) request).getConfig();
|
|
}
|
|
if (config == null) {
|
|
+ config = localcontext.getRequestConfig();
|
|
+ }
|
|
+ if (config == null) {
|
|
config = this.defaultConfig;
|
|
}
|
|
if (config == null) {
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java (working copy)
|
|
@@ -34,8 +34,10 @@
|
|
|
|
import org.apache.http.annotation.Immutable;
|
|
import org.apache.http.config.ConnectionConfig;
|
|
+import org.apache.http.config.MessageConstraints;
|
|
import org.apache.http.conn.HttpConnectionFactory;
|
|
import org.apache.http.conn.SocketClientConnection;
|
|
+import org.apache.http.impl.io.DefaultSessionBufferImplFactory;
|
|
|
|
/**
|
|
* @since 4.3
|
|
@@ -62,11 +64,17 @@
|
|
charencoder.onMalformedInput(malformedInputAction);
|
|
charencoder.onUnmappableCharacter(unmappableInputAction);
|
|
}
|
|
+ return create(chardecoder, charencoder, cconfig.getMessageConstraints());
|
|
+ }
|
|
+
|
|
+ protected SocketClientConnection create(CharsetDecoder chardecoder,
|
|
+ CharsetEncoder charencoder, MessageConstraints messageConstraints) {
|
|
return new SocketClientConnectionImpl(8 * 1024,
|
|
chardecoder, charencoder,
|
|
- cconfig.getMessageConstraints(),
|
|
+ messageConstraints,
|
|
null, null, null,
|
|
- DefaultHttpResponseParserFactory.INSTANCE);
|
|
+ DefaultHttpResponseParserFactory.INSTANCE,
|
|
+ DefaultSessionBufferImplFactory.INSTANCE);
|
|
}
|
|
|
|
}
|
|
Index: httpclient/httpclient/src/main/java/org/apache/http/impl/conn/SocketClientConnectionImpl.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/main/java/org/apache/http/impl/conn/SocketClientConnectionImpl.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/main/java/org/apache/http/impl/conn/SocketClientConnectionImpl.java (working copy)
|
|
@@ -50,11 +50,12 @@
|
|
import org.apache.http.conn.SocketClientConnection;
|
|
import org.apache.http.entity.ContentLengthStrategy;
|
|
import org.apache.http.impl.DefaultBHttpClientConnection;
|
|
+import org.apache.http.impl.io.SessionBufferImplFactory;
|
|
import org.apache.http.io.HttpMessageParserFactory;
|
|
import org.apache.http.io.HttpMessageWriterFactory;
|
|
import org.apache.http.protocol.HttpContext;
|
|
|
|
-class SocketClientConnectionImpl extends DefaultBHttpClientConnection
|
|
+public class SocketClientConnectionImpl extends DefaultBHttpClientConnection
|
|
implements SocketClientConnection, HttpContext {
|
|
|
|
private static final AtomicLong COUNT = new AtomicLong();
|
|
@@ -67,27 +68,27 @@
|
|
|
|
private volatile boolean shutdown;
|
|
|
|
- public SocketClientConnectionImpl(
|
|
- int buffersize,
|
|
- final CharsetDecoder chardecoder,
|
|
- final CharsetEncoder charencoder,
|
|
+ public SocketClientConnectionImpl(int buffersize,
|
|
+ final CharsetDecoder chardecoder, final CharsetEncoder charencoder,
|
|
final MessageConstraints constraints,
|
|
final ContentLengthStrategy incomingContentStrategy,
|
|
final ContentLengthStrategy outgoingContentStrategy,
|
|
final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
|
|
- final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
|
|
- super(buffersize, chardecoder, charencoder,
|
|
- constraints, incomingContentStrategy, outgoingContentStrategy,
|
|
- requestWriterFactory, responseParserFactory);
|
|
+ final HttpMessageParserFactory<HttpResponse> responseParserFactory,
|
|
+ final SessionBufferImplFactory sessionBufferFactory) {
|
|
+ super(buffersize, chardecoder, charencoder, constraints,
|
|
+ incomingContentStrategy, outgoingContentStrategy,
|
|
+ requestWriterFactory, responseParserFactory,
|
|
+ sessionBufferFactory);
|
|
this.id = "http-outgoing-" + COUNT.incrementAndGet();
|
|
this.log = LogFactory.getLog(getClass());
|
|
this.headerlog = LogFactory.getLog("org.apache.http.headers");
|
|
this.wire = new Wire(LogFactory.getLog("org.apache.http.wire"), this.id);
|
|
- this.attributes = new ConcurrentHashMap<String, Object>();
|
|
+ this.attributes = new ConcurrentHashMap<String,Object>();
|
|
}
|
|
|
|
public SocketClientConnectionImpl(int buffersize) {
|
|
- this(buffersize, null, null, null, null, null, null, null);
|
|
+ this(buffersize, null, null, null, null, null, null, null, null);
|
|
}
|
|
|
|
@Override
|
|
Index: httpclient/httpclient/src/test/java/org/apache/http/impl/conn/SessionInputBufferMock.java
|
|
===================================================================
|
|
--- httpclient/httpclient/src/test/java/org/apache/http/impl/conn/SessionInputBufferMock.java (revision 1427037)
|
|
+++ httpclient/httpclient/src/test/java/org/apache/http/impl/conn/SessionInputBufferMock.java (working copy)
|
|
@@ -51,7 +51,11 @@
|
|
final MessageConstraints constrains,
|
|
final CharsetDecoder decoder) {
|
|
super(new HttpTransportMetricsImpl(), buffersize, -1, constrains, decoder);
|
|
- bind(instream);
|
|
+ try {
|
|
+ bind(instream);
|
|
+ } catch (IOException e) {
|
|
+ throw new RuntimeException(e);
|
|
+ }
|
|
}
|
|
|
|
public SessionInputBufferMock(
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java (working copy)
|
|
@@ -55,9 +55,11 @@
|
|
import org.apache.http.impl.io.ChunkedOutputStream;
|
|
import org.apache.http.impl.io.ContentLengthInputStream;
|
|
import org.apache.http.impl.io.ContentLengthOutputStream;
|
|
+import org.apache.http.impl.io.DefaultSessionBufferImplFactory;
|
|
import org.apache.http.impl.io.HttpTransportMetricsImpl;
|
|
import org.apache.http.impl.io.IdentityInputStream;
|
|
import org.apache.http.impl.io.IdentityOutputStream;
|
|
+import org.apache.http.impl.io.SessionBufferImplFactory;
|
|
import org.apache.http.impl.io.SessionInputBufferImpl;
|
|
import org.apache.http.impl.io.SessionOutputBufferImpl;
|
|
import org.apache.http.io.SessionInputBuffer;
|
|
@@ -99,6 +101,7 @@
|
|
* {@link LaxContentLengthStrategy#INSTANCE} will be used.
|
|
* @param outgoingContentStrategy outgoing content length strategy. If <code>null</code>
|
|
* {@link StrictContentLengthStrategy#INSTANCE} will be used.
|
|
+ * @param sessionBufferFactory
|
|
*/
|
|
protected BHttpConnectionBase(
|
|
int buffersize,
|
|
@@ -106,14 +109,16 @@
|
|
final CharsetEncoder charencoder,
|
|
final MessageConstraints constraints,
|
|
final ContentLengthStrategy incomingContentStrategy,
|
|
- final ContentLengthStrategy outgoingContentStrategy) {
|
|
+ final ContentLengthStrategy outgoingContentStrategy,
|
|
+ final SessionBufferImplFactory sessionBufferFactory) {
|
|
super();
|
|
Args.positive(buffersize, "Buffer size");
|
|
HttpTransportMetricsImpl inTransportMetrics = new HttpTransportMetricsImpl();
|
|
HttpTransportMetricsImpl outTransportMetrics = new HttpTransportMetricsImpl();
|
|
- this.inbuffer = new SessionInputBufferImpl(inTransportMetrics, buffersize, -1,
|
|
+ SessionBufferImplFactory sbf = sessionBufferFactory != null ? sessionBufferFactory : DefaultSessionBufferImplFactory.INSTANCE;
|
|
+ this.inbuffer = sbf.createInputBuffer(inTransportMetrics, buffersize, -1,
|
|
constraints != null ? constraints : MessageConstraints.DEFAULT, chardecoder);
|
|
- this.outbuffer = new SessionOutputBufferImpl(outTransportMetrics, buffersize, -1,
|
|
+ this.outbuffer = sbf.createOutputBuffer(outTransportMetrics, buffersize, -1,
|
|
charencoder);
|
|
this.connMetrics = new HttpConnectionMetricsImpl(inTransportMetrics, outTransportMetrics);
|
|
this.incomingContentStrategy = incomingContentStrategy != null ? incomingContentStrategy :
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpClientConnection.java (working copy)
|
|
@@ -47,6 +47,7 @@
|
|
import org.apache.http.impl.entity.StrictContentLengthStrategy;
|
|
import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
|
|
import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
|
|
+import org.apache.http.impl.io.SessionBufferImplFactory;
|
|
import org.apache.http.io.HttpMessageParser;
|
|
import org.apache.http.io.HttpMessageParserFactory;
|
|
import org.apache.http.io.HttpMessageWriter;
|
|
@@ -83,6 +84,7 @@
|
|
* {@link DefaultHttpRequestWriterFactory#INSTANCE} will be used.
|
|
* @param responseParserFactory response parser factory. If <code>null</code>
|
|
* {@link DefaultHttpResponseParserFactory#INSTANCE} will be used.
|
|
+ * @param sessionBufferFactory
|
|
*/
|
|
public DefaultBHttpClientConnection(
|
|
int buffersize,
|
|
@@ -92,9 +94,11 @@
|
|
final ContentLengthStrategy incomingContentStrategy,
|
|
final ContentLengthStrategy outgoingContentStrategy,
|
|
final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
|
|
- final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
|
|
- super(buffersize, chardecoder, charencoder,
|
|
- constraints, incomingContentStrategy, outgoingContentStrategy);
|
|
+ final HttpMessageParserFactory<HttpResponse> responseParserFactory,
|
|
+ final SessionBufferImplFactory sessionBufferFactory) {
|
|
+ super(buffersize, chardecoder, charencoder, constraints,
|
|
+ incomingContentStrategy, outgoingContentStrategy,
|
|
+ sessionBufferFactory);
|
|
this.requestWriter = (requestWriterFactory != null ? requestWriterFactory :
|
|
DefaultHttpRequestWriterFactory.INSTANCE).create(getSessionOutputBuffer());
|
|
this.responseParser = (responseParserFactory != null ? responseParserFactory :
|
|
@@ -106,11 +110,11 @@
|
|
final CharsetDecoder chardecoder,
|
|
final CharsetEncoder charencoder,
|
|
final MessageConstraints constraints) {
|
|
- this(buffersize, chardecoder, charencoder, constraints, null, null, null, null);
|
|
+ this(buffersize, chardecoder, charencoder, constraints, null, null, null, null, null);
|
|
}
|
|
|
|
public DefaultBHttpClientConnection(int buffersize) {
|
|
- this(buffersize, null, null, null, null, null, null, null);
|
|
+ this(buffersize, null, null, null, null, null, null, null, null);
|
|
}
|
|
|
|
protected void onResponseReceived(final HttpResponse response) {
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/DefaultBHttpServerConnection.java (working copy)
|
|
@@ -94,7 +94,7 @@
|
|
final HttpMessageWriterFactory<HttpResponse> responseWriterFactory) {
|
|
super(buffersize, chardecoder, charencoder, constraints,
|
|
incomingContentStrategy != null ? incomingContentStrategy :
|
|
- DisallowIdentityContentLengthStrategy.INSTANCE, outgoingContentStrategy);
|
|
+ DisallowIdentityContentLengthStrategy.INSTANCE, outgoingContentStrategy, null);
|
|
this.requestParser = (requestParserFactory != null ? requestParserFactory :
|
|
DefaultHttpRequestParserFactory.INSTANCE).create(getSessionInputBuffer(), constraints);
|
|
this.responseWriter = (responseWriterFactory != null ? responseWriterFactory :
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/io/DefaultSessionBufferImplFactory.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/io/DefaultSessionBufferImplFactory.java (revision 0)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/io/DefaultSessionBufferImplFactory.java (working copy)
|
|
@@ -0,0 +1,25 @@
|
|
+package org.apache.http.impl.io;
|
|
+
|
|
+import java.nio.charset.CharsetDecoder;
|
|
+import java.nio.charset.CharsetEncoder;
|
|
+
|
|
+import org.apache.http.config.MessageConstraints;
|
|
+
|
|
+public class DefaultSessionBufferImplFactory implements SessionBufferImplFactory {
|
|
+
|
|
+ public static final SessionBufferImplFactory INSTANCE = new DefaultSessionBufferImplFactory();
|
|
+
|
|
+ @Override
|
|
+ public SessionInputBufferImpl createInputBuffer(
|
|
+ HttpTransportMetricsImpl metrics, int buffersize, int minChunkLimit,
|
|
+ MessageConstraints constraints, CharsetDecoder chardecoder) {
|
|
+ return new SessionInputBufferImpl(metrics, buffersize, minChunkLimit, constraints, chardecoder);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public SessionOutputBufferImpl createOutputBuffer(
|
|
+ HttpTransportMetricsImpl metrics, int buffersize, int minChunkLimit,
|
|
+ CharsetEncoder charencoder) {
|
|
+ return new SessionOutputBufferImpl(metrics, buffersize, minChunkLimit, charencoder);
|
|
+ }
|
|
+}
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionBufferImplFactory.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionBufferImplFactory.java (revision 0)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionBufferImplFactory.java (working copy)
|
|
@@ -0,0 +1,46 @@
|
|
+/*
|
|
+ * ====================================================================
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one
|
|
+ * or more contributor license agreements. See the NOTICE file
|
|
+ * distributed with this work for additional information
|
|
+ * regarding copyright ownership. The ASF licenses this file
|
|
+ * to you under the Apache License, Version 2.0 (the
|
|
+ * "License"); you may not use this file except in compliance
|
|
+ * with the License. You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing,
|
|
+ * software distributed under the License is distributed on an
|
|
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
+ * KIND, either express or implied. See the License for the
|
|
+ * specific language governing permissions and limitations
|
|
+ * under the License.
|
|
+ * ====================================================================
|
|
+ *
|
|
+ * This software consists of voluntary contributions made by many
|
|
+ * individuals on behalf of the Apache Software Foundation. For more
|
|
+ * information on the Apache Software Foundation, please see
|
|
+ * <http://www.apache.org/>.
|
|
+ *
|
|
+ */
|
|
+
|
|
+package org.apache.http.impl.io;
|
|
+
|
|
+import java.nio.charset.CharsetDecoder;
|
|
+import java.nio.charset.CharsetEncoder;
|
|
+
|
|
+import org.apache.http.config.MessageConstraints;
|
|
+
|
|
+/**
|
|
+ * @since 4.3
|
|
+ */
|
|
+public interface SessionBufferImplFactory {
|
|
+
|
|
+ SessionInputBufferImpl createInputBuffer(HttpTransportMetricsImpl metrics,
|
|
+ int buffersize, int minChunkLimit, MessageConstraints constraints,
|
|
+ CharsetDecoder chardecoder);
|
|
+
|
|
+ SessionOutputBufferImpl createOutputBuffer(HttpTransportMetricsImpl metrics,
|
|
+ int buffersize, int i, CharsetEncoder charencoder);
|
|
+}
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionInputBufferImpl.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionInputBufferImpl.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionInputBufferImpl.java (working copy)
|
|
@@ -60,14 +60,14 @@
|
|
@NotThreadSafe
|
|
public class SessionInputBufferImpl implements SessionInputBuffer, BufferInfo {
|
|
|
|
- private final HttpTransportMetricsImpl metrics;
|
|
+ protected final HttpTransportMetricsImpl metrics;
|
|
private final byte[] buffer;
|
|
- private final ByteArrayBuffer linebuffer;
|
|
+ protected final ByteArrayBuffer linebuffer;
|
|
private final int minChunkLimit;
|
|
private final MessageConstraints constraints;
|
|
private final CharsetDecoder decoder;
|
|
|
|
- private InputStream instream;
|
|
+ protected InputStream instream;
|
|
private int bufferpos;
|
|
private int bufferlen;
|
|
private CharBuffer cbuf;
|
|
@@ -105,7 +105,7 @@
|
|
this.decoder = chardecoder;
|
|
}
|
|
|
|
- public void bind(final InputStream instream) {
|
|
+ public void bind(final InputStream instream) throws IOException {
|
|
this.instream = instream;
|
|
}
|
|
|
|
@@ -286,7 +286,7 @@
|
|
* @return HTTP line as a string
|
|
* @exception IOException if an I/O error occurs.
|
|
*/
|
|
- private int lineFromLineBuffer(final CharArrayBuffer charbuffer)
|
|
+ protected int lineFromLineBuffer(final CharArrayBuffer charbuffer)
|
|
throws IOException {
|
|
// discard LF if found
|
|
int len = this.linebuffer.length();
|
|
Index: httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionOutputBufferImpl.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionOutputBufferImpl.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/main/java/org/apache/http/impl/io/SessionOutputBufferImpl.java (working copy)
|
|
@@ -64,7 +64,7 @@
|
|
private final int minChunkLimit;
|
|
private final CharsetEncoder encoder;
|
|
|
|
- private OutputStream outstream;
|
|
+ protected OutputStream outstream;
|
|
private ByteBuffer bbuf;
|
|
|
|
/**
|
|
@@ -94,7 +94,7 @@
|
|
this.encoder = charencoder;
|
|
}
|
|
|
|
- public void bind(final OutputStream outstream) {
|
|
+ public void bind(final OutputStream outstream) throws IOException {
|
|
this.outstream = outstream;
|
|
}
|
|
|
|
Index: httpcore/httpcore/src/test/java/org/apache/http/impl/SessionInputBufferMock.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/test/java/org/apache/http/impl/SessionInputBufferMock.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/test/java/org/apache/http/impl/SessionInputBufferMock.java (working copy)
|
|
@@ -51,7 +51,11 @@
|
|
final MessageConstraints constrains,
|
|
final CharsetDecoder decoder) {
|
|
super(new HttpTransportMetricsImpl(), buffersize, -1, constrains, decoder);
|
|
- bind(instream);
|
|
+ try {
|
|
+ bind(instream);
|
|
+ } catch (IOException e) {
|
|
+ throw new RuntimeException(e);
|
|
+ }
|
|
}
|
|
|
|
public SessionInputBufferMock(
|
|
Index: httpcore/httpcore/src/test/java/org/apache/http/impl/SessionOutputBufferMock.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/test/java/org/apache/http/impl/SessionOutputBufferMock.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/test/java/org/apache/http/impl/SessionOutputBufferMock.java (working copy)
|
|
@@ -28,6 +28,7 @@
|
|
package org.apache.http.impl;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
+import java.io.IOException;
|
|
import java.nio.charset.Charset;
|
|
import java.nio.charset.CharsetEncoder;
|
|
|
|
@@ -50,7 +51,11 @@
|
|
int minChunkLimit,
|
|
final CharsetEncoder encoder) {
|
|
super(new HttpTransportMetricsImpl(), buffersize, minChunkLimit, encoder);
|
|
- bind(buffer);
|
|
+ try {
|
|
+ bind(buffer);
|
|
+ } catch (IOException e) {
|
|
+ throw new RuntimeException(e);
|
|
+ }
|
|
this.buffer = buffer;
|
|
}
|
|
|
|
Index: httpcore/httpcore/src/test/java/org/apache/http/testserver/LoggingBHttpClientConnection.java
|
|
===================================================================
|
|
--- httpcore/httpcore/src/test/java/org/apache/http/testserver/LoggingBHttpClientConnection.java (revision 1427037)
|
|
+++ httpcore/httpcore/src/test/java/org/apache/http/testserver/LoggingBHttpClientConnection.java (working copy)
|
|
@@ -66,7 +66,7 @@
|
|
final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
|
|
super(buffersize, chardecoder, charencoder,
|
|
constraints, incomingContentStrategy, outgoingContentStrategy,
|
|
- requestWriterFactory, responseParserFactory);
|
|
+ requestWriterFactory, responseParserFactory, null);
|
|
this.id = "http-outgoing-" + COUNT.incrementAndGet();
|
|
this.log = LogFactory.getLog(getClass());
|
|
this.headerlog = LogFactory.getLog("org.apache.http.headers");
|