1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.spdy.client.http;
20
21 import java.io.IOException;
22 import java.net.SocketAddress;
23 import java.util.Map;
24
25 import org.eclipse.jetty.client.HttpClient;
26 import org.eclipse.jetty.client.HttpClientTransport;
27 import org.eclipse.jetty.client.HttpDestination;
28 import org.eclipse.jetty.client.Origin;
29 import org.eclipse.jetty.client.api.Connection;
30 import org.eclipse.jetty.io.ClientConnectionFactory;
31 import org.eclipse.jetty.io.EndPoint;
32 import org.eclipse.jetty.spdy.api.Session;
33 import org.eclipse.jetty.spdy.api.SessionFrameListener;
34 import org.eclipse.jetty.spdy.client.SPDYClient;
35 import org.eclipse.jetty.util.Promise;
36
37 public class HttpClientTransportOverSPDY implements HttpClientTransport
38 {
39 private final SPDYClient client;
40 private final ClientConnectionFactory connectionFactory;
41 private HttpClient httpClient;
42
43 public HttpClientTransportOverSPDY(SPDYClient client)
44 {
45 this.client = client;
46 this.connectionFactory = client.getClientConnectionFactory();
47 client.setClientConnectionFactory(new ClientConnectionFactory()
48 {
49 @Override
50 public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
51 {
52 HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
53 return destination.getClientConnectionFactory().newConnection(endPoint, context);
54 }
55 });
56 }
57
58 @Override
59 public void setHttpClient(HttpClient client)
60 {
61 httpClient = client;
62 }
63
64 @Override
65 public HttpDestination newHttpDestination(Origin origin)
66 {
67 return new HttpDestinationOverSPDY(httpClient, origin);
68 }
69
70 @Override
71 public void connect(SocketAddress address, Map<String, Object> context)
72 {
73 final HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
74 @SuppressWarnings("unchecked")
75 final Promise<Connection> promise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
76
77 SessionFrameListener.Adapter listener = new SessionFrameListener.Adapter()
78 {
79 @Override
80 public void onFailure(Session session, Throwable x)
81 {
82 destination.abort(x);
83 }
84 };
85
86 client.connect(address, listener, new Promise<Session>()
87 {
88 @Override
89 public void succeeded(Session session)
90 {
91 promise.succeeded(new HttpConnectionOverSPDY(destination, session));
92 }
93
94 @Override
95 public void failed(Throwable x)
96 {
97 promise.failed(x);
98 }
99 }, context);
100 }
101
102 @Override
103 public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
104 {
105 return connectionFactory.newConnection(endPoint, context);
106 }
107 }