View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2015 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.http2.client;
20  
21  import org.eclipse.jetty.http2.FlowControlStrategy;
22  import org.eclipse.jetty.http2.HTTP2Session;
23  import org.eclipse.jetty.http2.IStream;
24  import org.eclipse.jetty.http2.api.Stream;
25  import org.eclipse.jetty.http2.frames.HeadersFrame;
26  import org.eclipse.jetty.http2.frames.PushPromiseFrame;
27  import org.eclipse.jetty.http2.generator.Generator;
28  import org.eclipse.jetty.io.EndPoint;
29  import org.eclipse.jetty.util.Callback;
30  import org.eclipse.jetty.util.log.Log;
31  import org.eclipse.jetty.util.log.Logger;
32  import org.eclipse.jetty.util.thread.Scheduler;
33  
34  public class HTTP2ClientSession extends HTTP2Session
35  {
36      private static final Logger LOG = Log.getLogger(HTTP2ClientSession.class);
37  
38      public HTTP2ClientSession(Scheduler scheduler, EndPoint endPoint, Generator generator, Listener listener, FlowControlStrategy flowControl)
39      {
40          super(scheduler, endPoint, generator, listener, flowControl, 1);
41      }
42  
43      @Override
44      public void onHeaders(HeadersFrame frame)
45      {
46          if (LOG.isDebugEnabled())
47              LOG.debug("Received {}", frame);
48  
49          int streamId = frame.getStreamId();
50          IStream stream = getStream(streamId);
51          if (stream == null)
52          {
53              if (LOG.isDebugEnabled())
54                  LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
55          }
56          else
57          {
58              stream.process(frame, Callback.NOOP);
59              notifyHeaders(stream, frame);
60          }
61      }
62  
63      private void notifyHeaders(IStream stream, HeadersFrame frame)
64      {
65          Stream.Listener listener = stream.getListener();
66          if (listener == null)
67              return;
68          try
69          {
70              listener.onHeaders(stream, frame);
71          }
72          catch (Throwable x)
73          {
74              LOG.info("Failure while notifying listener " + listener, x);
75          }
76      }
77  
78      @Override
79      public void onPushPromise(PushPromiseFrame frame)
80      {
81          if (LOG.isDebugEnabled())
82              LOG.debug("Received {}", frame);
83  
84          int streamId = frame.getStreamId();
85          int pushStreamId = frame.getPromisedStreamId();
86          IStream stream = getStream(streamId);
87          if (stream == null)
88          {
89              if (LOG.isDebugEnabled())
90                  LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
91          }
92          else
93          {
94              IStream pushStream = createRemoteStream(pushStreamId);
95              pushStream.process(frame, Callback.NOOP);
96              Stream.Listener listener = notifyPush(stream, pushStream, frame);
97              pushStream.setListener(listener);
98          }
99      }
100 
101     private Stream.Listener notifyPush(IStream stream, IStream pushStream, PushPromiseFrame frame)
102     {
103         Stream.Listener listener = stream.getListener();
104         if (listener == null)
105             return null;
106         try
107         {
108             return listener.onPush(pushStream, frame);
109         }
110         catch (Throwable x)
111         {
112             LOG.info("Failure while notifying listener " + listener, x);
113             return null;
114         }
115     }
116 }