Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2015-03-26 10:32:32 +0000
committerSimone Bordet2015-03-26 10:33:17 +0000
commit07d29fb1b39740b298ba2497ec1b06e86c1e7efc (patch)
treeb452db7dc647e8d8d811bfe11c6854af3ac198d6 /jetty-client
parent7bc2d50bf7e7c954b1fe136d6ce9331de5f1035c (diff)
downloadorg.eclipse.jetty.project-07d29fb1b39740b298ba2497ec1b06e86c1e7efc.tar.gz
org.eclipse.jetty.project-07d29fb1b39740b298ba2497ec1b06e86c1e7efc.tar.xz
org.eclipse.jetty.project-07d29fb1b39740b298ba2497ec1b06e86c1e7efc.zip
461499 - ConnectionPool may leak connections.
Avoid that the complete event is notified before or concurrently with the response success event.
Diffstat (limited to 'jetty-client')
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java19
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java3
2 files changed, 11 insertions, 11 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
index 8b5b9fb68d..deb6069e52 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
@@ -33,6 +33,7 @@ import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.client.api.Result;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.CountingCallback;
@@ -366,8 +367,7 @@ public abstract class HttpReceiver
{
// Mark atomically the response as completed, with respect
// to concurrency between response success and response failure.
- boolean completed = exchange.responseComplete(null);
- if (!completed)
+ if (!exchange.responseComplete(null))
return false;
responseState.set(ResponseState.IDLE);
@@ -375,13 +375,6 @@ public abstract class HttpReceiver
// Reset to be ready for another response.
reset();
- // Mark atomically the response as terminated, with
- // respect to concurrency between request and response.
- Result result = exchange.terminateResponse();
-
- // Notify *after* resetting and terminating, because
- // the notification may trigger another request/response,
- // or the reset of the response in case of 100-Continue.
HttpResponse response = exchange.getResponse();
if (LOG.isDebugEnabled())
LOG.debug("Response success {}", response);
@@ -389,6 +382,14 @@ public abstract class HttpReceiver
ResponseNotifier notifier = getHttpDestination().getResponseNotifier();
notifier.notifySuccess(listeners, response);
+ // Special case for 100 Continue that cannot
+ // be handled by the ContinueProtocolHandler.
+ if (exchange.getResponse().getStatus() == HttpStatus.CONTINUE_100)
+ return true;
+
+ // Mark atomically the response as terminated, with
+ // respect to concurrency between request and response.
+ Result result = exchange.terminateResponse();
terminateResponse(exchange, result);
return true;
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
index a7b68e5840..be6b761d05 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
@@ -303,8 +303,7 @@ public abstract class HttpSender implements AsyncContentProvider.Listener
{
// Mark atomically the request as completed, with respect
// to concurrency between request success and request failure.
- boolean completed = exchange.requestComplete(null);
- if (!completed)
+ if (!exchange.requestComplete(null))
return false;
requestState.set(RequestState.QUEUED);

Back to the top