diff options
author | Greg Wilkins | 2013-05-28 12:46:16 +0000 |
---|---|---|
committer | Greg Wilkins | 2013-05-28 12:46:16 +0000 |
commit | 6f0195e0de86efb8ec93c9ec39b409f3c83df2c2 (patch) | |
tree | 27ef9ae689599700fd307dbb1ad6832233cb616d | |
parent | 2fa50247b79e4d3b9a187bf3096f31f373e3c26d (diff) | |
download | org.eclipse.jetty.project-6f0195e0de86efb8ec93c9ec39b409f3c83df2c2.tar.gz org.eclipse.jetty.project-6f0195e0de86efb8ec93c9ec39b409f3c83df2c2.tar.xz org.eclipse.jetty.project-6f0195e0de86efb8ec93c9ec39b409f3c83df2c2.zip |
398467 Servlet 3.1 Non Blocking IO
Fixed handling of empty writes
fixed double close sendContent
3 files changed, 36 insertions, 10 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java index 6b97b11b70..28e135780e 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java @@ -607,6 +607,7 @@ public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable protected boolean sendResponse(ResponseInfo info, ByteBuffer content, boolean complete, final Callback callback) { + // TODO check that complete only set true once by changing _committed to AtomicRef<Enum> boolean committing = _committed.compareAndSet(false, true); if (committing) { diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java index 86665bbbaf..c3a1faeb06 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java @@ -91,8 +91,20 @@ public class HttpOutput extends ServletOutputStream */ void closed() { - _closed = true; - releaseBuffer(); + if (!_closed) + { + _closed = true; + try + { + _channel.getResponse().closeOutput(); + } + catch(IOException e) + { + _channel.getEndPoint().shutdownOutput(); + LOG.ignore(e); + } + releaseBuffer(); + } } @Override @@ -197,12 +209,11 @@ public class HttpOutput extends ServletOutputStream // write any remaining content in the buffer directly if (len>0) _channel.write(ByteBuffer.wrap(b, off, len), complete); + else if (complete) + _channel.write(BufferUtil.EMPTY_BUFFER,complete); if (complete) - { closed(); - _channel.getResponse().closeOutput(); - } } @@ -338,9 +349,23 @@ public class HttpOutput extends ServletOutputStream * @param content The content to send * @param callback The callback to use to notify success or failure */ - public void sendContent(ByteBuffer content, Callback callback) + public void sendContent(ByteBuffer content, final Callback callback) { - _channel.write(content,true,callback); + _channel.write(content,true,new Callback() + { + @Override + public void succeeded() + { + closed(); + callback.succeeded(); + } + + @Override + public void failed(Throwable x) + { + callback.failed(x); + } + }); } /* ------------------------------------------------------------ */ @@ -377,8 +402,6 @@ public class HttpOutput extends ServletOutputStream if (_channel.isCommitted()) throw new IOException("committed"); - _closed=true; - ByteBuffer buffer= _channel.useDirectBuffers()?httpContent.getDirectBuffer():null; if (buffer == null) buffer = httpContent.getIndirectBuffer(); @@ -449,6 +472,7 @@ public class HttpOutput extends ServletOutputStream int len=_in.read(_buffer.array(),0,_buffer.capacity()); if (len==-1) { + closed(); _channel.getByteBufferPool().release(_buffer); return true; } @@ -507,6 +531,7 @@ public class HttpOutput extends ServletOutputStream int len=_in.read(_buffer); if (len==-1) { + closed(); _channel.getByteBufferPool().release(_buffer); return true; } diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java index 82174905d3..e5ae762f19 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java @@ -179,7 +179,7 @@ public abstract class AbstractCompressedStream extends ServletOutputStream if (_out == null || _bOut != null) { long length=_wrapper.getContentLength(); - if (length >= 0 && length < _wrapper.getMinCompressSize()) + if (length<0 && _bOut==null || length >= 0 && length < _wrapper.getMinCompressSize()) doNotCompress(false); else doCompress(); |