## org.apache.coyote.http11
Class InternalNioInputBuffer

    java.lang.Object
      org.apache.coyote.http11.InternalNioInputBuffer

All Implemented Interfaces:
  InputBuffer

    public class InternalNioInputBuffer

extends java.lang.Object
implements InputBuffer

Implementation of InputBuffer which provides HTTP request header parsing as well as transfer decoding.

Author:
  Remy Maucherat, Filip Hanik

Nested Class Summary
`static class` `InternalNioInputBuffer.HeaderParseData`
`protected class` `InternalNioInputBuffer.SocketInputBuffer` This class is an input buffer which will read its data from an input stream.

Field Summary
`protected InputFilter[]` `activeFilters` Active filters (in order).
`protected byte[]` `buf` Pointer to the current read buffer.
`protected int` `end` Pos of the end of the header in the buffer, which is also the start of the body.
`protected InputFilter[]` `filterLibrary` Filter library.
`protected InternalNioInputBuffer.HeaderParseData` `headerData`
`protected org.apache.coyote.http11.InternalNioInputBuffer.HeaderParsePosition` `headerParsePos`
`protected MimeHeaders` `headers` Headers of the associated request.
`protected InputBuffer` `inputStreamInputBuffer` Underlying input buffer.
`protected int` `lastActiveFilter` Index of the last active filter.
`protected int` `lastValid` Last valid byte.
`protected boolean` `parsingHeader` Parsing state - used for non blocking parsing so that when more data arrives, we can pick up where we left off.
`protected boolean` `parsingRequestLine`
`protected boolean` `parsingRequestLineEol`
`protected int` `parsingRequestLinePhase`
`protected int` `parsingRequestLineQPos`
`protected int` `parsingRequestLineStart`
`protected NioSelectorPool` `pool` Selector pool, for blocking reads and blocking writes
`protected int` `pos` Position in the buffer.
`protected Request` `request` Associated Coyote request.
`protected static StringManager` `sm` The string manager for this package.
`protected NioChannel` `socket` Underlying socket.
`protected boolean` `swallowInput` Swallow input ?

Constructor Summary
`InternalNioInputBuffer(Request request, int headerBufferSize)` Alternate constructor.

Method Summary
`void` `addActiveFilter(InputFilter filter)` Add an input filter to the filter library.
`void` `addFilter(InputFilter filter)` Add an input filter to the filter library.
`int` `available()` Available bytes (note that due to encoding, this may not correspond )
`void` `clearFilters()` Clear filters.
`int` `doRead(ByteChunk chunk, Request req)` Read some bytes.
`void` `endRequest()` End request (consumes leftover bytes).
`protected boolean` `fill(boolean timeout, boolean block)` Fill the internal buffer using data from the undelying input stream.
`InputFilter[]` `getFilters()` Get filters.
`NioSelectorPool` `getSelectorPool()`
`NioChannel` `getSocket()` Get the underlying socket input stream.
`boolean` `isReadable()` Returns true if there are bytes available from the socket layer
`int` `nbRead()` Issues a non blocking read
`void` `nextRequest()` End processing of current HTTP request.
`org.apache.coyote.http11.InternalNioInputBuffer.HeaderParseStatus` `parseHeader()` Parse an HTTP header.
`boolean` `parseHeaders()` Parse the HTTP headers.
`boolean` `parseRequestLine(boolean useAvailableData)` Read the request line.
`void` `recycle()` Recycle the input buffer.
`void` `setSelectorPool(NioSelectorPool pool)`
`void` `setSocket(NioChannel socket)` Set the underlying socket.
`void` `setSwallowInput(boolean swallowInput)` Set the swallow input flag.

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### sm

    protected static StringManager sm

  The string manager for this package.

### request

    protected Request request

  Associated Coyote request.

### headers

    protected MimeHeaders headers

  Headers of the associated request.

### parsingHeader

    protected boolean parsingHeader

  Parsing state - used for non blocking parsing so that when more data arrives, we can pick up where we left off.

### parsingRequestLine

    protected boolean parsingRequestLine

### parsingRequestLinePhase

    protected int parsingRequestLinePhase

### parsingRequestLineEol

    protected boolean parsingRequestLineEol

### parsingRequestLineStart

    protected int parsingRequestLineStart

### parsingRequestLineQPos

    protected int parsingRequestLineQPos

### headerParsePos

    protected org.apache.coyote.http11.InternalNioInputBuffer.HeaderParsePosition headerParsePos

