diff options
Diffstat (limited to 'mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java')
-rw-r--r-- | mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java b/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java new file mode 100644 index 000000000..72f2f7e87 --- /dev/null +++ b/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java @@ -0,0 +1,283 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ + +package ch.boye.httpclientandroidlib.impl; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; + +import ch.boye.httpclientandroidlib.HttpInetConnection; +import ch.boye.httpclientandroidlib.annotation.NotThreadSafe; +import ch.boye.httpclientandroidlib.impl.io.SocketInputBuffer; +import ch.boye.httpclientandroidlib.impl.io.SocketOutputBuffer; +import ch.boye.httpclientandroidlib.io.SessionInputBuffer; +import ch.boye.httpclientandroidlib.io.SessionOutputBuffer; +import ch.boye.httpclientandroidlib.params.CoreConnectionPNames; +import ch.boye.httpclientandroidlib.params.HttpParams; +import ch.boye.httpclientandroidlib.util.Args; +import ch.boye.httpclientandroidlib.util.Asserts; + +/** + * Implementation of a client-side HTTP connection that can be bound to an + * arbitrary {@link Socket} for receiving data from and transmitting data to + * a remote server. + * + * @since 4.0 + * + * @deprecated (4.3) use {@link DefaultBHttpClientConnection} + */ +@NotThreadSafe +@Deprecated +public class SocketHttpClientConnection + extends AbstractHttpClientConnection implements HttpInetConnection { + + private volatile boolean open; + private volatile Socket socket = null; + + public SocketHttpClientConnection() { + super(); + } + + protected void assertNotOpen() { + Asserts.check(!this.open, "Connection is already open"); + } + + @Override + protected void assertOpen() { + Asserts.check(this.open, "Connection is not open"); + } + + /** + * Creates an instance of {@link SocketInputBuffer} to be used for + * receiving data from the given {@link Socket}. + * <p> + * This method can be overridden in a super class in order to provide + * a custom implementation of {@link SessionInputBuffer} interface. + * + * @see SocketInputBuffer#SocketInputBuffer(Socket, int, HttpParams) + * + * @param socket the socket. + * @param buffersize the buffer size. + * @param params HTTP parameters. + * @return session input buffer. + * @throws IOException in case of an I/O error. + */ + protected SessionInputBuffer createSessionInputBuffer( + final Socket socket, + final int buffersize, + final HttpParams params) throws IOException { + return new SocketInputBuffer(socket, buffersize, params); + } + + /** + * Creates an instance of {@link SessionOutputBuffer} to be used for + * sending data to the given {@link Socket}. + * <p> + * This method can be overridden in a super class in order to provide + * a custom implementation of {@link SocketOutputBuffer} interface. + * + * @see SocketOutputBuffer#SocketOutputBuffer(Socket, int, HttpParams) + * + * @param socket the socket. + * @param buffersize the buffer size. + * @param params HTTP parameters. + * @return session output buffer. + * @throws IOException in case of an I/O error. + */ + protected SessionOutputBuffer createSessionOutputBuffer( + final Socket socket, + final int buffersize, + final HttpParams params) throws IOException { + return new SocketOutputBuffer(socket, buffersize, params); + } + + /** + * Binds this connection to the given {@link Socket}. This socket will be + * used by the connection to send and receive data. + * <p> + * This method will invoke {@link #createSessionInputBuffer(Socket, int, HttpParams)} + * and {@link #createSessionOutputBuffer(Socket, int, HttpParams)} methods + * to create session input / output buffers bound to this socket and then + * will invoke {@link #init(SessionInputBuffer, SessionOutputBuffer, HttpParams)} + * method to pass references to those buffers to the underlying HTTP message + * parser and formatter. + * <p> + * After this method's execution the connection status will be reported + * as open and the {@link #isOpen()} will return <code>true</code>. + * + * @param socket the socket. + * @param params HTTP parameters. + * @throws IOException in case of an I/O error. + */ + protected void bind( + final Socket socket, + final HttpParams params) throws IOException { + Args.notNull(socket, "Socket"); + Args.notNull(params, "HTTP parameters"); + this.socket = socket; + + final int buffersize = params.getIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, -1); + init( + createSessionInputBuffer(socket, buffersize, params), + createSessionOutputBuffer(socket, buffersize, params), + params); + + this.open = true; + } + + public boolean isOpen() { + return this.open; + } + + protected Socket getSocket() { + return this.socket; + } + + public InetAddress getLocalAddress() { + if (this.socket != null) { + return this.socket.getLocalAddress(); + } else { + return null; + } + } + + public int getLocalPort() { + if (this.socket != null) { + return this.socket.getLocalPort(); + } else { + return -1; + } + } + + public InetAddress getRemoteAddress() { + if (this.socket != null) { + return this.socket.getInetAddress(); + } else { + return null; + } + } + + public int getRemotePort() { + if (this.socket != null) { + return this.socket.getPort(); + } else { + return -1; + } + } + + public void setSocketTimeout(final int timeout) { + assertOpen(); + if (this.socket != null) { + try { + this.socket.setSoTimeout(timeout); + } catch (final SocketException ignore) { + // It is not quite clear from the Sun's documentation if there are any + // other legitimate cases for a socket exception to be thrown when setting + // SO_TIMEOUT besides the socket being already closed + } + } + } + + public int getSocketTimeout() { + if (this.socket != null) { + try { + return this.socket.getSoTimeout(); + } catch (final SocketException ignore) { + return -1; + } + } else { + return -1; + } + } + + public void shutdown() throws IOException { + this.open = false; + final Socket tmpsocket = this.socket; + if (tmpsocket != null) { + tmpsocket.close(); + } + } + + public void close() throws IOException { + if (!this.open) { + return; + } + this.open = false; + final Socket sock = this.socket; + try { + doFlush(); + try { + try { + sock.shutdownOutput(); + } catch (final IOException ignore) { + } + try { + sock.shutdownInput(); + } catch (final IOException ignore) { + } + } catch (final UnsupportedOperationException ignore) { + // if one isn't supported, the other one isn't either + } + } finally { + sock.close(); + } + } + + private static void formatAddress(final StringBuilder buffer, final SocketAddress socketAddress) { + if (socketAddress instanceof InetSocketAddress) { + final InetSocketAddress addr = ((InetSocketAddress) socketAddress); + buffer.append(addr.getAddress() != null ? addr.getAddress().getHostAddress() : + addr.getAddress()) + .append(':') + .append(addr.getPort()); + } else { + buffer.append(socketAddress); + } + } + + @Override + public String toString() { + if (this.socket != null) { + final StringBuilder buffer = new StringBuilder(); + final SocketAddress remoteAddress = this.socket.getRemoteSocketAddress(); + final SocketAddress localAddress = this.socket.getLocalSocketAddress(); + if (remoteAddress != null && localAddress != null) { + formatAddress(buffer, localAddress); + buffer.append("<->"); + formatAddress(buffer, remoteAddress); + } + return buffer.toString(); + } else { + return super.toString(); + } + } + +} |