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.http;
20
21 import org.eclipse.jetty.client.HttpContent;
22 import org.eclipse.jetty.client.HttpExchange;
23 import org.eclipse.jetty.client.HttpSender;
24 import org.eclipse.jetty.client.api.Request;
25 import org.eclipse.jetty.http.HttpURI;
26 import org.eclipse.jetty.http.HttpVersion;
27 import org.eclipse.jetty.http.MetaData;
28 import org.eclipse.jetty.http2.api.Stream;
29 import org.eclipse.jetty.http2.frames.DataFrame;
30 import org.eclipse.jetty.http2.frames.HeadersFrame;
31 import org.eclipse.jetty.util.Callback;
32 import org.eclipse.jetty.util.Promise;
33
34 public class HttpSenderOverHTTP2 extends HttpSender
35 {
36 private Stream stream;
37
38 public HttpSenderOverHTTP2(HttpChannelOverHTTP2 channel)
39 {
40 super(channel);
41 }
42
43 @Override
44 protected HttpChannelOverHTTP2 getHttpChannel()
45 {
46 return (HttpChannelOverHTTP2)super.getHttpChannel();
47 }
48
49 @Override
50 protected void sendHeaders(HttpExchange exchange, final HttpContent content, final Callback callback)
51 {
52 final Request request = exchange.getRequest();
53 HttpURI uri = new HttpURI(request.getScheme(), request.getHost(), request.getPort(), request.getPath(), null, request.getQuery(), null);
54 MetaData.Request metaData = new MetaData.Request(request.getMethod(), uri, HttpVersion.HTTP_2, request.getHeaders());
55 HeadersFrame headersFrame = new HeadersFrame(0, metaData, null, !content.hasContent());
56 HttpChannelOverHTTP2 channel = getHttpChannel();
57 Promise<Stream> promise = new Promise<Stream>()
58 {
59 @Override
60 public void succeeded(Stream stream)
61 {
62 HttpSenderOverHTTP2.this.stream = stream;
63 stream.setIdleTimeout(request.getIdleTimeout());
64
65 if (content.hasContent() && !expects100Continue(request))
66 {
67 if (content.advance())
68 {
69 DataFrame dataFrame = new DataFrame(stream.getId(), content.getByteBuffer(), content.isLast());
70 stream.data(dataFrame, callback);
71 return;
72 }
73 }
74 callback.succeeded();
75 }
76
77 @Override
78 public void failed(Throwable failure)
79 {
80 callback.failed(failure);
81 }
82 };
83 channel.getSession().newStream(headersFrame, promise, channel.getStreamListener());
84 }
85
86 @Override
87 protected void sendContent(HttpExchange exchange, HttpContent content, Callback callback)
88 {
89 if (content.isConsumed())
90 {
91 callback.succeeded();
92 }
93 else
94 {
95 DataFrame frame = new DataFrame(stream.getId(), content.getByteBuffer(), content.isLast());
96 stream.data(frame, callback);
97 }
98 }
99
100 @Override
101 protected void reset()
102 {
103 super.reset();
104 stream = null;
105 }
106 }