Package org.eclipse.jetty.server
Class HttpInput
- java.lang.Object
-
- java.io.InputStream
-
- javax.servlet.ServletInputStream
-
- org.eclipse.jetty.server.HttpInput
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable,java.lang.Runnable
- Direct Known Subclasses:
HttpInputOverHTTP
public class HttpInput extends javax.servlet.ServletInputStream implements java.lang.RunnableHttpInputprovides an implementation ofServletInputStreamforHttpChannel.Content may arrive in patterns such as [content(), content(), messageComplete()] so that this class maintains two states: the content state that tells whether there is content to consume and the EOF state that tells whether an EOF has arrived. Only once the content has been consumed the content state is moved to the EOF state.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classHttpInput.ChainedInterceptorAnHttpInput.Interceptorthat chains two otherHttpInput.Interceptors together.static classHttpInput.Contentstatic classHttpInput.EofContentprotected static classHttpInput.EOFStateprotected static classHttpInput.ErrorStatestatic interfaceHttpInput.InterceptorAn interceptor for HTTP Request input.static classHttpInput.SentinelContentA Sentinel Content, which has zero length content but indicates some other event in the input stream (eg EOF)protected static classHttpInput.State
-
Field Summary
Fields Modifier and Type Field Description protected static HttpInput.StateAEOFprotected static HttpInput.StateASYNCprotected static HttpInput.StateEARLY_EOFprotected static HttpInput.StateEOFprotected static HttpInput.StateSTREAM
-
Constructor Summary
Constructors Constructor Description HttpInput(HttpChannelState state)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanaddContent(HttpInput.Content content)Adds some content to this input stream.voidaddInterceptor(HttpInput.Interceptor interceptor)Set theHttpInput.Interceptor, using aHttpInput.ChainedInterceptorif anHttpInput.Interceptoris already set.voidasyncReadProduce()Called by channel when asynchronous IO needs to produce more contentintavailable()protected voidblockForContent()Blocks until some content or some end-of-file event arrives.booleanconsumeAll()Consume all available content without blocking.booleanearlyEOF()This method should be called to signal that an EOF has been detected before all the expected content arrived.booleaneof()This method should be called to signal that all the expected content arrived.booleanfailed(java.lang.Throwable x)protected intget(HttpInput.Content content, byte[] buffer, int offset, int length)Copies the given content into the given byte buffer.longgetContentConsumed()longgetContentReceived()protected HttpChannelStategetHttpChannelState()HttpInput.InterceptorgetInterceptor()booleanhasContent()booleanisAsync()booleanisError()booleanisFinished()booleanisReady()protected HttpInput.ContentnextContent()Get the next content from the inputQ, callingproduceContent()if need be.protected HttpInput.ContentnextInterceptedContent()Poll the inputQ for Content or EOF.protected HttpInput.ContentnextNonSentinelContent()Poll the inputQ for Content.booleanonIdleTimeout(java.lang.Throwable x)protected voidproduceContent()Called when derived implementations should attempt to produce more Content and add it viaaddContent(Content).protected HttpInput.ContentproduceNextContent()Get the next readable from the inputQ, callingproduceContent()if need be.intread()intread(byte[] b, int off, int len)voidrecycle()voidrun()voidsetInterceptor(HttpInput.Interceptor interceptor)Set the interceptor.voidsetReadListener(javax.servlet.ReadListener readListener)java.lang.StringtoString()voidunblock()protected voidwake()
-
-
-
Field Detail
-
STREAM
protected static final HttpInput.State STREAM
-
ASYNC
protected static final HttpInput.State ASYNC
-
EARLY_EOF
protected static final HttpInput.State EARLY_EOF
-
EOF
protected static final HttpInput.State EOF
-
AEOF
protected static final HttpInput.State AEOF
-
-
Constructor Detail
-
HttpInput
public HttpInput(HttpChannelState state)
-
-
Method Detail
-
getHttpChannelState
protected HttpChannelState getHttpChannelState()
-
recycle
public void recycle()
-
getInterceptor
public HttpInput.Interceptor getInterceptor()
- Returns:
- The current Interceptor, or null if none set
-
setInterceptor
public void setInterceptor(HttpInput.Interceptor interceptor)
Set the interceptor.- Parameters:
interceptor- The interceptor to use.
-
addInterceptor
public void addInterceptor(HttpInput.Interceptor interceptor)
Set theHttpInput.Interceptor, using aHttpInput.ChainedInterceptorif anHttpInput.Interceptoris already set.- Parameters:
interceptor- the nextHttpInput.Interceptorin a chain
-
available
public int available()
- Overrides:
availablein classjava.io.InputStream
-
wake
protected void wake()
-
read
public int read() throws java.io.IOException- Specified by:
readin classjava.io.InputStream- Throws:
java.io.IOException
-
read
public int read(byte[] b, int off, int len) throws java.io.IOException- Overrides:
readin classjava.io.InputStream- Throws:
java.io.IOException
-
produceContent
protected void produceContent() throws java.io.IOExceptionCalled when derived implementations should attempt to produce more Content and add it viaaddContent(Content). For protocols that are constantly producing (eg HTTP2) this can be left as a noop;- Throws:
java.io.IOException- if unable to produce content
-
asyncReadProduce
public void asyncReadProduce() throws java.io.IOExceptionCalled by channel when asynchronous IO needs to produce more content- Throws:
java.io.IOException- if unable to produce content
-
nextContent
protected HttpInput.Content nextContent() throws java.io.IOException
Get the next content from the inputQ, callingproduceContent()if need be. EOF is processed and state changed.- Returns:
- the content or null if none available.
- Throws:
java.io.IOException- if retrieving the content fails
-
nextNonSentinelContent
protected HttpInput.Content nextNonSentinelContent() throws java.io.IOException
Poll the inputQ for Content. Consumed buffers andHttpInput.SentinelContents are removed and EOF state updated if need be.- Returns:
- Content or null
- Throws:
java.io.IOException
-
produceNextContent
protected HttpInput.Content produceNextContent() throws java.io.IOException
Get the next readable from the inputQ, callingproduceContent()if need be. EOF is NOT processed and state is not changed.- Returns:
- the content or EOF or null if none available.
- Throws:
java.io.IOException- if retrieving the content fails
-
nextInterceptedContent
protected HttpInput.Content nextInterceptedContent() throws java.io.IOException
Poll the inputQ for Content or EOF. Consumed buffers and non EOFHttpInput.SentinelContents are removed. EOF state is not updated. Interception is done within this method.- Returns:
- Content with remaining, a
HttpInput.SentinelContent, or null - Throws:
java.io.IOException
-
get
protected int get(HttpInput.Content content, byte[] buffer, int offset, int length)
Copies the given content into the given byte buffer.- Parameters:
content- the content to copy frombuffer- the buffer to copy intooffset- the buffer offset to start copying fromlength- the space available in the buffer- Returns:
- the number of bytes actually copied
-
blockForContent
protected void blockForContent() throws java.io.IOExceptionBlocks until some content or some end-of-file event arrives.- Throws:
java.io.IOException- if the wait is interrupted
-
addContent
public boolean addContent(HttpInput.Content content)
Adds some content to this input stream.- Parameters:
content- the content to add- Returns:
- true if content channel woken for read
-
hasContent
public boolean hasContent()
-
unblock
public void unblock()
-
getContentConsumed
public long getContentConsumed()
-
getContentReceived
public long getContentReceived()
-
earlyEOF
public boolean earlyEOF()
This method should be called to signal that an EOF has been detected before all the expected content arrived.Typically this will result in an EOFException being thrown from a subsequent read rather than a -1 return.
- Returns:
- true if content channel woken for read
-
eof
public boolean eof()
This method should be called to signal that all the expected content arrived.- Returns:
- true if content channel woken for read
-
consumeAll
public boolean consumeAll()
Consume all available content without blocking. Raw content is counted in thegetContentReceived()statistics, but is not intercepted nor counted in thegetContentConsumed()statistics- Returns:
- True if EOF was reached, false otherwise.
-
isError
public boolean isError()
-
isAsync
public boolean isAsync()
-
isFinished
public boolean isFinished()
- Specified by:
isFinishedin classjavax.servlet.ServletInputStream
-
isReady
public boolean isReady()
- Specified by:
isReadyin classjavax.servlet.ServletInputStream
-
setReadListener
public void setReadListener(javax.servlet.ReadListener readListener)
- Specified by:
setReadListenerin classjavax.servlet.ServletInputStream
-
onIdleTimeout
public boolean onIdleTimeout(java.lang.Throwable x)
-
failed
public boolean failed(java.lang.Throwable x)
-
run
public void run()
- Specified by:
runin interfacejava.lang.Runnable
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
-