HTTPCLIENT-1374: Added public default ManagedHttpClientConnection impl

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1494675 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2013-06-19 16:07:10 +00:00
parent 3956b9f30f
commit c72ac38d2e
3 changed files with 156 additions and 73 deletions

View File

@ -0,0 +1,132 @@
/*
* ====================================================================
* 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.conn;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.Socket;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.config.MessageConstraints;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.entity.ContentLengthStrategy;
import org.apache.http.impl.DefaultBHttpClientConnection;
import org.apache.http.io.HttpMessageParserFactory;
import org.apache.http.io.HttpMessageWriterFactory;
import org.apache.http.protocol.HttpContext;
/**
* @since 4.3
*/
public class DefaultManagedHttpClientConnection extends DefaultBHttpClientConnection
implements ManagedHttpClientConnection, HttpContext {
private final String id;
private final Map<String, Object> attributes;
private volatile boolean shutdown;
public DefaultManagedHttpClientConnection(
final String id,
final int buffersize,
final int fragmentSizeHint,
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, fragmentSizeHint, chardecoder, charencoder,
constraints, incomingContentStrategy, outgoingContentStrategy,
requestWriterFactory, responseParserFactory);
this.id = id;
this.attributes = new ConcurrentHashMap<String, Object>();
}
public DefaultManagedHttpClientConnection(
final String id,
final int buffersize) {
this(id, buffersize, buffersize, null, null, null, null, null, null, null);
}
public String getId() {
return this.id;
}
@Override
public void shutdown() throws IOException {
this.shutdown = true;
super.shutdown();
}
public Object getAttribute(final String id) {
return this.attributes.get(id);
}
public Object removeAttribute(final String id) {
return this.attributes.remove(id);
}
public void setAttribute(final String id, final Object obj) {
this.attributes.put(id, obj);
}
@Override
public void bind(final Socket socket) throws IOException {
if (this.shutdown) {
socket.close(); // allow this to throw...
// ...but if it doesn't, explicitly throw one ourselves.
throw new InterruptedIOException("Connection already shutdown");
}
super.bind(socket);
}
@Override
public Socket getSocket() {
return super.getSocket();
}
public SSLSession getSSLSession() {
final Socket socket = super.getSocket();
if (socket instanceof SSLSocket) {
return ((SSLSocket) socket).getSession();
} else {
return null;
}
}
}

View File

