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