summaryrefslogtreecommitdiffstats
path: root/jdisc_http_service/src
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2016-11-04 13:23:40 +0100
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2016-11-04 13:24:45 +0100
commit973146fc7a848c7f38d86ecda0c00cdc54583930 (patch)
tree0c4a430e9720b07336d82c01fe681a598c14a1ba /jdisc_http_service/src
parent6aecffc6e96b3141a4051ee6b8ec4b90fa7ce6c6 (diff)
Assert servlet input/output streams are in ready state before completion
Diffstat (limited to 'jdisc_http_service/src')
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java5
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java32
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();
}
};