View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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 }