@ -27,19 +27,6 @@
package org.apache.http.impl.conn; package org.apache.http.impl.conn;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpRequest; import org.apache.http.HttpRequest;
@ -52,18 +39,25 @@ import org.apache.http.io.HttpMessageParserFactory;
import org.apache.http.io.HttpMessageWriterFactory; import org.apache.http.io.HttpMessageWriterFactory;
import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpContext;
class ManagedHttpClientConnectionImpl extends DefaultBHttpClientConnection import javax.net.ssl.SSLSession;
implements ManagedHttpClientConnection, HttpContext { import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
class LoggingManagedHttpClientConnection extends DefaultManagedHttpClientConnection {
private final String id;
private final Log log; private final Log log;
private final Log headerlog; private final Log headerlog;
private final Wire wire; private final Wire wire;
private final Map<String, Object> attributes;
private volatile boolean shutdown; public LoggingManagedHttpClientConnection(
public ManagedHttpClientConnectionImpl(
final String id, final String id,
final Log log, final Log log,
final Log headerlog, final Log headerlog,
@ -77,24 +71,18 @@ class ManagedHttpClientConnectionImpl extends DefaultBHttpClientConnection
final ContentLengthStrategy outgoingContentStrategy, final ContentLengthStrategy outgoingContentStrategy,
final HttpMessageWriterFactory<HttpRequest> requestWriterFactory, final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
final HttpMessageParserFactory<HttpResponse> responseParserFactory) { final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
super(buffersize, fragmentSizeHint, chardecoder, charencoder, super(id, buffersize, fragmentSizeHint, chardecoder, charencoder,
constraints, incomingContentStrategy, outgoingContentStrategy, constraints, incomingContentStrategy, outgoingContentStrategy,
requestWriterFactory, responseParserFactory); requestWriterFactory, responseParserFactory);
this.id = id;
this.log = log; this.log = log;
this.headerlog = headerlog; this.headerlog = headerlog;
this.wire = new Wire(wirelog, this.id); this.wire = new Wire(wirelog, id);
this.attributes = new ConcurrentHashMap<String, Object>();
}
public String getId() {
return this.id;
} }
@Override @Override
public void close() throws IOException { public void close() throws IOException {
if (this.log.isDebugEnabled()) { if (this.log.isDebugEnabled()) {
this.log.debug(this.id + ": Close connection"); this.log.debug(getId() + ": Close connection");
} }
super.close(); super.close();
} }
@ -102,9 +90,8 @@ class ManagedHttpClientConnectionImpl extends DefaultBHttpClientConnection
@Override @Override
public void shutdown() throws IOException { public void shutdown() throws IOException {
if (this.log.isDebugEnabled()) { if (this.log.isDebugEnabled()) {
this.log.debug(this.id + ": Shutdown connection"); this.log.debug(getId() + ": Shutdown connection");
} }
this.shutdown = true;
super.shutdown(); super.shutdown();
} }
@ -129,10 +116,10 @@ class ManagedHttpClientConnectionImpl extends DefaultBHttpClientConnection
@Override @Override
protected void onResponseReceived(final HttpResponse response) { protected void onResponseReceived(final HttpResponse response) {
if (response != null && this.headerlog.isDebugEnabled()) { if (response != null && this.headerlog.isDebugEnabled()) {
this.headerlog.debug(this.id + " << " + response.getStatusLine().toString()); this.headerlog.debug(getId() + " << " + response.getStatusLine().toString());
final Header[] headers = response.getAllHeaders(); final Header[] headers = response.getAllHeaders();
for (final Header header : headers) { for (final Header header : headers) {
this.headerlog.debug(this.id + " << " + header.toString()); this.headerlog.debug(getId() + " << " + header.toString());
} }
} }
} }
@ -140,48 +127,12 @@ class ManagedHttpClientConnectionImpl extends DefaultBHttpClientConnection
@Override @Override
protected void onRequestSubmitted(final HttpRequest request) { protected void onRequestSubmitted(final HttpRequest request) {
if (request != null && this.headerlog.isDebugEnabled()) { if (request != null && this.headerlog.isDebugEnabled()) {
this.headerlog.debug(id + " >> " + request.getRequestLine().toString()); this.headerlog.debug(getId() + " >> " + request.getRequestLine().toString());
final Header[] headers = request.getAllHeaders(); final Header[] headers = request.getAllHeaders();
for (final Header header : headers) { for (final Header header : headers) {
this.headerlog.debug(this.id + " >> " + header.toString()); this.headerlog.debug(getId() + " >> " + header.toString());
} }
} }
} }
public Object getAttribute(final String id) {
return this.attributes.get(id);
}
public Object removeAttribute(final String id) {
return this.attributes.remove(id);
}
public void setAttribute(final String id, final Object obj) {
this.attributes.put(id, obj);
}
@Override
public void bind(final Socket socket) throws IOException {
if (this.shutdown) {
socket.close(); // allow this to throw...
// ...but if it doesn't, explicitly throw one ourselves.
throw new InterruptedIOException("Connection already shutdown");
}
super.bind(socket);
}
@Override
public Socket getSocket() {
return super.getSocket();
}
public SSLSession getSSLSession() {
final Socket socket = super.getSocket();
if (socket instanceof SSLSocket) {
return ((SSLSocket) socket).getSession();
} else {
return null;
}
}
} }

View File

@ -57,7 +57,7 @@ public class ManagedHttpClientConnectionFactory
public static final ManagedHttpClientConnectionFactory INSTANCE = new ManagedHttpClientConnectionFactory(); public static final ManagedHttpClientConnectionFactory INSTANCE = new ManagedHttpClientConnectionFactory();
private final Log log = LogFactory.getLog(ManagedHttpClientConnectionImpl.class); private final Log log = LogFactory.getLog(DefaultManagedHttpClientConnection.class);
private final Log headerlog = LogFactory.getLog("org.apache.http.headers"); private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
private final Log wirelog = LogFactory.getLog("org.apache.http.wire"); private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
@ -101,7 +101,7 @@ public class ManagedHttpClientConnectionFactory
charencoder.onUnmappableCharacter(unmappableInputAction); charencoder.onUnmappableCharacter(unmappableInputAction);
} }
final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement()); final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
return new ManagedHttpClientConnectionImpl( return new LoggingManagedHttpClientConnection(
id, id,
log, log,
headerlog, headerlog,