13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.net;
27
28 import java.io.FileDescriptor;
29 import java.io.FileInputStream;
30 import java.io.IOException;
31 import java.nio.channels.FileChannel;
32
33 import sun.net.ConnectionResetException;
34
35 /**
36 * This stream extends FileInputStream to implement a
37 * SocketInputStream. Note that this class should <b>NOT</b> be
38 * public.
39 *
40 * @author Jonathan Payne
41 * @author Arthur van Hoff
42 */
43 class SocketInputStream extends FileInputStream
44 {
45 static {
46 init();
47 }
48
49 private boolean eof;
50 private AbstractPlainSocketImpl impl = null;
51 private byte temp[];
52 private Socket socket = null;
105 */
106 public int read(byte b[]) throws IOException {
107 return read(b, 0, b.length);
108 }
109
110 /**
111 * Reads into a byte array <i>b</i> at offset <i>off</i>,
112 * <i>length</i> bytes of data.
113 * @param b the buffer into which the data is read
114 * @param off the start offset of the data
115 * @param length the maximum number of bytes read
116 * @return the actual number of bytes read, -1 is
117 * returned when the end of the stream is reached.
118 * @exception IOException If an I/O error has occurred.
119 */
120 public int read(byte b[], int off, int length) throws IOException {
121 return read(b, off, length, impl.getTimeout());
122 }
123
124 int read(byte b[], int off, int length, int timeout) throws IOException {
125 int n;
126
127 // EOF already encountered
128 if (eof) {
129 return -1;
130 }
131
132 // connection reset
133 if (impl.isConnectionReset()) {
134 throw new SocketException("Connection reset");
135 }
136
137 // bounds check
138 if (length <= 0 || off < 0 || off + length > b.length) {
139 if (length == 0) {
140 return 0;
141 }
142 throw new ArrayIndexOutOfBoundsException();
143 }
144
145 boolean gotReset = false;
146
147 // acquire file descriptor and do the read
148 FileDescriptor fd = impl.acquireFD();
149 try {
150 n = socketRead0(fd, b, off, length, timeout);
151 if (n > 0) {
152 return n;
153 }
154 } catch (ConnectionResetException rstExc) {
155 gotReset = true;
156 } finally {
157 impl.releaseFD();
158 }
159
160 /*
161 * We receive a "connection reset" but there may be bytes still
162 * buffered on the socket
163 */
164 if (gotReset) {
165 impl.setConnectionResetPending();
166 impl.acquireFD();
167 try {
168 n = socketRead0(fd, b, off, length, timeout);
169 if (n > 0) {
170 return n;
171 }
172 } catch (ConnectionResetException rstExc) {
173 } finally {
174 impl.releaseFD();
175 }
176 }
177
178 /*
179 * If we get here we are at EOF, the socket has been closed,
180 * or the connection has been reset.
181 */
182 if (impl.isClosedOrPending()) {
183 throw new SocketException("Socket closed");
184 }
185 if (impl.isConnectionResetPending()) {
186 impl.setConnectionReset();
187 }
188 if (impl.isConnectionReset()) {
189 throw new SocketException("Connection reset");
190 }
191 eof = true;
192 return -1;
193 }
194
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.net;
27
28 import java.io.FileDescriptor;
29 import java.io.FileInputStream;
30 import java.io.IOException;
31 import java.nio.channels.FileChannel;
32
33 import sun.misc.IoTrace;
34 import sun.net.ConnectionResetException;
35
36 /**
37 * This stream extends FileInputStream to implement a
38 * SocketInputStream. Note that this class should <b>NOT</b> be
39 * public.
40 *
41 * @author Jonathan Payne
42 * @author Arthur van Hoff
43 */
44 class SocketInputStream extends FileInputStream
45 {
46 static {
47 init();
48 }
49
50 private boolean eof;
51 private AbstractPlainSocketImpl impl = null;
52 private byte temp[];
53 private Socket socket = null;
106 */
107 public int read(byte b[]) throws IOException {
108 return read(b, 0, b.length);
109 }
110
111 /**
112 * Reads into a byte array <i>b</i> at offset <i>off</i>,
113 * <i>length</i> bytes of data.
114 * @param b the buffer into which the data is read
115 * @param off the start offset of the data
116 * @param length the maximum number of bytes read
117 * @return the actual number of bytes read, -1 is
118 * returned when the end of the stream is reached.
119 * @exception IOException If an I/O error has occurred.
120 */
121 public int read(byte b[], int off, int length) throws IOException {
122 return read(b, off, length, impl.getTimeout());
123 }
124
125 int read(byte b[], int off, int length, int timeout) throws IOException {
126 int n = 0;
127
128 // EOF already encountered
129 if (eof) {
130 return -1;
131 }
132
133 // connection reset
134 if (impl.isConnectionReset()) {
135 throw new SocketException("Connection reset");
136 }
137
138 // bounds check
139 if (length <= 0 || off < 0 || off + length > b.length) {
140 if (length == 0) {
141 return 0;
142 }
143 throw new ArrayIndexOutOfBoundsException();
144 }
145
146 boolean gotReset = false;
147
148 Object traceHandle = IoTrace.socketReadBegin(impl.address, impl.port, timeout);
149 // acquire file descriptor and do the read
150 FileDescriptor fd = impl.acquireFD();
151 try {
152 n = socketRead0(fd, b, off, length, timeout);
153 if (n > 0) {
154 return n;
155 }
156 } catch (ConnectionResetException rstExc) {
157 gotReset = true;
158 } finally {
159 impl.releaseFD();
160 IoTrace.socketReadEnd(traceHandle, n);
161 }
162
163 /*
164 * We receive a "connection reset" but there may be bytes still
165 * buffered on the socket
166 */
167 if (gotReset) {
168 traceHandle = IoTrace.socketReadBegin(impl.address, impl.port, timeout);
169 impl.setConnectionResetPending();
170 impl.acquireFD();
171 try {
172 n = socketRead0(fd, b, off, length, timeout);
173 if (n > 0) {
174 return n;
175 }
176 } catch (ConnectionResetException rstExc) {
177 } finally {
178 impl.releaseFD();
179 IoTrace.socketReadEnd(traceHandle, n);
180 }
181 }
182
183 /*
184 * If we get here we are at EOF, the socket has been closed,
185 * or the connection has been reset.
186 */
187 if (impl.isClosedOrPending()) {
188 throw new SocketException("Socket closed");
189 }
190 if (impl.isConnectionResetPending()) {
191 impl.setConnectionReset();
192 }
193 if (impl.isConnectionReset()) {
194 throw new SocketException("Connection reset");
195 }
196 eof = true;
197 return -1;
198 }
199
|