1/*
2 * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java $
3 * $Revision: 627457 $
4 * $Date: 2008-02-13 07:14:19 -0800 (Wed, 13 Feb 2008) $
5 *
6 * ====================================================================
7 * Licensed to the Apache Software Foundation (ASF) under one
8 * or more contributor license agreements.  See the NOTICE file
9 * distributed with this work for additional information
10 * regarding copyright ownership.  The ASF licenses this file
11 * to you under the Apache License, Version 2.0 (the
12 * "License"); you may not use this file except in compliance
13 * with the License.  You may obtain a copy of the License at
14 *
15 *   http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing,
18 * software distributed under the License is distributed on an
19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20 * KIND, either express or implied.  See the License for the
21 * specific language governing permissions and limitations
22 * under the License.
23 * ====================================================================
24 *
25 * This software consists of voluntary contributions made by many
26 * individuals on behalf of the Apache Software Foundation.  For more
27 * information on the Apache Software Foundation, please see
28 * <http://www.apache.org/>.
29 *
30 */
31
32package org.apache.http.impl;
33
34import java.io.IOException;
35
36import org.apache.http.HttpClientConnection;
37import org.apache.http.HttpConnectionMetrics;
38import org.apache.http.HttpEntity;
39import org.apache.http.HttpEntityEnclosingRequest;
40import org.apache.http.HttpException;
41import org.apache.http.HttpRequest;
42import org.apache.http.HttpResponse;
43import org.apache.http.HttpResponseFactory;
44import org.apache.http.impl.entity.EntityDeserializer;
45import org.apache.http.impl.entity.EntitySerializer;
46import org.apache.http.impl.entity.LaxContentLengthStrategy;
47import org.apache.http.impl.entity.StrictContentLengthStrategy;
48import org.apache.http.impl.io.HttpRequestWriter;
49import org.apache.http.impl.io.HttpResponseParser;
50import org.apache.http.impl.io.SocketInputBuffer;
51import org.apache.http.io.HttpMessageParser;
52import org.apache.http.io.HttpMessageWriter;
53import org.apache.http.io.SessionInputBuffer;
54import org.apache.http.io.SessionOutputBuffer;
55import org.apache.http.params.HttpParams;
56
57/**
58 * Abstract client-side HTTP connection capable of transmitting and receiving data
59 * using arbitrary {@link SessionInputBuffer} and {@link SessionOutputBuffer}
60 *
61 * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
62 *
63 * @version $Revision: 627457 $
64 *
65 * @since 4.0
66 *
67 * @deprecated Please use {@link java.net.URL#openConnection} instead.
68 *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
69 *     for further details.
70 */
71@Deprecated
72public abstract class AbstractHttpClientConnection implements HttpClientConnection {
73
74    private final EntitySerializer entityserializer;
75    private final EntityDeserializer entitydeserializer;
76
77    private SessionInputBuffer inbuffer = null;
78    private SessionOutputBuffer outbuffer = null;
79    private HttpMessageParser responseParser = null;
80    private HttpMessageWriter requestWriter = null;
81    private HttpConnectionMetricsImpl metrics = null;
82
83
84
85    public AbstractHttpClientConnection() {
86        super();
87        this.entityserializer = createEntitySerializer();
88        this.entitydeserializer = createEntityDeserializer();
89    }
90
91    protected abstract void assertOpen() throws IllegalStateException;
92
93    protected EntityDeserializer createEntityDeserializer() {
94        return new EntityDeserializer(new LaxContentLengthStrategy());
95    }
96
97    protected EntitySerializer createEntitySerializer() {
98        return new EntitySerializer(new StrictContentLengthStrategy());
99    }
100
101    protected HttpResponseFactory createHttpResponseFactory() {
102        return new DefaultHttpResponseFactory();
103    }
104
105    protected HttpMessageParser createResponseParser(
106            final SessionInputBuffer buffer,
107            final HttpResponseFactory responseFactory,
108            final HttpParams params) {
109        // override in derived class to specify a line parser
110        return new HttpResponseParser(buffer, null, responseFactory, params);
111    }
112
113    protected HttpMessageWriter createRequestWriter(
114            final SessionOutputBuffer buffer,
115            final HttpParams params) {
116        // override in derived class to specify a line formatter
117        return new HttpRequestWriter(buffer, null, params);
118    }
119
120    protected void init(
121            final SessionInputBuffer inbuffer,
122            final SessionOutputBuffer outbuffer,
123            final HttpParams params) {
124        if (inbuffer == null) {
125            throw new IllegalArgumentException("Input session buffer may not be null");
126        }
127        if (outbuffer == null) {
128            throw new IllegalArgumentException("Output session buffer may not be null");
129        }
130        this.inbuffer = inbuffer;
131        this.outbuffer = outbuffer;
132        this.responseParser = createResponseParser(
133                inbuffer,
134                createHttpResponseFactory(),
135                params);
136        this.requestWriter = createRequestWriter(
137                outbuffer, params);
138        this.metrics = new HttpConnectionMetricsImpl(
139                inbuffer.getMetrics(),
140                outbuffer.getMetrics());
141    }
142
143    public boolean isResponseAvailable(int timeout) throws IOException {
144        assertOpen();
145        return this.inbuffer.isDataAvailable(timeout);
146    }
147
148    public void sendRequestHeader(final HttpRequest request)
149            throws HttpException, IOException {
150        if (request == null) {
151            throw new IllegalArgumentException("HTTP request may not be null");
152        }
153        assertOpen();
154        this.requestWriter.write(request);
155        this.metrics.incrementRequestCount();
156    }
157
158    public void sendRequestEntity(final HttpEntityEnclosingRequest request)
159            throws HttpException, IOException {
160        if (request == null) {
161            throw new IllegalArgumentException("HTTP request may not be null");
162        }
163        assertOpen();
164        if (request.getEntity() == null) {
165            return;
166        }
167        this.entityserializer.serialize(
168                this.outbuffer,
169                request,
170                request.getEntity());
171    }
172
173    protected void doFlush() throws IOException {
174        this.outbuffer.flush();
175    }
176
177    public void flush() throws IOException {
178        assertOpen();
179        doFlush();
180    }
181
182    public HttpResponse receiveResponseHeader()
183            throws HttpException, IOException {
184        assertOpen();
185        HttpResponse response = (HttpResponse) this.responseParser.parse();
186        if (response.getStatusLine().getStatusCode() >= 200) {
187            this.metrics.incrementResponseCount();
188        }
189        return response;
190    }
191
192    public void receiveResponseEntity(final HttpResponse response)
193            throws HttpException, IOException {
194        if (response == null) {
195            throw new IllegalArgumentException("HTTP response may not be null");
196        }
197        assertOpen();
198        HttpEntity entity = this.entitydeserializer.deserialize(this.inbuffer, response);
199        response.setEntity(entity);
200    }
201
202    public boolean isStale() {
203        if (!isOpen()) {
204            return true;
205        }
206        try {
207            // BEGIN android-added
208            //     don't reuse connections when the socket input stream is exhausted
209            if (inbuffer instanceof SocketInputBuffer) {
210                return ((SocketInputBuffer) inbuffer).isStale();
211            }
212            // END android-added
213            this.inbuffer.isDataAvailable(1);
214            return false;
215        } catch (IOException ex) {
216            return true;
217        }
218    }
219
220    public HttpConnectionMetrics getMetrics() {
221        return this.metrics;
222    }
223
224}
225