Source code: org/apache/http/impl/io/SocketHttpDataReceiver.java
1 /*
2 * $HeadURL: https://svn.apache.org/repos/asf/jakarta/httpcomponents/httpcore/tags/4.0-alpha2/src/java/org/apache/http/impl/io/SocketHttpDataReceiver.java $
3 * $Revision: 376961 $
4 * $Date: 2006-02-11 11:32:50 +0100 (Sat, 11 Feb 2006) $
5 *
6 * ====================================================================
7 *
8 * Copyright 1999-2006 The Apache Software Foundation
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ====================================================================
22 *
23 * This software consists of voluntary contributions made by many
24 * individuals on behalf of the Apache Software Foundation. For more
25 * information on the Apache Software Foundation, please see
26 * <http://www.apache.org/>.
27 *
28 */
29
30 package org.apache.http.impl.io;
31
32 import java.io.IOException;
33 import java.io.InterruptedIOException;
34 import java.net.Socket;
35
36
37 /**
38 * A data receiver using a Java {@link Socket} and traditional IO.
39 *
40 * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
41 *
42 * @version $Revision: 376961 $
43 *
44 * @since 4.0
45 */
46 public class SocketHttpDataReceiver extends AbstractHttpDataReceiver {
47
48 static private final Class SOCKET_TIMEOUT_CLASS = SocketTimeoutExceptionClass();
49
50 /**
51 * Returns <code>SocketTimeoutExceptionClass<code> or <code>null</code> if the class
52 * does not exist.
53 *
54 * @return <code>SocketTimeoutExceptionClass<code>, or <code>null</code> if unavailable.
55 */
56 static private Class SocketTimeoutExceptionClass() {
57 try {
58 return Class.forName("java.net.SocketTimeoutException");
59 } catch (ClassNotFoundException e) {
60 return null;
61 }
62 }
63
64 private static boolean isSocketTimeoutException(final InterruptedIOException e) {
65 if (SOCKET_TIMEOUT_CLASS != null) {
66 return SOCKET_TIMEOUT_CLASS.isInstance(e);
67 } else {
68 return true;
69 }
70 }
71
72 private final Socket socket;
73
74 public SocketHttpDataReceiver(final Socket socket, int buffersize) throws IOException {
75 super();
76 if (socket == null) {
77 throw new IllegalArgumentException("Socket may not be null");
78 }
79 this.socket = socket;
80 if (buffersize < 0) {
81 buffersize = socket.getReceiveBufferSize();
82 }
83 if (buffersize < 1024) {
84 buffersize = 1024;
85 }
86 init(socket.getInputStream(), buffersize);
87 }
88
89 public boolean isDataAvailable(int timeout) throws IOException {
90 boolean result = hasBufferedData();
91 if (!result) {
92 int oldtimeout = this.socket.getSoTimeout();
93 try {
94 this.socket.setSoTimeout(timeout);
95 fillBuffer();
96 result = hasBufferedData();
97 } catch (InterruptedIOException e) {
98 if (!isSocketTimeoutException(e)) {
99 throw e;
100 }
101 } finally {
102 socket.setSoTimeout(oldtimeout);
103 }
104 }
105 return result;
106 }
107
108 }