### swallowInput

    protected boolean swallowInput

  Swallow input ? (in the case of an expectation)

### buf

    protected byte[] buf

  Pointer to the current read buffer.

### lastValid

    protected int lastValid

  Last valid byte.

### pos

    protected int pos

  Position in the buffer.

### end

    protected int end

  Pos of the end of the header in the buffer, which is also the start of the body.

### socket

    protected NioChannel socket

  Underlying socket.

### pool

    protected NioSelectorPool pool

  Selector pool, for blocking reads and blocking writes

### inputStreamInputBuffer

    protected InputBuffer inputStreamInputBuffer

  Underlying input buffer.

### filterLibrary

    protected InputFilter[] filterLibrary

  Filter library. Note: Filter[0] is always the "chunked" filter.

### activeFilters

    protected InputFilter[] activeFilters

  Active filters (in order).

### lastActiveFilter

    protected int lastActiveFilter

  Index of the last active filter.

### headerData

    protected InternalNioInputBuffer.HeaderParseData headerData

Constructor Detail

### InternalNioInputBuffer

    public InternalNioInputBuffer(Request request,
                                  int headerBufferSize)

  Alternate constructor.

Method Detail

### setSocket

    public void setSocket(NioChannel socket)

  Set the underlying socket.

### getSocket

    public NioChannel getSocket()

  Get the underlying socket input stream.

### setSelectorPool

    public void setSelectorPool(NioSelectorPool pool)

### getSelectorPool

    public NioSelectorPool getSelectorPool()

### addFilter

    public void addFilter(InputFilter filter)

  Add an input filter to the filter library.

### getFilters

    public InputFilter[] getFilters()

  Get filters.

### clearFilters

    public void clearFilters()

  Clear filters.

### addActiveFilter

    public void addActiveFilter(InputFilter filter)

  Add an input filter to the filter library.

### setSwallowInput

    public void setSwallowInput(boolean swallowInput)

  Set the swallow input flag.

### isReadable

    public boolean isReadable()
                       throws java.io.IOException

  Returns true if there are bytes available from the socket layer

  Returns:
    boolean
  Throws:
    `java.io.IOException`

### nbRead

    public int nbRead()
               throws java.io.IOException

  Issues a non blocking read

  Returns:
    int
  Throws:
    `java.io.IOException`

### recycle

    public void recycle()

  Recycle the input buffer. This should be called when closing the connection.

### nextRequest

    public void nextRequest()

  End processing of current HTTP request. Note: All bytes of the current request should have been already consumed. This method only resets all the pointers so that we are ready to parse the next HTTP request.

### endRequest

    public void endRequest()
                    throws java.io.IOException

  End request (consumes leftover bytes).

  Throws:
    `java.io.IOException` - an undelying I/O error occured

### parseRequestLine

    public boolean parseRequestLine(boolean useAvailableData)
                             throws java.io.IOException

  Read the request line. This function is meant to be used during the HTTP request header parsing. Do NOT attempt to read the request body using it.

  Returns:
    true if data is properly fed; false if no data is available immediately and thread should be freed
  Throws:
    `java.io.IOException` - If an exception occurs during the underlying socket read operations, or if the given buffer is not big enough to accomodate the whole line.

### parseHeaders

    public boolean parseHeaders()
                         throws java.io.IOException

  Parse the HTTP headers.

  Throws:
    `java.io.IOException`

### parseHeader

    public org.apache.coyote.http11.InternalNioInputBuffer.HeaderParseStatus parseHeader()
                                                                                  throws java.io.IOException

  Parse an HTTP header.

  Returns:
    false after reading a blank line (which indicates that the HTTP header parsing is done
  Throws:
    `java.io.IOException`

### available

    public int available()

  Available bytes (note that due to encoding, this may not correspond )

### doRead

    public int doRead(ByteChunk chunk,
                      Request req)
               throws java.io.IOException

  Read some bytes.

  Specified by:
    `doRead` in interface `InputBuffer`
  Throws:
    `java.io.IOException`

### fill

    protected boolean fill(boolean timeout,
                           boolean block)
                    throws java.io.IOException,
                           java.io.EOFException

  Fill the internal buffer using data from the undelying input stream.

  Returns:
    false if at end of stream
  Throws:
    `java.io.IOException`
    `java.io.EOFException`

Copyright © 2000-2008 Apache Software Foundation. All Rights Reserved.