Mercurial Hosting > luan
changeset 1070:a44fc6b53757
fix use of HttpGenerator._buffer
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 10 Nov 2016 01:23:37 -0700 |
parents | 7dd6ec499000 |
children | b4ba8a4d5a16 |
files | src/org/eclipse/jetty/http/HttpGenerator.java src/org/eclipse/jetty/server/AbstractHttpConnection.java |
diffstat | 2 files changed, 50 insertions(+), 85 deletions(-) [+] |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/http/HttpGenerator.java Thu Nov 10 00:42:51 2016 -0700 +++ b/src/org/eclipse/jetty/http/HttpGenerator.java Thu Nov 10 01:23:37 2016 -0700 @@ -178,7 +178,7 @@ // content.clear(); _content = null; } - else if ((_buffer==null || _buffer.remaining()==0) && _content.hasRemaining() && (_last || isCommitted() && _content.remaining()>1024)) + else if ((_buffer.position()==0) && _content.hasRemaining() && (_last || isCommitted() && _content.remaining()>1024)) { _bypass = true; } @@ -186,8 +186,7 @@ { //System.out.println("qqqqqqqqqqqqqqqqqqq c"); // Copy _content to buffer; - int len = _buffer.put(_content); - _content.skip(len); + _buffer.putQ(_content); if (!_content.hasRemaining()) _content = null; } @@ -217,7 +216,7 @@ throw new IllegalStateException("FULL"); } - _contentWritten -= _buffer.remaining(); + _contentWritten -= _buffer.position(); /* // Handle the _content if (_head) @@ -230,7 +229,7 @@ public boolean isBufferFull() { // Should we flush the buffers? - return isBufferFull2() || _bufferChunked || _bypass /* || (_contentLength == HttpTokens.CHUNKED_CONTENT && _buffer != null && _buffer.space() < CHUNK_SPACE)*/; + return isBufferFull2() || _bufferChunked || _bypass /* || (_contentLength == HttpTokens.CHUNKED_CONTENT && _buffer.remaining() < CHUNK_SPACE)*/; } public void send1xx(int code) throws IOException @@ -334,8 +333,7 @@ { _noContent = true; _content = null; - if (_buffer!=null) - _buffer.clearJ(); + _buffer.clear(); // end the header. if (_status!=101 ) @@ -349,8 +347,7 @@ { _noContent = true; _content = null; - if (_buffer!=null) - _buffer.clearJ(); + _buffer.clear(); } } @@ -670,8 +667,10 @@ throw new IllegalStateException(); // should never happen! case 6: _header.flip(); + _buffer.flip(); len = _endp.flush(_header, _buffer, null); _header.compact(); + _buffer.compact(); break; case 5: _header.flip(); @@ -684,35 +683,36 @@ _header.compact(); break; case 3: + _buffer.flip(); len = _endp.flush(_buffer, _content, null); + _buffer.compact(); break; case 2: + _buffer.flip(); len = _endp.flush(_buffer); + _buffer.compact(); break; case 1: len = _endp.flush(_content); break; case 0: { - len=0; + len = 0; // Nothing more we can write now. _header.clear(); _bypass = false; _bufferChunked = false; - if (_buffer != null) + _buffer.clear(); // ? + if (_contentLength == HttpTokens.CHUNKED_CONTENT) { - _buffer.clearJ(); - if (_contentLength == HttpTokens.CHUNKED_CONTENT) + // Special case handling for small left over buffer from + // an addContent that caused a buffer flush. + if (_content != null && _content.remaining() < _buffer.remaining() && _state != STATE_FLUSHING) { - // Special case handling for small left over buffer from - // an addContent that caused a buffer flush. - if (_content != null && _content.remaining() < _buffer.space() && _state != STATE_FLUSHING) - { - _buffer.put(_content); - _content = null; - } + _buffer.putQ(_content); + _content = null; } } @@ -745,14 +745,14 @@ catch (IOException e) { LOG.trace("",e); - throw (e instanceof EofException) ? e:new EofException(e); + throw (e instanceof EofException) ? e : new EofException(e); } } private int flushMask() { return ((_header.position() > 0)?4:0) - | ((_buffer != null && _buffer.remaining() > 0)?2:0) + | ((_buffer.position() > 0)?2:0) | ((_bypass && _content != null && _content.hasRemaining())?1:0); } @@ -762,10 +762,9 @@ if (!_bufferChunked) { // Refill buffer if possible - if (!_bypass && _content != null && _content.hasRemaining() && _buffer != null && _buffer.space() > 0) + if (!_bypass && _content != null && _content.hasRemaining() && _buffer.hasRemaining()) { - int len = _buffer.put(_content); - _content.skip(len); + _buffer.putQ(_content); if (!_content.hasRemaining()) _content = null; } @@ -773,7 +772,7 @@ // Chunk buffer if need be if (_contentLength == HttpTokens.CHUNKED_CONTENT) { - if (_bypass && (_buffer==null||_buffer.remaining()==0) && _content!=null) + if (_bypass && _buffer.position()==0 && _content!=null) { // this is a bypass write int size = _content.remaining(); @@ -793,9 +792,9 @@ // Need a CRLF after the content _needCRLF = true; } - else if (_buffer!=null) + else { - int size = _buffer.remaining(); + int size = _buffer.position(); if (size > 0) { // Prepare a chunk! @@ -811,8 +810,8 @@ _header.putQ(HttpTokens.CRLF); // Add end chunk trailer. - if (_buffer.space() >= 2) - _buffer.put(HttpTokens.CRLF); + if (_buffer.remaining() >= 2) + _buffer.putQ(HttpTokens.CRLF); else _needCRLF = true; } @@ -821,40 +820,18 @@ // If we need EOC and everything written if (_needEOC && (_content == null || !_content.hasRemaining())) { - if (_needCRLF) - { - if (_buffer == null && _header.remaining() >= HttpTokens.CRLF.length) - { - _header.putQ(HttpTokens.CRLF); - _needCRLF = false; - } - else if (_buffer!=null && _buffer.space() >= HttpTokens.CRLF.length) - { - _buffer.put(HttpTokens.CRLF); - _needCRLF = false; - } + if (_needCRLF && _buffer.remaining() >= HttpTokens.CRLF.length) { + _buffer.putQ(HttpTokens.CRLF); + _needCRLF = false; } - if (!_needCRLF && _needEOC) - { - if (_buffer == null && _header.remaining() >= LAST_CHUNK.length) + if (!_needCRLF && _needEOC && _buffer.remaining() >= LAST_CHUNK.length) { + if (!_head) { - if (!_head) - { - _header.putQ(LAST_CHUNK); - _bufferChunked=true; - } - _needEOC = false; + _buffer.putQ(LAST_CHUNK); + _bufferChunked = true; } - else if (_buffer!=null && _buffer.space() >= LAST_CHUNK.length) - { - if (!_head) - { - _buffer.put(LAST_CHUNK); - _bufferChunked=true; - } - _needEOC = false; - } + _needEOC = false; } } } @@ -869,13 +846,13 @@ public String toString() { JBuffer header = _header; - JBuffer buffer=_buffer; + JBuffer buffer = _buffer; JBuffer content = _content; return String.format("%s{s=%d,h=%d,b=%d,c=%d}", getClass().getSimpleName(), _state, header == null ? -1 : header.position(), - buffer == null ? -1 : buffer.remaining(), + buffer == null ? -1 : buffer.position(), content == null ? -1 : content.remaining()); } @@ -930,7 +907,6 @@ this._endp = io; _header = _buffers.getHeader(); _buffer = _buffers.getBuffer(); - _buffer.limit(0); } public final boolean isOpen() @@ -948,8 +924,7 @@ _contentWritten = 0; _contentLength = HttpTokens.UNKNOWN_CONTENT; _content = null; - if (_buffer!=null) - _buffer.clearJ(); + _buffer.clear(); } /* ------------------------------------------------------------ */ @@ -1052,21 +1027,14 @@ public final void completeUncheckedAddContent() { - _contentWritten += _buffer.remaining(); + _contentWritten += _buffer.position(); if (_head) - _buffer.clearJ(); + _buffer.clear(); } private boolean isBufferFull2() { - if (_buffer != null && _buffer.space()==0) - { - if (_buffer.remaining()==0) - _buffer.limit(0); - return _buffer.space()==0; - } - - return _content!=null && _content.remaining()>0; + return !_buffer.hasRemaining() || _content!=null && _content.remaining()>0; } public final boolean isWritten() @@ -1099,18 +1067,18 @@ public final void flush(long maxIdleTime) throws IOException { // block until everything is flushed - long now=System.currentTimeMillis(); - long end=now+maxIdleTime; + long now = System.currentTimeMillis(); + long end = now+maxIdleTime; JBuffer content = _content; JBuffer buffer = _buffer; - if (content!=null && content.remaining()>0 || buffer!=null && buffer.remaining()>0 || isBufferFull()) + if (content!=null && content.remaining()>0 || buffer.position()>0 || isBufferFull()) { flushBuffer(); - while (now<end && (content!=null && content.remaining()>0 ||buffer!=null && buffer.remaining()>0) && _endp.isOpen()&& !_endp.isOutputShutdown()) + while (now<end && (content!=null && content.remaining()>0 || buffer.position()>0) && _endp.isOpen()&& !_endp.isOutputShutdown()) { blockForOutput(end-now); - now=System.currentTimeMillis(); + now = System.currentTimeMillis(); } } }
--- a/src/org/eclipse/jetty/server/AbstractHttpConnection.java Thu Nov 10 00:42:51 2016 -0700 +++ b/src/org/eclipse/jetty/server/AbstractHttpConnection.java Thu Nov 10 01:23:37 2016 -0700 @@ -838,18 +838,15 @@ { ReadableByteChannel chan = Channels.newChannel(in); JBuffer buffer = _generator.getUncheckedBuffer(); - ByteBuffer dup = buffer.getByteBuffer().duplicate(); - dup.limit(dup.capacity()); + ByteBuffer bb = buffer.getByteBuffer(); while (true) { _generator.prepareUncheckedAddContent(); - dup.position(buffer.limit()); - int n = chan.read(dup); + int n = chan.read(bb); if( n == -1 ) break; - buffer.limit(dup.position()); _generator.completeUncheckedAddContent(); _out.flush();