19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.http; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.Header; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpConnection; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpClientConnection; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpConnectionMetrics; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpEntity; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpEntityEnclosingRequest; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpException; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpInetConnection; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpRequest; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpResponse; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpResponseFactory; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.NoHttpResponseException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.StatusLine; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.entity.BasicHttpEntity; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.entity.ContentLengthStrategy; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.DefaultHttpResponseFactory; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.HttpConnectionMetricsImpl; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.entity.EntitySerializer; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.entity.StrictContentLengthStrategy; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.ChunkedInputStream; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.ContentLengthInputStream; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.HttpRequestWriter; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.IdentityInputStream; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.SocketInputBuffer; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.io.SocketOutputBuffer; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.io.HttpMessageWriter; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.io.SessionInputBuffer; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.io.SessionOutputBuffer; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.message.BasicLineParser; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.message.ParserCursor; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.params.CoreConnectionPNames; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.params.HttpConnectionParams; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.params.HttpParams; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.ParseException; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.util.CharArrayBuffer; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetAddress; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.SocketException; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A alternate class for (@link DefaultHttpClientConnection). 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It has better performance than DefaultHttpClientConnection 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AndroidHttpClientConnection 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements HttpInetConnection, HttpConnection { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SessionInputBuffer inbuffer = null; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SessionOutputBuffer outbuffer = null; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int maxHeaderCount; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // store CoreConnectionPNames.MAX_LINE_LENGTH for performance 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int maxLineLength; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final EntitySerializer entityserializer; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HttpMessageWriter requestWriter = null; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HttpConnectionMetricsImpl metrics = null; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile boolean open; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Socket socket = null; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AndroidHttpClientConnection() { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.entityserializer = new EntitySerializer( 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new StrictContentLengthStrategy()); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bind socket and set HttpParams to AndroidHttpClientConnection 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param socket outgoing socket 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params HttpParams 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void bind( 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Socket socket, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HttpParams params) throws IOException { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (socket == null) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Socket may not be null"); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params == null) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("HTTP parameters may not be null"); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotOpen(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project socket.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(params)); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project socket.setSoTimeout(HttpConnectionParams.getSoTimeout(params)); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int linger = HttpConnectionParams.getLinger(params); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (linger >= 0) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project socket.setSoLinger(linger > 0, linger); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.socket = socket; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int buffersize = HttpConnectionParams.getSocketBufferSize(params); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.inbuffer = new SocketInputBuffer(socket, buffersize, params); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.outbuffer = new SocketOutputBuffer(socket, buffersize, params); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeaderCount = params.getIntParameter( 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CoreConnectionPNames.MAX_HEADER_COUNT, -1); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxLineLength = params.getIntParameter( 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CoreConnectionPNames.MAX_LINE_LENGTH, -1); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.requestWriter = new HttpRequestWriter(outbuffer, null, params); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.metrics = new HttpConnectionMetricsImpl( 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inbuffer.getMetrics(), 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outbuffer.getMetrics()); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.open = true; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder buffer = new StringBuilder(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append(getClass().getSimpleName()).append("["); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isOpen()) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append(getRemotePort()); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append("closed"); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append("]"); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer.toString(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void assertNotOpen() { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.open) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("Connection is already open"); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void assertOpen() { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!this.open) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("Connection is not open"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOpen() { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to make this method useful, we want to check if the socket is connected 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (this.open && this.socket != null && this.socket.isConnected()); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InetAddress getLocalAddress() { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.socket.getLocalAddress(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLocalPort() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.socket.getLocalPort(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InetAddress getRemoteAddress() { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.socket.getInetAddress(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRemotePort() { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.socket.getPort(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSocketTimeout(int timeout) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.socket.setSoTimeout(timeout); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (SocketException ignore) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It is not quite clear from the original documentation if there are any 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // other legitimate cases for a socket exception to be thrown when setting 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SO_TIMEOUT besides the socket being already closed 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSocketTimeout() { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.socket != null) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.socket.getSoTimeout(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (SocketException ignore) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void shutdown() throws IOException { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.open = false; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Socket tmpsocket = this.socket; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tmpsocket != null) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpsocket.close(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!this.open) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.open = false; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doFlush(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.socket.shutdownOutput(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ignore) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.socket.shutdownInput(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ignore) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (UnsupportedOperationException ignore) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if one isn't supported, the other one isn't either 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.socket.close(); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends the request line and all headers over the connection. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param request the request whose headers to send. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws HttpException 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendRequestHeader(final HttpRequest request) 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws HttpException, IOException { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (request == null) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("HTTP request may not be null"); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.requestWriter.write(request); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.metrics.incrementRequestCount(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends the request entity over the connection. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param request the request whose entity to send. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws HttpException 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendRequestEntity(final HttpEntityEnclosingRequest request) 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws HttpException, IOException { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (request == null) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("HTTP request may not be null"); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (request.getEntity() == null) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.entityserializer.serialize( 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.outbuffer, 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project request, 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project request.getEntity()); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void doFlush() throws IOException { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.outbuffer.flush(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void flush() throws IOException { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doFlush(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parses the response headers and adds them to the 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given {@code headers} object, and returns the response StatusLine 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param headers store parsed header to headers. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return StatusLine 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see HttpClientConnection#receiveResponseHeader() 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public StatusLine parseResponseHeader(Headers headers) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, ParseException { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharArrayBuffer current = new CharArrayBuffer(64); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inbuffer.readLine(current) == -1) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NoHttpResponseException("The target server failed to respond"); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create the status line from the status string 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusLine statusline = BasicLineParser.DEFAULT.parseStatusLine( 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current, new ParserCursor(0, current.length())); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (HttpLog.LOGV) HttpLog.v("read: " + statusline); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int statusCode = statusline.getStatusCode(); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parse header body 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharArrayBuffer previous = null; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int headerNumber = 0; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(true) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (current == null) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current = new CharArrayBuffer(64); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This must be he buffer used to parse the status 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current.clear(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int l = inbuffer.readLine(current); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (l == -1 || current.length() < 1) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parse the header name and value 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for folded headers first 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Detect LWS-char see HTTP/1.0 or HTTP/1.1 Section 2.2 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // discussion on folded headers 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char first = current.charAt(0); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((first == ' ' || first == '\t') && previous != null) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we have continuation folded header 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so append value 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int start = 0; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = current.length(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (start < length) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char ch = current.charAt(start); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ch != ' ' && ch != '\t') { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start++; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxLineLength > 0 && 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project previous.length() + 1 + current.length() - start > 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxLineLength) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("Maximum line length limit exceeded"); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project previous.append(' '); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project previous.append(current, start, current.length() - start); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (previous != null) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project headers.parseHeader(previous); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project headerNumber++; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project previous = current; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current = null; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxHeaderCount > 0 && headerNumber >= maxHeaderCount) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("Maximum header count exceeded"); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (previous != null) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project headers.parseHeader(previous); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (statusCode >= 200) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.metrics.incrementResponseCount(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return statusline; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the next response entity. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param headers contains values for parsing entity 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see HttpClientConnection#receiveResponseEntity(HttpResponse response) 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public HttpEntity receiveResponseEntity(final Headers headers) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BasicHttpEntity entity = new BasicHttpEntity(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long len = determineLength(headers); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len == ContentLengthStrategy.CHUNKED) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setChunked(true); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContentLength(-1); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContent(new ChunkedInputStream(inbuffer)); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (len == ContentLengthStrategy.IDENTITY) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setChunked(false); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContentLength(-1); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContent(new IdentityInputStream(inbuffer)); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setChunked(false); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContentLength(len); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContent(new ContentLengthInputStream(inbuffer, len)); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String contentTypeHeader = headers.getContentType(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentTypeHeader != null) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContentType(contentTypeHeader); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String contentEncodingHeader = headers.getContentEncoding(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentEncodingHeader != null) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entity.setContentEncoding(contentEncodingHeader); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return entity; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long determineLength(final Headers headers) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long transferEncoding = headers.getTransferEncoding(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We use Transfer-Encoding if present and ignore Content-Length. 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // RFC2616, 4.4 item number 3 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transferEncoding < Headers.NO_TRANSFER_ENCODING) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return transferEncoding; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long contentlen = headers.getContentLength(); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentlen > Headers.NO_CONTENT_LENGTH) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return contentlen; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ContentLengthStrategy.IDENTITY; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this connection has gone down. 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Network connections may get closed during some time of inactivity 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for several reasons. The next time a read is attempted on such a 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection it will throw an IOException. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method tries to alleviate this inconvenience by trying to 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * find out if a connection is still usable. Implementations may do 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that by attempting a read with a very small timeout. Thus this 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method may block for a small amount of time before returning a result. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is therefore an <i>expensive</i> operation. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return <code>true</code> if attempts to use this connection are 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * likely to succeed, or <code>false</code> if they are likely 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to fail and this connection should be closed 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStale() { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertOpen(); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.inbuffer.isDataAvailable(1); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ex) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a collection of connection metrcis 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return HttpConnectionMetrics 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public HttpConnectionMetrics getMetrics() { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.metrics; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 465