Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }