| /* |
| * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java $ |
| * $Revision: 627457 $ |
| * $Date: 2008-02-13 07:14:19 -0800 (Wed, 13 Feb 2008) $ |
| * |
| * ==================================================================== |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| * |
| */ |
| |
| package org.apache.http.impl; |
| |
| import java.io.IOException; |
| |
| import org.apache.http.HttpClientConnection; |
| import org.apache.http.HttpConnectionMetrics; |
| import org.apache.http.HttpEntity; |
| import org.apache.http.HttpEntityEnclosingRequest; |
| import org.apache.http.HttpException; |
| import org.apache.http.HttpRequest; |
| import org.apache.http.HttpResponse; |
| import org.apache.http.HttpResponseFactory; |
| import org.apache.http.impl.entity.EntityDeserializer; |
| import org.apache.http.impl.entity.EntitySerializer; |
| import org.apache.http.impl.entity.LaxContentLengthStrategy; |
| import org.apache.http.impl.entity.StrictContentLengthStrategy; |
| import org.apache.http.impl.io.HttpRequestWriter; |
| import org.apache.http.impl.io.HttpResponseParser; |
| import org.apache.http.io.HttpMessageParser; |
| import org.apache.http.io.HttpMessageWriter; |
| import org.apache.http.io.SessionInputBuffer; |
| import org.apache.http.io.SessionOutputBuffer; |
| import org.apache.http.params.HttpParams; |
| |
| /** |
| * Abstract client-side HTTP connection capable of transmitting and receiving data |
| * using arbitrary {@link SessionInputBuffer} and {@link SessionOutputBuffer} |
| * |
| * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> |
| * |
| * @version $Revision: 627457 $ |
| * |
| * @since 4.0 |
| */ |
| public abstract class AbstractHttpClientConnection implements HttpClientConnection { |
| |
| private final EntitySerializer entityserializer; |
| private final EntityDeserializer entitydeserializer; |
| |
| private SessionInputBuffer inbuffer = null; |
| private SessionOutputBuffer outbuffer = null; |
| private HttpMessageParser responseParser = null; |
| private HttpMessageWriter requestWriter = null; |
| private HttpConnectionMetricsImpl metrics = null; |
| |
| |
| |
| public AbstractHttpClientConnection() { |
| super(); |
| this.entityserializer = createEntitySerializer(); |
| this.entitydeserializer = createEntityDeserializer(); |
| } |
| |
| protected abstract void assertOpen() throws IllegalStateException; |
| |
| protected EntityDeserializer createEntityDeserializer() { |
| return new EntityDeserializer(new LaxContentLengthStrategy()); |
| } |
| |
| protected EntitySerializer createEntitySerializer() { |
| return new EntitySerializer(new StrictContentLengthStrategy()); |
| } |
| |
| protected HttpResponseFactory createHttpResponseFactory() { |
| return new DefaultHttpResponseFactory(); |
| } |
| |
| protected HttpMessageParser createResponseParser( |
| final SessionInputBuffer buffer, |
| final HttpResponseFactory responseFactory, |
| final HttpParams params) { |
| // override in derived class to specify a line parser |
| return new HttpResponseParser(buffer, null, responseFactory, params); |
| } |
| |
| protected HttpMessageWriter createRequestWriter( |
| final SessionOutputBuffer buffer, |
| final HttpParams params) { |
| // override in derived class to specify a line formatter |
| return new HttpRequestWriter(buffer, null, params); |
| } |
| |
| protected void init( |
| final SessionInputBuffer inbuffer, |
| final SessionOutputBuffer outbuffer, |
| final HttpParams params) { |
| if (inbuffer == null) { |
| throw new IllegalArgumentException("Input session buffer may not be null"); |
| } |
| if (outbuffer == null) { |
| throw new IllegalArgumentException("Output session buffer may not be null"); |
| } |
| this.inbuffer = inbuffer; |
| this.outbuffer = outbuffer; |
| this.responseParser = createResponseParser( |
| inbuffer, |
| createHttpResponseFactory(), |
| params); |
| this.requestWriter = createRequestWriter( |
| outbuffer, params); |
| this.metrics = new HttpConnectionMetricsImpl( |
| inbuffer.getMetrics(), |
| outbuffer.getMetrics()); |
| } |
| |
| public boolean isResponseAvailable(int timeout) throws IOException { |
| assertOpen(); |
| return this.inbuffer.isDataAvailable(timeout); |
| } |
| |
| public void sendRequestHeader(final HttpRequest request) |
| throws HttpException, IOException { |
| if (request == null) { |
| throw new IllegalArgumentException("HTTP request may not be null"); |
| } |
| assertOpen(); |
| this.requestWriter.write(request); |
| this.metrics.incrementRequestCount(); |
| } |
| |
| public void sendRequestEntity(final HttpEntityEnclosingRequest request) |
| throws HttpException, IOException { |
| if (request == null) { |
| throw new IllegalArgumentException("HTTP request may not be null"); |
| } |
| assertOpen(); |
| if (request.getEntity() == null) { |
| return; |
| } |
| this.entityserializer.serialize( |
| this.outbuffer, |
| request, |
| request.getEntity()); |
| } |
| |
| protected void doFlush() throws IOException { |
| this.outbuffer.flush(); |
| } |
| |
| public void flush() throws IOException { |
| assertOpen(); |
| doFlush(); |
| } |
| |
| public HttpResponse receiveResponseHeader() |
| throws HttpException, IOException { |
| assertOpen(); |
| HttpResponse response = (HttpResponse) this.responseParser.parse(); |
| if (response.getStatusLine().getStatusCode() >= 200) { |
| this.metrics.incrementResponseCount(); |
| } |
| return response; |
| } |
| |
| public void receiveResponseEntity(final HttpResponse response) |
| throws HttpException, IOException { |
| if (response == null) { |
| throw new IllegalArgumentException("HTTP response may not be null"); |
| } |
| assertOpen(); |
| HttpEntity entity = this.entitydeserializer.deserialize(this.inbuffer, response); |
| response.setEntity(entity); |
| } |
| |
| public boolean isStale() { |
| if (!isOpen()) { |
| return true; |
| } |
| try { |
| this.inbuffer.isDataAvailable(1); |
| return false; |
| } catch (IOException ex) { |
| return true; |
| } |
| } |
| |
| public HttpConnectionMetrics getMetrics() { |
| return this.metrics; |
| } |
| |
| } |