diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java index 9dae09c1d51d..c06a609a6977 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java @@ -47,6 +47,7 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res private boolean shutdown; private boolean complete; private boolean unsolicited; + private int status; public HttpReceiverOverHTTP(HttpChannelOverHTTP channel) { @@ -118,15 +119,17 @@ private void releaseNetworkBuffer() protected ByteBuffer onUpgradeFrom() { + ByteBuffer upgradeBuffer = null; if (networkBuffer.hasRemaining()) { - ByteBuffer upgradeBuffer = BufferUtil.allocate(networkBuffer.remaining()); + upgradeBuffer = BufferUtil.allocate(networkBuffer.remaining()); BufferUtil.clearToFill(upgradeBuffer); BufferUtil.put(networkBuffer.getBuffer(), upgradeBuffer); BufferUtil.flipToFlush(upgradeBuffer, 0); - return upgradeBuffer; } - return null; + + releaseNetworkBuffer(); + return upgradeBuffer; } private void process() @@ -145,12 +148,11 @@ private void process() return; } - // Connection may be closed or upgraded in a parser callback. - boolean upgraded = connection != endPoint.getConnection(); - if (connection.isClosed() || upgraded) + // Connection may be closed in a parser callback. + if (connection.isClosed()) { if (LOG.isDebugEnabled()) - LOG.debug("{} {}", upgraded ? "Upgraded" : "Closed", connection); + LOG.debug("Closed {}", connection); releaseNetworkBuffer(); return; } @@ -215,6 +217,14 @@ private boolean parse() if (LOG.isDebugEnabled()) LOG.debug("Parse complete={}, remaining {} {}", complete, networkBuffer.remaining(), parser); + if (complete) + { + int status = this.status; + this.status = 0; + if (status == HttpStatus.SWITCHING_PROTOCOLS_101) + return true; + } + if (networkBuffer.isEmpty()) return false; @@ -269,6 +279,7 @@ public boolean startResponse(HttpVersion version, int status, String reason) if (exchange == null) return false; + this.status = status; String method = exchange.getRequest().getMethod(); parser.setHeadResponse(HttpMethod.HEAD.is(method) || (HttpMethod.CONNECT.is(method) && status == HttpStatus.OK_200));