_contentLength=BufferUtil.toInt(value);
_contentLength=BufferUtil.toLong(value);
    public long parseNext() throws IOException    {        long total_filled=-1;                if (_buffer==null)        {            _header=_buffers.getBuffer(_headerBufferSize);            _buffer=_header;            _tok0=new View(_header);            _tok1=new View(_header);            _tok0.setPutIndex(_tok0.getIndex());            _tok1.setPutIndex(_tok1.getIndex());        }                if (_state == STATE_END) throw new IllegalStateException("STATE_END");        if (_state == STATE_CONTENT && _contentPosition == _contentLength)        {            _state=STATE_END;            _handler.messageComplete(_contentPosition);            return total_filled;        }                int length=_buffer.length();                // Fill buffer if we can        if (length == 0)        {            int filled=-1;            if (_body!=null && _buffer!=_body)            {                _buffer=_body;                filled=_buffer.length();            }                            if (_buffer.markIndex() == 0 && _buffer.putIndex() == _buffer.capacity())                    throw new IOException("FULL");            if (_endp != null && filled<=0)            {                // Compress buffer if handling _content buffer                // TODO check this is not moving data too much                if (_buffer == _body)                     _buffer.compact();                if (_buffer.space() == 0)                 {                       throw new IOException("FULL");                }                                try                {                    if (total_filled<0)                        total_filled=0;                    filled=_endp.fill(_buffer);                    if (filled>0)                        total_filled+=filled;                }                catch(IOException e)                {                    Log.debug(e);                    reset(true);                    throw (e instanceof EofException) ? e:new EofException(e);                }            }                        if (filled < 0 && _state == STATE_EOF_CONTENT)            {                _state=STATE_END;                _handler.messageComplete(_contentPosition);                return total_filled;            }            if (filled < 0)             {                reset(true);                throw new EofException();            }            length=_buffer.length();        }                // EventHandler header        byte ch;        byte[] array=_buffer.array();                while (_state < STATE_END && length-->0)        {            ch=_buffer.get();                        if (_eol == HttpTokens.CARRIAGE_RETURN && ch == HttpTokens.LINE_FEED)            {                _eol=HttpTokens.LINE_FEED;                continue;            }            _eol=0;            switch (_state)            {                case STATE_START:                    _contentLength=HttpTokens.UNKNOWN_CONTENT;                    _cached=null;                    if (ch > HttpTokens.SPACE || ch<0)                    {                        _buffer.mark();                        _state=STATE_FIELD0;                    }                    break;                case STATE_FIELD0:                    if (ch == HttpTokens.SPACE)                    {                        _tok0.update(_buffer.markIndex(), _buffer.getIndex() - 1);                        _state=STATE_SPACE1;                        continue;                    }                    else if (ch < HttpTokens.SPACE && ch>=0)                    {                        throw new HttpException(HttpServletResponse.SC_BAD_REQUEST);                    }                    break;                case STATE_SPACE1:                    if (ch > HttpTokens.SPACE || ch<0)                    {                        _buffer.mark();                        _state=STATE_FIELD1;                        _response=ch >= '1' && ch <= '5';                    }                    else if (ch < HttpTokens.SPACE)                    {                        throw new HttpException(HttpServletResponse.SC_BAD_REQUEST);                    }                    break;                case STATE_FIELD1:                    if (ch == HttpTokens.SPACE)                    {                        _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1);                        _state=STATE_SPACE2;                        continue;                    }                    else if (ch < HttpTokens.SPACE && ch>=0)                    {                        // HTTP/0.9                        _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _buffer                                .sliceFromMark(), null);                        _state=STATE_END;                        _handler.headerComplete();                        _handler.messageComplete(_contentPosition);                        return total_filled;                    }                    break;                case STATE_SPACE2:                    if (ch > HttpTokens.SPACE || ch<0)                    {                        _buffer.mark();                        _state=STATE_FIELD2;                    }                    else if (ch < HttpTokens.SPACE)                    {                        // HTTP/0.9                        _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, null);                        _state=STATE_END;                        _handler.headerComplete();                        _handler.messageComplete(_contentPosition);                        return total_filled;                    }                    break;                case STATE_FIELD2:                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                    {                        if (_response)                            _handler.startResponse(HttpVersions.CACHE.lookup(_tok0), BufferUtil                                    .toInt(_tok1), _buffer.sliceFromMark());                        else                            _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1,                                    HttpVersions.CACHE.lookup(_buffer.sliceFromMark()));                        _eol=ch;                        _state=STATE_HEADER;                        _tok0.setPutIndex(_tok0.getIndex());                        _tok1.setPutIndex(_tok1.getIndex());                        _multiLineValue=null;                        return total_filled;                    }                    break;                case STATE_HEADER:                    if (ch == HttpTokens.COLON || ch == HttpTokens.SPACE || ch == HttpTokens.TAB)                    {                        // header value without name - continuation?                        _length=-1;                        _state=STATE_HEADER_VALUE;                    }                    else                    {                        // handler last header if any                        if (_cached!=null || _tok0.length() > 0 || _tok1.length() > 0 || _multiLineValue != null)                        {                                                        Buffer header=_cached!=null?_cached:HttpHeaders.CACHE.lookup(_tok0);                            _cached=null;                            Buffer value=_multiLineValue == null ? (Buffer) _tok1 : (Buffer) new ByteArrayBuffer(_multiLineValue);                                                        int ho=HttpHeaders.CACHE.getOrdinal(header);                            if (ho >= 0)                            {                                int vo=-1;                                                                 switch (ho)                                {                                    case HttpHeaders.CONTENT_LENGTH_ORDINAL:                                        if (_contentLength != HttpTokens.CHUNKED_CONTENT)                                        {                                            _contentLength=BufferUtil.toInt(value);                                            if (_contentLength <= 0)                                                _contentLength=HttpTokens.NO_CONTENT;                                        }                                        break;                                                                            case HttpHeaders.CONNECTION_ORDINAL:                                        // TODO comma list of connections !!!                                        value=HttpHeaderValues.CACHE.lookup(value);                                        break;                                                                            case HttpHeaders.TRANSFER_ENCODING_ORDINAL:                                        value=HttpHeaderValues.CACHE.lookup(value);                                        vo=HttpHeaderValues.CACHE.getOrdinal(value);                                        if (HttpHeaderValues.CHUNKED_ORDINAL == vo)                                            _contentLength=HttpTokens.CHUNKED_CONTENT;                                        else                                        {                                            String c=value.toString();                                            if (c.endsWith(HttpHeaderValues.CHUNKED))                                                _contentLength=HttpTokens.CHUNKED_CONTENT;                                                                                        else if (c.indexOf(HttpHeaderValues.CHUNKED) >= 0)                                                throw new HttpException(400,null);                                        }                                        break;                                                                            case HttpHeaders.CONTENT_TYPE_ORDINAL:                                        // TODO confirm there are no other cases where _hasContent should be true                                        break;                                }                            }                                                        _handler.parsedHeader(header, value);                            _tok0.setPutIndex(_tok0.getIndex());                            _tok1.setPutIndex(_tok1.getIndex());                            _multiLineValue=null;                        }                                                                        // now handle ch                        if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                        {                            // End of header                            // work out the _content demarcation                            if (_contentLength == HttpTokens.UNKNOWN_CONTENT)                                _contentLength=_response?HttpTokens.EOF_CONTENT:HttpTokens.NO_CONTENT;                            _contentPosition=0;                            _eol=ch;                            switch (_contentLength)                            {                                case HttpTokens.EOF_CONTENT:                                    _state=STATE_EOF_CONTENT;                                    if(_body==null && _buffers!=null)                                        _body=_buffers.getBuffer(_contentBufferSize);                                                                        _handler.headerComplete(); // May recurse here !                                    break;                                                                    case HttpTokens.CHUNKED_CONTENT:                                    _state=STATE_CHUNKED_CONTENT;                                    if (_body==null && _buffers!=null)                                        _body=_buffers.getBuffer(_contentBufferSize);                                    _handler.headerComplete(); // May recurse here !                                    break;                                                                    case HttpTokens.NO_CONTENT:                                    _state=STATE_END;                                    _handler.headerComplete(); // May recurse here !                                    _handler.messageComplete(_contentPosition);                                    break;                                                                    default:                                    _state=STATE_CONTENT;                                	if(_buffers!=null && _body==null && _buffer==_header && _contentLength>(_header.capacity()-_header.getIndex()))                                	    _body=_buffers.getBuffer(_contentBufferSize);                                    _handler.headerComplete(); // May recurse here !                                    break;                            }                            return total_filled;                        }                        else                        {                            // New header                            _length=1;                            _buffer.mark();                            _state=STATE_HEADER_NAME;                                                        // try cached name!                            if (array!=null)                                _cached=HttpHeaders.CACHE.getBest(array, _buffer.markIndex(), length+1);                            if (_cached!=null)                            {                                _length=_cached.length();                                _buffer.setGetIndex(_buffer.markIndex()+_length);                                length=_buffer.length();                            }                        }                    }                    break;                case STATE_HEADER_NAME:                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                    {                        if (_length > 0)                                _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);                        _eol=ch;                        _state=STATE_HEADER;                    }                    else if (ch == HttpTokens.COLON)                    {                        if (_length > 0 && _cached==null)                                _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);                        _length=-1;                        _state=STATE_HEADER_VALUE;                    }                    else if (ch != HttpTokens.SPACE && ch != HttpTokens.TAB)                    {                        // Drag the mark                        if (_length == -1) _buffer.mark();                        _length=_buffer.getIndex() - _buffer.markIndex();                    }                    break;                case STATE_HEADER_VALUE:                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                    {                        if (_length > 0)                        {                            if (_tok1.length() == 0)                                _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);                            else                            {                                // Continuation line!                                if (_multiLineValue == null) _multiLineValue=_tok1.toString();                                _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);                                _multiLineValue += " " + _tok1.toString();                            }                        }                        _eol=ch;                        _state=STATE_HEADER;                    }                    else if (ch != HttpTokens.SPACE && ch != HttpTokens.TAB)                    {                        if (_length == -1) _buffer.mark();                        _length=_buffer.getIndex() - _buffer.markIndex();                    }                    break;            }        } // end of HEADER states loop                // ==========================                // Handle _content        length=_buffer.length();        Buffer chunk;         while (_state > STATE_END && length > 0)        {            if (_eol == HttpTokens.CARRIAGE_RETURN && _buffer.peek() == HttpTokens.LINE_FEED)            {                _eol=_buffer.get();                length=_buffer.length();                continue;            }            _eol=0;            switch (_state)            {                case STATE_EOF_CONTENT:                    chunk=_buffer.get(_buffer.length());                    _contentPosition += chunk.length();                    _contentView.update(chunk);                    _handler.content(chunk);                    // TODO adjust the _buffer to keep unconsumed content                    return total_filled;                case STATE_CONTENT:                 {                    int remaining=_contentLength - _contentPosition;                    if (remaining == 0)                    {                        _state=STATE_END;                        _handler.messageComplete(_contentPosition);                        return total_filled;                    }                    else if (length >= remaining)                     {                        length=remaining;                        _state=STATE_END;                    }                    chunk=_buffer.get(length);                    _contentPosition += chunk.length();                    _contentView.update(chunk);                    _handler.content(chunk);                    // TODO adjust the _buffer to keep unconsumed content                    return total_filled;                }                case STATE_CHUNKED_CONTENT:                {                    ch=_buffer.peek();                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                        _eol=_buffer.get();                    else if (ch <= HttpTokens.SPACE)                        _buffer.get();                    else                    {                        _chunkLength=0;                        _chunkPosition=0;                        _state=STATE_CHUNK_SIZE;                    }                    break;                }                case STATE_CHUNK_SIZE:                {                    ch=_buffer.get();                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                    {                        _eol=ch;                        if (_chunkLength == 0)                        {                            _state=STATE_END;                            _handler.messageComplete(_contentPosition);                            return total_filled;                        }                        else                            _state=STATE_CHUNK;                    }                    else if (ch <= HttpTokens.SPACE || ch == HttpTokens.SEMI_COLON)                        _state=STATE_CHUNK_PARAMS;                    else if (ch >= '0' && ch <= '9')                        _chunkLength=_chunkLength * 16 + (ch - '0');                    else if (ch >= 'a' && ch <= 'f')                        _chunkLength=_chunkLength * 16 + (10 + ch - 'a');                    else if (ch >= 'A' && ch <= 'F')                        _chunkLength=_chunkLength * 16 + (10 + ch - 'A');                    else                        throw new IOException("bad chunk char: " + ch);                    break;                }                case STATE_CHUNK_PARAMS:                {                    ch=_buffer.get();                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)                    {                        _eol=ch;                        if (_chunkLength == 0)                        {                            _state=STATE_END;                            _handler.messageComplete(_contentPosition);                            return total_filled;                        }                        else                            _state=STATE_CHUNK;                    }                    break;                }                                case STATE_CHUNK:                 {                    int remaining=_chunkLength - _chunkPosition;                    if (remaining == 0)                    {                        _state=STATE_CHUNKED_CONTENT;                        break;                    }                    else if (length > remaining)                         length=remaining;                    chunk=_buffer.get(length);                    _contentPosition += chunk.length();                    _chunkPosition += chunk.length();                    _contentView.update(chunk);                    _handler.content(chunk);                    // TODO adjust the _buffer to keep unconsumed content                    return total_filled;                }            }            length=_buffer.length();        }        return total_filled;    }