1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/* 2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java $ 3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 672969 $ 4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2008-06-30 18:09:50 -0700 (Mon, 30 Jun 2008) $ 5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * this work for additional information regarding copyright ownership. 11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * (the "License"); you may not use this file except in compliance with 13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * the License. You may obtain a copy of the License at 14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * See the License for the specific language governing permissions and 21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * limitations under the License. 22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many 25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation. For more 26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see 27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>. 28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.impl.conn; 32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.IOException; 35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.InterruptedIOException; 36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.net.InetAddress; 37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.net.Socket; 38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.concurrent.TimeUnit; 39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport javax.net.ssl.SSLSocket; 41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport javax.net.ssl.SSLSession; 42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpException; 44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpRequest; 45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpEntityEnclosingRequest; 46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpResponse; 47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HttpConnectionMetrics; 48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.conn.OperatedClientConnection; 49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.conn.ManagedClientConnection; 50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.conn.ClientConnectionManager; 51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/** 54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Abstract adapter from {@link OperatedClientConnection operated} to 55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * {@link ManagedClientConnection managed} client connections. 56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Read and write methods are delegated to the wrapped connection. 57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Operations affecting the connection state have to be implemented 58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * by derived classes. Operations for querying the connection state 59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * are delegated to the wrapped connection if there is one, or 60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * return a default value if there is none. 61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <br/> 62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This adapter tracks the checkpoints for reusable communication states, 63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * as indicated by {@link #markReusable markReusable} and queried by 64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * {@link #isMarkedReusable isMarkedReusable}. 65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * All send and receive operations will automatically clear the mark. 66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <br/> 67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Connection release calls are delegated to the connection manager, 68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * if there is one. {@link #abortConnection abortConnection} will 69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * clear the reusability mark first. The connection manager is 70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * expected to tolerate multiple calls to the release method. 71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:rolandw at apache.org">Roland Weber</a> 73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <!-- empty lines to avoid svn diff problems --> 76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Revision: 672969 $ $Date: 2008-06-30 18:09:50 -0700 (Mon, 30 Jun 2008) $ 77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 4.0 79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic abstract class AbstractClientConnAdapter 81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project implements ManagedClientConnection { 82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** Thread that requested this connection. */ 84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final Thread executionThread; 85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The connection manager, if any. 88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This attribute MUST NOT be final, so the adapter can be detached 89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * from the connection manager without keeping a hard reference there. 90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private volatile ClientConnectionManager connManager; 92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** The wrapped connection. */ 94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private volatile OperatedClientConnection wrappedConnection; 95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** The reusability marker. */ 97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private volatile boolean markedReusable; 98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** True if the connection has been aborted. */ 100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private volatile boolean aborted; 101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** The duration this is valid for while idle (in ms). */ 103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private volatile long duration; 104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Creates a new connection adapter. 107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The adapter is initially <i>not</i> 108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * {@link #isMarkedReusable marked} as reusable. 109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param mgr the connection manager, or <code>null</code> 111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param conn the connection to wrap, or <code>null</code> 112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected AbstractClientConnAdapter(ClientConnectionManager mgr, 114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn) { 115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project executionThread = Thread.currentThread(); 117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project connManager = mgr; 118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project wrappedConnection = conn; 119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project markedReusable = false; 120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project aborted = false; 121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project duration = Long.MAX_VALUE; 122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } // <constructor> 123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Detaches this adapter from the wrapped connection. 127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This adapter becomes useless. 128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected void detach() { 130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project wrappedConnection = null; 131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project connManager = null; // base class attribute 132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project duration = Long.MAX_VALUE; 133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected OperatedClientConnection getWrappedConnection() { 136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return wrappedConnection; 137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected ClientConnectionManager getManager() { 140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return connManager; 141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Asserts that the connection has not been aborted. 145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws InterruptedIOException if the connection has been aborted 147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected final void assertNotAborted() throws InterruptedIOException { 149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (aborted) { 150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new InterruptedIOException("Connection has been shut down."); 151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Asserts that there is a wrapped connection to delegate to. 156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws IllegalStateException if there is no wrapped connection 158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * or connection has been aborted 159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project protected final void assertValid( 161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project final OperatedClientConnection wrappedConn) { 162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (wrappedConn == null) { 163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new IllegalStateException("No wrapped connection."); 164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpConnection 168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean isOpen() { 169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (conn == null) 171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return false; 172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.isOpen(); 174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpConnection 178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean isStale() { 179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (aborted) 180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return true; 181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (conn == null) 183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return true; 184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.isStale(); 186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpConnection 190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void setSocketTimeout(int timeout) { 191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project conn.setSocketTimeout(timeout); 194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpConnection 198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public int getSocketTimeout() { 199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getSocketTimeout(); 202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpConnection 206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public HttpConnectionMetrics getMetrics() { 207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getMetrics(); 210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void flush() 215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws IOException { 216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project conn.flush(); 222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean isResponseAvailable(int timeout) 227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws IOException { 228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.isResponseAvailable(timeout); 234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void receiveResponseEntity(HttpResponse response) 239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws HttpException, IOException { 240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unmarkReusable(); 246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project conn.receiveResponseEntity(response); 247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public HttpResponse receiveResponseHeader() 252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws HttpException, IOException { 253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unmarkReusable(); 259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.receiveResponseHeader(); 260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void sendRequestEntity(HttpEntityEnclosingRequest request) 265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws HttpException, IOException { 266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unmarkReusable(); 272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project conn.sendRequestEntity(request); 273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpClientConnection 277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void sendRequestHeader(HttpRequest request) 278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws HttpException, IOException { 279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertNotAborted(); 281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unmarkReusable(); 285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project conn.sendRequestHeader(request); 286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpInetConnection 290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public InetAddress getLocalAddress() { 291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getLocalAddress(); 294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpInetConnection 297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public int getLocalPort() { 298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getLocalPort(); 301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpInetConnection 305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public InetAddress getRemoteAddress() { 306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getRemoteAddress(); 309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface HttpInetConnection 312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public int getRemotePort() { 313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 315069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.getRemotePort(); 316069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 317069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 318069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ManagedClientConnection 319069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean isSecure() { 320069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 321069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 322069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return conn.isSecure(); 323069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 324069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 325069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ManagedClientConnection 326069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public SSLSession getSSLSession() { 327069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project OperatedClientConnection conn = getWrappedConnection(); 328069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assertValid(conn); 329069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (!isOpen()) 330069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return null; 331069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 332069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project SSLSession result = null; 333069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project Socket sock = conn.getSocket(); 334069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (sock instanceof SSLSocket) { 335069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project result = ((SSLSocket)sock).getSession(); 336069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 337069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return result; 338069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 339069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 340069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ManagedClientConnection 341069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void markReusable() { 342069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project markedReusable = true; 343069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 344069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 345069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ManagedClientConnection 346069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void unmarkReusable() { 347069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project markedReusable = false; 348069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 349069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 350069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ManagedClientConnection 351069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean isMarkedReusable() { 352069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return markedReusable; 353069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 354069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 355069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void setIdleDuration(long duration, TimeUnit unit) { 356069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if(duration > 0) { 357069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.duration = unit.toMillis(duration); 358069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 359069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.duration = -1; 360069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 361069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 362069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 363069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ConnectionReleaseTrigger 364069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void releaseConnection() { 365069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (connManager != null) { 366069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project connManager.releaseConnection(this, duration, TimeUnit.MILLISECONDS); 367069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 368069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 369069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 370069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // non-javadoc, see interface ConnectionReleaseTrigger 371069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public void abortConnection() { 372069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (aborted) { 373069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return; 374069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 375069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project aborted = true; 376069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unmarkReusable(); 377069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project try { 378069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project shutdown(); 379069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } catch (IOException ignore) { 380069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 381069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // Usually #abortConnection() is expected to be called from 382069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // a helper thread in order to unblock the main execution thread 383069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // blocked in an I/O operation. It may be unsafe to call 384069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // #releaseConnection() from the helper thread, so we have to rely 385069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // on an IOException thrown by the closed socket on the main thread 386069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // to trigger the release of the connection back to the 387069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // connection manager. 388069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // 389069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // However, if this method is called from the main execution thread 390069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // it should be safe to release the connection immediately. Besides, 391069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // this also helps ensure the connection gets released back to the 392069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // manager if #abortConnection() is called from the main execution 393069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // thread while there is no blocking I/O operation. 394069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (executionThread.equals(Thread.currentThread())) { 395069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project releaseConnection(); 396069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 397069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 398069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 399069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} // class AbstractClientConnAdapter 400