Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2015-10-13 20:55:11 +0000
committerSimone Bordet2015-10-13 20:55:25 +0000
commitb0eb18b451af19532d9e308ac7dbba87da52a226 (patch)
treeb75bf033fe15a30af4d76449aa63cf5e12b40f58
parentf052fc30a350ba78b4e7d910d40c6a51fe777201 (diff)
downloadorg.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.
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpChannel.java5
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java5
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java1
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java1
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java7
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/api/Result.java8
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java37
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java5
-rw-r--r--jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionUpgrader.java26
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);
+}

Back to the top