Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2013-05-28 12:46:16 +0000
committerGreg Wilkins2013-05-28 12:46:16 +0000
commit6f0195e0de86efb8ec93c9ec39b409f3c83df2c2 (patch)
tree27ef9ae689599700fd307dbb1ad6832233cb616d
parent2fa50247b79e4d3b9a187bf3096f31f373e3c26d (diff)
downloadorg.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
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java1
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java43
-rw-r--r--jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java2
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();

Back to the top