|
What this is
Other links
The source code
/*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed 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.
*/
package org.apache.tomcat.facade;
import java.io.IOException;
import javax.servlet.ServletInputStream;
import org.apache.tomcat.core.Request;
/**
* This is the input stream returned by ServletRequest.getInputStream().
* It is the adapter between the ServletInputStream interface expected
* by webapps and Request.doRead() methods.
*
* This will also deal with the "contentLength" limit.
* Important Only the methods in ServletInputStream can be public.
*/
public final class ServletInputStreamFacade extends ServletInputStream {
private int bytesRead = 0;
// Stop after reading ContentLength bytes.
private int limit = -1;
private boolean closed=false;
private Request reqA;
ServletInputStreamFacade() {
}
void prepare() {
int contentLength = reqA.getContentLength();
//System.out.println("ContentLength= " + contentLength);
if (contentLength != -1) {
limit=contentLength;
}
bytesRead=0;
}
void setRequest(Request reqA ) {
this.reqA=reqA;
}
void recycle() {
limit=-1;
closed=false;
}
// -------------------- ServletInputStream methods
public int read() throws IOException {
if( dL>0) debug("read() " + limit + " " + bytesRead );
if(closed)
throw new IOException("Stream closed");
if (limit == -1) {
// Ask the adapter for more data. We are in the 'no content-length'
// case - i.e. chunked encoding ( acording to http spec CL is required
// for everything else.
int rd=reqA.doRead();
if( rd<0 ) {
limit=0; // no more bytes can be read.
} else {
bytesRead++; // for statistics
}
return rd;
}
// We have a limit
if (bytesRead >= limit)
return -1;
bytesRead++;
int rd=reqA.doRead();
if( rd<0 ) {
limit=0; // adapter detected EOF, before C-L finished.
// trust the adapter - if it returns EOF it's unlikely it'll give us
// any more data
}
return rd;
}
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
public int read(byte[] b, int off, int len) throws IOException {
if( dL>0) debug("read(" + len + ") " + limit + " " + bytesRead );
if(closed)
throw new IOException("Stream closed");
if (limit == -1) {
int numRead = reqA.doRead(b, off, len);
if (numRead > 0) {
bytesRead += numRead;
}
if( numRead< 0 ) {
// EOF - stop reading
limit=0;
}
return numRead;
}
if (bytesRead >= limit) {
return -1;
}
if (bytesRead + len > limit) {
len = limit - bytesRead;
}
int numRead = reqA.doRead(b, off, len);
if (numRead > 0) {
bytesRead += numRead;
}
return numRead;
}
public int readLine(byte[] b, int off, int len) throws IOException {
return super.readLine(b, off, len);
}
/** Close the stream
* Since we re-cycle, we can't allow the call to super.close()
* which would permantely disable us.
*/
public void close() {
closed=true;
}
private static int dL=0;
private void debug( String s ) {
System.out.println("ServletInputStreamFacade: " + s );
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.