diff options
author | Simone Bordet | 2015-10-13 20:55:11 +0000 |
---|---|---|
committer | Simone Bordet | 2015-10-13 20:55:25 +0000 |
commit | b0eb18b451af19532d9e308ac7dbba87da52a226 (patch) | |
tree | b75bf033fe15a30af4d76449aa63cf5e12b40f58 | |
parent | f052fc30a350ba78b4e7d910d40c6a51fe777201 (diff) | |
download | org.eclipse.jetty.project-b0eb18b451af19532d9e308ac7dbba87da52a226.tar.gz org.eclipse.jetty.project-b0eb18b451af19532d9e308ac7dbba87da52a226.tar.xz org.eclipse.jetty.project-b0eb18b451af19532d9e308ac7dbba87da52a226.zip |
479678 - Support HTTP/1.1 Upgrade in HttpClient.
Initial support.
9 files changed, 89 insertions, 6 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpChannel.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpChannel.java index d493a9e200..09dd2fb3ad 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpChannel.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpChannel.java @@ -129,6 +129,11 @@ public abstract class HttpChannel return getHttpReceiver().abort(exchange, failure); } + public Result exchangeTerminating(HttpExchange exchange, Result result) + { + return result; + } + public void exchangeTerminated(HttpExchange exchange, Result result) { disassociate(exchange); diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java index 93337516af..6d62f89203 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java @@ -531,15 +531,12 @@ public class HttpClient extends ContainerLifeCycle */ public List<Destination> getDestinations() { - return new ArrayList<Destination>(destinations.values()); + return new ArrayList<>(destinations.values()); } protected void send(final HttpRequest request, List<Response.ResponseListener> listeners) { String scheme = request.getScheme().toLowerCase(Locale.ENGLISH); - if (!HttpScheme.HTTP.is(scheme) && !HttpScheme.HTTPS.is(scheme)) - throw new IllegalArgumentException("Invalid protocol " + scheme); - String host = request.getHost().toLowerCase(Locale.ENGLISH); HttpDestination destination = destinationFor(scheme, host, request.getPort()); destination.send(request, listeners); 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 2fb444130c..04bdf62731 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 @@ -437,6 +437,7 @@ public abstract class HttpReceiver if (result != null) { + result = channel.exchangeTerminating(exchange, result); boolean ordered = getHttpDestination().getHttpClient().isStrictEventOrdering(); if (!ordered) channel.exchangeTerminated(exchange, result); 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 5417a122e8..25fd7d9487 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 @@ -376,6 +376,7 @@ public abstract class HttpSender implements AsyncContentProvider.Listener } else { + result = channel.exchangeTerminating(exchange, result); HttpDestination destination = getHttpChannel().getHttpDestination(); boolean ordered = destination.getHttpClient().isStrictEventOrdering(); if (!ordered) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java index 9f0aff8703..10ea4f1244 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java @@ -167,12 +167,17 @@ public abstract class PoolingHttpDestination<C extends Connection> extends HttpD } } + public boolean remove(Connection connection) + { + return connectionPool.remove(connection); + } + @Override public void close(Connection connection) { super.close(connection); - boolean removed = connectionPool.remove(connection); + boolean removed = remove(connection); if (getHttpExchanges().isEmpty()) { diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Result.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Result.java index a782bd8d88..f934ba5f0e 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Result.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Result.java @@ -52,6 +52,14 @@ public class Result this.responseFailure = responseFailure; } + public Result(Result result, Throwable responseFailure) + { + this.request = result.request; + this.requestFailure = result.requestFailure; + this.response = result.response; + this.responseFailure = responseFailure; + } + /** * @return the request object */ diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java index a204cf3a2e..913da2011e 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java @@ -21,6 +21,8 @@ package org.eclipse.jetty.client.http; import org.eclipse.jetty.client.HttpChannel; import org.eclipse.jetty.client.HttpExchange; import org.eclipse.jetty.client.HttpReceiver; +import org.eclipse.jetty.client.HttpRequest; +import org.eclipse.jetty.client.HttpResponse; import org.eclipse.jetty.client.HttpSender; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; @@ -28,6 +30,7 @@ import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpHeaderValue; import org.eclipse.jetty.http.HttpMethod; +import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpVersion; public class HttpChannelOverHTTP extends HttpChannel @@ -85,6 +88,34 @@ public class HttpChannelOverHTTP extends HttpChannel connection.release(); } + @Override + public Result exchangeTerminating(HttpExchange exchange, Result result) + { + if (result.isFailed()) + return result; + + HttpResponse response = exchange.getResponse(); + if (response.getStatus() != HttpStatus.SWITCHING_PROTOCOLS_101) + return result; + // TODO: protocol version and connection: upgrade + + HttpRequest request = exchange.getRequest(); + if (request instanceof HttpConnectionUpgrader) + { + HttpConnectionUpgrader listener = (HttpConnectionUpgrader)request; + try + { + listener.upgrade(response, getHttpConnection()); + } + catch (Throwable x) + { + return new Result(result, x); + } + } + + return result; + } + public void receive() { receiver.receive(); @@ -131,7 +162,10 @@ public class HttpChannelOverHTTP extends HttpChannel } else { - release(); + if (response.getStatus() == HttpStatus.SWITCHING_PROTOCOLS_101) + connection.remove(); + else + release(); } } @@ -143,4 +177,5 @@ public class HttpChannelOverHTTP extends HttpChannel sender, receiver); } + } diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java index da9fcd6e08..59e152acf4 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java @@ -171,6 +171,11 @@ public class HttpConnectionOverHTTP extends AbstractConnection implements Connec return true; } + public void remove() + { + getHttpDestination().remove(this); + } + @Override public String toString() { diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionUpgrader.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionUpgrader.java new file mode 100644 index 0000000000..c2c43749be --- /dev/null +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionUpgrader.java @@ -0,0 +1,26 @@ +// +// ======================================================================== +// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.client.http; + +import org.eclipse.jetty.client.HttpResponse; + +public interface HttpConnectionUpgrader +{ + public void upgrade(HttpResponse response, HttpConnectionOverHTTP connection); +} |