diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2016-11-04 13:23:40 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2016-11-04 13:24:45 +0100 |
commit | 973146fc7a848c7f38d86ecda0c00cdc54583930 (patch) | |
tree | 0c4a430e9720b07336d82c01fe681a598c14a1ba /jdisc_http_service | |
parent | 6aecffc6e96b3141a4051ee6b8ec4b90fa7ce6c6 (diff) |
Assert servlet input/output streams are in ready state before completion
Diffstat (limited to 'jdisc_http_service')
2 files changed, 26 insertions, 11 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java index 228db17d5fc..c2eb924fb1f 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java @@ -179,6 +179,11 @@ public class ServletOutputStreamWriter { } assert !Thread.holdsLock(monitor); + if (!outputStream.isReady()) { + String msg = "ServletInputStream not ready!"; + log.severe(msg); + throw new IllegalStateException(msg); + } if (e.isPresent()) { finishedFuture.completeExceptionally(e.get()); } else { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java index df91037d103..f08221310a3 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java @@ -135,7 +135,7 @@ class ServletRequestReader implements ReadListener { requestContentChannel.write(buf, writeCompletionHandler); metricReporter.successfulRead(bytesReceived); } catch (final Throwable t) { - finishedFuture.completeExceptionally(t); + completeWithFailure(t); } finally { //decrease due to this method completing. decreaseOutstandingUserCallsAndCloseRequestContentChannelConditionally(); @@ -220,7 +220,7 @@ class ServletRequestReader implements ReadListener { @Override public void failed(final Throwable t) { - finishedFuture.completeExceptionally(t); + completeWithFailure(t); } }; @@ -228,23 +228,33 @@ class ServletRequestReader implements ReadListener { requestContentChannel.close(closeCompletionHandler); //if close did not cause an exception, // is it safe to pipe the result of the completionHandlerInvokedFuture into finishedFuture - completedCalledFuture.whenComplete(this::setFinishedFuture); + completedCalledFuture.whenComplete((ignoredResult, ignoredThrowable) -> completeWithSuccess()); } catch (final Throwable t) { - finishedFuture.completeExceptionally(t); + completeWithFailure(t); } } - private void setFinishedFuture(Void result, Throwable throwable) { - if (throwable != null) { - finishedFuture.completeExceptionally(throwable); - } else { - finishedFuture.complete(null); + private void completeWithSuccess() { + verifyInputStreamState(); + finishedFuture.complete(null); + } + + private void completeWithFailure(Throwable throwable) { + verifyInputStreamState(); + finishedFuture.completeExceptionally(throwable); + } + + private void verifyInputStreamState() { + if (!servletInputStream.isReady()) { + String msg = "ServletInputStream not ready!"; + log.severe(msg); + throw new IllegalStateException(msg); } } @Override public void onError(final Throwable t) { - finishedFuture.completeExceptionally(t); + completeWithFailure(t); doneReading(); } @@ -256,7 +266,7 @@ class ServletRequestReader implements ReadListener { @Override public void failed(final Throwable t) { - finishedFuture.completeExceptionally(t); + completeWithFailure(t); decreaseOutstandingUserCallsAndCloseRequestContentChannelConditionally(); } }; |