package org.apache.http.impl.conn;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseFactory;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.conn.OperatedClientConnection;
import org.apache.http.impl.SocketHttpClientConnection;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.io.SessionOutputBuffer;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.Args;
@Deprecated
public class DefaultClientConnection extends SocketHttpClientConnection
implements OperatedClientConnection, ManagedHttpClientConnection, HttpContext {
private final Log log = LogFactory.getLog(getClass());
private final Log = LogFactory.getLog("org.apache.http.headers");
private final Log wireLog = LogFactory.getLog("org.apache.http.wire");
private volatile Socket socket;
private HttpHost targetHost;
private boolean connSecure;
private volatile boolean shutdown;
private final Map<String, Object> attributes;
public DefaultClientConnection() {
super();
this.attributes = new HashMap<String, Object>();
}
@Override
public String getId() {
return null;
}
@Override
public final HttpHost getTargetHost() {
return this.targetHost;
}
@Override
public final boolean isSecure() {
return this.connSecure;
}
@Override
public final Socket getSocket() {
return this.socket;
}
@Override
public SSLSession getSSLSession() {
if (this.socket instanceof SSLSocket) {
return ((SSLSocket) this.socket).getSession();
} else {
return null;
}
}
@Override
public void opening(final Socket sock, final HttpHost target) throws IOException {
assertNotOpen();
this.socket = sock;
this.targetHost = target;
if (this.shutdown) {
sock.close();
throw new InterruptedIOException("Connection already shutdown");
}
}
@Override
public void openCompleted(final boolean secure, final HttpParams params) throws IOException {
Args.notNull(params, "Parameters");
assertNotOpen();
this.connSecure = secure;
bind(this.socket, params);
}
@Override
public void shutdown() throws IOException {
shutdown = true;
try {
super.shutdown();
if (log.isDebugEnabled()) {
log.debug("Connection " + this + " shut down");
}
final Socket sock = this.socket;
if (sock != null) {
sock.close();
}
} catch (final IOException ex) {
log.debug("I/O error shutting down connection", ex);
}
}
@Override
public void close() throws IOException {
try {
super.close();
if (log.isDebugEnabled()) {
log.debug("Connection " + this + " closed");
}
} catch (final IOException ex) {
log.debug("I/O error closing connection", ex);
}
}
@Override
protected SessionInputBuffer createSessionInputBuffer(
final Socket socket,
final int bufferSize,
final HttpParams params) throws IOException {
SessionInputBuffer inBuffer = super.createSessionInputBuffer(
socket,
bufferSize > 0 ? bufferSize : 8192,
params);
if (wireLog.isDebugEnabled()) {
inBuffer = new LoggingSessionInputBuffer(
inBuffer,
new Wire(wireLog),
HttpProtocolParams.getHttpElementCharset(params));
}
return inBuffer;
}
@Override
protected SessionOutputBuffer createSessionOutputBuffer(
final Socket socket,
final int bufferSize,
final HttpParams params) throws IOException {
SessionOutputBuffer outbuffer = super.createSessionOutputBuffer(
socket,
bufferSize > 0 ? bufferSize : 8192,
params);
if (wireLog.isDebugEnabled()) {
outbuffer = new LoggingSessionOutputBuffer(
outbuffer,
new Wire(wireLog),
HttpProtocolParams.getHttpElementCharset(params));
}
return outbuffer;
}
@Override
protected HttpMessageParser<HttpResponse> createResponseParser(
final SessionInputBuffer buffer,
final HttpResponseFactory responseFactory,
final HttpParams params) {
return new DefaultHttpResponseParser
(buffer, null, responseFactory, params);
}
@Override
public void bind(final Socket socket) throws IOException {
bind(socket, new BasicHttpParams());
}
@Override
public void update(final Socket sock, final HttpHost target,
final boolean secure, final HttpParams params)
throws IOException {
assertOpen();
Args.notNull(target, "Target host");
Args.notNull(params, "Parameters");
if (sock != null) {
this.socket = sock;
bind(sock, params);
}
targetHost = target;
connSecure = secure;
}
@Override
public HttpResponse () throws HttpException, IOException {
final HttpResponse response = super.receiveResponseHeader();
if (log.isDebugEnabled()) {
log.debug("Receiving response: " + response.getStatusLine());
}
if (headerLog.isDebugEnabled()) {
headerLog.debug("<< " + response.getStatusLine().toString());
final Header[] headers = response.getAllHeaders();
for (final Header header : headers) {
headerLog.debug("<< " + header.toString());
}
}
return response;
}
@Override
public void (final HttpRequest request) throws HttpException, IOException {
if (log.isDebugEnabled()) {
log.debug("Sending request: " + request.getRequestLine());
}
super.sendRequestHeader(request);
if (headerLog.isDebugEnabled()) {
headerLog.debug(">> " + request.getRequestLine().toString());
final Header[] headers = request.getAllHeaders();
for (final Header header : headers) {
headerLog.debug(">> " + header.toString());
}
}
}
@Override
public Object getAttribute(final String id) {
return this.attributes.get(id);
}
@Override
public Object removeAttribute(final String id) {
return this.attributes.remove(id);
}
@Override
public void setAttribute(final String id, final Object obj) {
this.attributes.put(id, obj);
}
}