1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 }