1/* 2 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 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 26package sun.net.httpserver; 27 28import java.io.*; 29import java.net.*; 30import com.sun.net.httpserver.*; 31import com.sun.net.httpserver.spi.*; 32 33/** 34 * a class which allows the caller to read up to a defined 35 * number of bytes off an underlying stream 36 * close() does not close the underlying stream 37 */ 38 39class FixedLengthInputStream extends LeftOverInputStream { 40 private long remaining; 41 42 FixedLengthInputStream (ExchangeImpl t, InputStream src, long len) { 43 super (t, src); 44 this.remaining = len; 45 } 46 47 protected int readImpl (byte[]b, int off, int len) throws IOException { 48 49 eof = (remaining == 0L); 50 if (eof) { 51 return -1; 52 } 53 if (len > remaining) { 54 len = (int)remaining; 55 } 56 int n = in.read(b, off, len); 57 if (n > -1) { 58 remaining -= n; 59 if (remaining == 0) { 60 t.getServerImpl().requestCompleted (t.getConnection()); 61 } 62 } 63 return n; 64 } 65 66 public int available () throws IOException { 67 if (eof) { 68 return 0; 69 } 70 int n = in.available(); 71 return n < remaining? n: (int)remaining; 72 } 73 74 public boolean markSupported () {return false;} 75 76 public void mark (int l) { 77 } 78 79 public void reset () throws IOException { 80 throw new IOException ("mark/reset not supported"); 81 } 82} 83