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