bayserver-docker-http 2.3.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/docker/http/h1/h1_command_unpacker.rb +1 -1
- data/lib/baykit/bayserver/docker/http/h1/h1_handler.rb +16 -0
- data/lib/baykit/bayserver/docker/http/h1/h1_inbound_handler.rb +100 -66
- data/lib/baykit/bayserver/docker/http/h1/h1_protocol_handler.rb +2 -12
- data/lib/baykit/bayserver/docker/http/h1/h1_warp_handler.rb +72 -49
- data/lib/baykit/bayserver/docker/http/h2/command/cmd_window_update.rb +0 -1
- data/lib/baykit/bayserver/docker/http/h2/h2_command_handler.rb +35 -13
- data/lib/baykit/bayserver/docker/http/h2/h2_handler.rb +15 -0
- data/lib/baykit/bayserver/docker/http/h2/h2_inbound_handler.rb +121 -79
- data/lib/baykit/bayserver/docker/http/h2/h2_protocol_handler.rb +3 -11
- data/lib/baykit/bayserver/docker/http/h2/h2_warp_handler.rb +2 -2
- data/lib/baykit/bayserver/docker/http/htp_docker.rb +0 -1
- data/lib/baykit/bayserver/docker/http/htp_warp_docker.rb +18 -5
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a10c4b80275616d87322d82542025717b59c82bc6aadc73098f69ca63f63563
|
4
|
+
data.tar.gz: d26694ce403eb65e1a7b365d4905a116ab7d93b4b2c2dea7946476bc0258d2f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 780e7922748b59d7a426d9aa4d6d89db81fe68ccd58dd09a43b620c504500fe14a5a5344ffd05d28fefc2f64df46374a3210eb2b96416ef0982a9ae4ccbc3c5b
|
7
|
+
data.tar.gz: 48b2750d675a6a8df7a11f60f4e9d43c45c17970360d47a2c90cb66aa1fc5f3f00f346bb7bad9dfd27b4db8b46cc34807231194b7ea316ab85c6424177cc7067
|
@@ -1,6 +1,7 @@
|
|
1
|
+
require 'openssl'
|
1
2
|
require 'baykit/bayserver/agent/upgrade_exception'
|
2
3
|
|
3
|
-
require 'baykit/bayserver/
|
4
|
+
require 'baykit/bayserver/common/inbound_handler'
|
4
5
|
|
5
6
|
require 'baykit/bayserver/protocol/package'
|
6
7
|
require 'baykit/bayserver/tours/req_content_handler'
|
@@ -10,7 +11,13 @@ require 'baykit/bayserver/util/url_encoder'
|
|
10
11
|
require 'baykit/bayserver/util/http_util'
|
11
12
|
require 'baykit/bayserver/util/headers'
|
12
13
|
|
14
|
+
require 'baykit/bayserver/protocol/packet_packer'
|
15
|
+
require 'baykit/bayserver/protocol/command_packer'
|
16
|
+
|
17
|
+
require 'baykit/bayserver/docker/http/h1/h1_handler'
|
13
18
|
require 'baykit/bayserver/docker/http/h1/h1_command_handler'
|
19
|
+
require 'baykit/bayserver/docker/http/h1/h1_command_unpacker'
|
20
|
+
require 'baykit/bayserver/docker/http/h1/h1_packet_unpacker'
|
14
21
|
require 'baykit/bayserver/docker/http/h1/h1_protocol_handler'
|
15
22
|
require 'baykit/bayserver/docker/http/h2/package'
|
16
23
|
|
@@ -19,22 +26,36 @@ module Baykit
|
|
19
26
|
module Docker
|
20
27
|
module Http
|
21
28
|
module H1
|
22
|
-
class H1InboundHandler
|
29
|
+
class H1InboundHandler
|
23
30
|
|
24
31
|
class InboundProtocolHandlerFactory
|
25
32
|
include Baykit::BayServer::Protocol::ProtocolHandlerFactory # implements
|
26
33
|
|
34
|
+
include Baykit::BayServer::Protocol
|
35
|
+
|
27
36
|
def create_protocol_handler(pkt_store)
|
28
|
-
|
37
|
+
ib_handler = H1InboundHandler.new
|
38
|
+
cmd_unpacker = H1CommandUnPacker.new(ib_handler, true)
|
39
|
+
pkt_unpacker = H1PacketUnPacker.new(cmd_unpacker, pkt_store)
|
40
|
+
pkt_packer = PacketPacker.new
|
41
|
+
cmd_packer = CommandPacker.new(pkt_packer, pkt_store)
|
42
|
+
|
43
|
+
proto_handler = H1ProtocolHandler.new(ib_handler, pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, true)
|
44
|
+
ib_handler.init(proto_handler)
|
45
|
+
return proto_handler
|
29
46
|
end
|
30
47
|
end
|
31
48
|
|
32
|
-
include Baykit::BayServer::
|
49
|
+
include Baykit::BayServer::Common::InboundHandler # implements
|
50
|
+
include H1Handler # implements
|
51
|
+
|
33
52
|
include Baykit::BayServer::Agent
|
34
53
|
include Baykit::BayServer::Protocol
|
35
54
|
include Baykit::BayServer::Tours
|
36
55
|
include Baykit::BayServer::Util
|
56
|
+
include Baykit::BayServer::Docker::Http::H1::Command
|
37
57
|
include Baykit::BayServer::Docker::Http::H2
|
58
|
+
include OpenSSL
|
38
59
|
|
39
60
|
STATE_READ_HEADER = 1
|
40
61
|
STATE_READ_CONTENT = 2
|
@@ -42,6 +63,7 @@ module Baykit
|
|
42
63
|
|
43
64
|
FIXED_REQ_ID = 1
|
44
65
|
|
66
|
+
attr :protocol_handler
|
45
67
|
attr :header_read
|
46
68
|
attr :state
|
47
69
|
attr :cur_req_id
|
@@ -49,17 +71,19 @@ module Baykit
|
|
49
71
|
attr :cur_tour_id
|
50
72
|
attr :http_protocol
|
51
73
|
|
52
|
-
def initialize
|
53
|
-
super
|
54
|
-
reset
|
74
|
+
def initialize
|
75
|
+
super
|
76
|
+
reset
|
77
|
+
end
|
78
|
+
|
79
|
+
def init(proto_handler)
|
80
|
+
@protocol_handler = proto_handler
|
55
81
|
end
|
56
82
|
|
57
83
|
######################################################
|
58
84
|
# implements Reusable
|
59
85
|
######################################################
|
60
86
|
def reset()
|
61
|
-
super
|
62
|
-
@cur_req_id = 1
|
63
87
|
reset_state()
|
64
88
|
|
65
89
|
@header_read = false
|
@@ -96,7 +120,7 @@ module Baykit
|
|
96
120
|
|
97
121
|
tur.res.headers.set(Headers::CONNECTION, res_con)
|
98
122
|
|
99
|
-
if BayServer.harbor.trace_header
|
123
|
+
if BayServer.harbor.trace_header
|
100
124
|
BayLog.info("%s resStatus:%d", tur, tur.res.headers.status)
|
101
125
|
tur.res.headers.names.each do |name|
|
102
126
|
tur.res.headers.values(name).each do |value|
|
@@ -106,34 +130,34 @@ module Baykit
|
|
106
130
|
end
|
107
131
|
|
108
132
|
cmd = CmdHeader.new_res_header(tur.res.headers, tur.req.protocol)
|
109
|
-
@
|
133
|
+
@protocol_handler.post(cmd)
|
110
134
|
end
|
111
135
|
|
112
136
|
def send_res_content(tur, bytes, ofs, len, &callback)
|
113
137
|
BayLog.debug("%s H1 send_res_content len=%d", self, len)
|
114
138
|
cmd = CmdContent.new(bytes, ofs, len)
|
115
|
-
@
|
139
|
+
@protocol_handler.post(cmd, &callback)
|
116
140
|
end
|
117
141
|
|
118
142
|
def send_end_tour(tur, keep_alive, &callback)
|
119
|
-
BayLog.trace("%s sendEndTour: tur=%s keep=%s",
|
143
|
+
BayLog.trace("%s sendEndTour: tur=%s keep=%s", ship, tur, keep_alive)
|
120
144
|
|
121
145
|
# Send dummy end request command
|
122
146
|
cmd = CmdEndContent.new()
|
123
147
|
|
124
|
-
sid =
|
148
|
+
sid = ship.ship_id
|
125
149
|
ensure_func = lambda do
|
126
|
-
if keep_alive
|
127
|
-
|
128
|
-
|
150
|
+
if keep_alive
|
151
|
+
ship.keeping = true
|
152
|
+
ship.resume_read(sid)
|
129
153
|
else
|
130
|
-
|
154
|
+
ship.post_close
|
131
155
|
end
|
132
156
|
end
|
133
157
|
|
134
158
|
begin
|
135
|
-
@
|
136
|
-
BayLog.debug("%s call back of end content command: tur=%s",
|
159
|
+
@protocol_handler.post(cmd) do
|
160
|
+
BayLog.debug("%s call back of end content command: tur=%s", ship, tur)
|
137
161
|
ensure_func.call()
|
138
162
|
callback.call()
|
139
163
|
end
|
@@ -143,9 +167,9 @@ module Baykit
|
|
143
167
|
end
|
144
168
|
end
|
145
169
|
|
146
|
-
def
|
170
|
+
def on_protocol_error(err)
|
147
171
|
if @cur_tour == nil
|
148
|
-
tur =
|
172
|
+
tur = ship.get_error_tour()
|
149
173
|
else
|
150
174
|
tur = @cur_tour
|
151
175
|
end
|
@@ -158,7 +182,8 @@ module Baykit
|
|
158
182
|
# implements H1CommandHandler
|
159
183
|
######################################################
|
160
184
|
def handle_header(cmd)
|
161
|
-
BayLog.debug("%s handleHeader: method=%s uri=%s proto=",
|
185
|
+
BayLog.debug("%s handleHeader: method=%s uri=%s proto=", ship, cmd.method, cmd.uri, cmd.version);
|
186
|
+
sip = ship
|
162
187
|
|
163
188
|
if @state == STATE_FINISHED
|
164
189
|
change_state(STATE_READ_HEADER)
|
@@ -174,10 +199,10 @@ module Baykit
|
|
174
199
|
# Check HTTP2
|
175
200
|
protocol = cmd.version.upcase
|
176
201
|
if protocol == "HTTP/2.0"
|
177
|
-
if
|
178
|
-
|
179
|
-
new_hnd = ProtocolHandlerStore.get_store(HtpDocker::H2_PROTO_NAME, true,
|
180
|
-
|
202
|
+
if ship.port_docker.support_h2
|
203
|
+
ship.port_docker.return_protocol_handler(ship.agent_id, @protocol_handler)
|
204
|
+
new_hnd = ProtocolHandlerStore.get_store(HtpDocker::H2_PROTO_NAME, true, sip.agent_id).rent()
|
205
|
+
sip.set_protocol_handler(new_hnd)
|
181
206
|
raise UpgradeException.new()
|
182
207
|
else
|
183
208
|
raise ProtocolException.new(
|
@@ -185,11 +210,11 @@ module Baykit
|
|
185
210
|
end
|
186
211
|
end
|
187
212
|
|
188
|
-
tur =
|
213
|
+
tur = sip.get_tour(@cur_req_id)
|
189
214
|
|
190
215
|
if tur == nil
|
191
216
|
BayLog.error(BayMessage.get(:INT_NO_MORE_TOURS))
|
192
|
-
tur =
|
217
|
+
tur = sip.get_tour(self.cur_req_id, true)
|
193
218
|
tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "No available tours")
|
194
219
|
return NextSocketAction::CONTINUE
|
195
220
|
end
|
@@ -198,7 +223,7 @@ module Baykit
|
|
198
223
|
@cur_tour_id = tur.id()
|
199
224
|
@cur_req_id += 1
|
200
225
|
|
201
|
-
|
226
|
+
ship.keeping = false
|
202
227
|
|
203
228
|
@http_protocol = protocol
|
204
229
|
|
@@ -219,21 +244,16 @@ module Baykit
|
|
219
244
|
|
220
245
|
req_cont_len = tur.req.headers.content_length
|
221
246
|
BayLog.debug("%s read header method=%s protocol=%s uri=%s contlen=%d",
|
222
|
-
|
247
|
+
ship, tur.req.method, tur.req.protocol, tur.req.uri, tur.req.headers.content_length)
|
223
248
|
|
224
|
-
if BayServer.harbor.trace_header
|
249
|
+
if BayServer.harbor.trace_header
|
225
250
|
cmd.headers.each do |item|
|
226
251
|
BayLog.info("%s h1: reqHeader: %s=%s", tur, item[0], item[1])
|
227
252
|
end
|
228
253
|
end
|
229
254
|
|
230
255
|
if req_cont_len > 0
|
231
|
-
|
232
|
-
tur.req.set_consume_listener(req_cont_len) do |len, resume|
|
233
|
-
if resume
|
234
|
-
@ship.resume(sid)
|
235
|
-
end
|
236
|
-
end
|
256
|
+
tur.req.set_limit(req_cont_len)
|
237
257
|
end
|
238
258
|
|
239
259
|
begin
|
@@ -247,9 +267,10 @@ module Baykit
|
|
247
267
|
return NextSocketAction::CONTINUE
|
248
268
|
end
|
249
269
|
rescue HttpException => e
|
250
|
-
BayLog.
|
270
|
+
BayLog.debug_e(e, "%s Http error occurred: %s", self, e)
|
251
271
|
if req_cont_len <= 0
|
252
272
|
# no post data
|
273
|
+
tur.req.abort
|
253
274
|
tur.res.send_http_exception(Tour::TOUR_ID_NOCHECK, e)
|
254
275
|
|
255
276
|
reset_state() # next: read empty stdin command
|
@@ -266,7 +287,7 @@ module Baykit
|
|
266
287
|
end
|
267
288
|
|
268
289
|
def handle_content(cmd)
|
269
|
-
BayLog.debug("%s handleContent: len=%s",
|
290
|
+
BayLog.debug("%s handleContent: len=%s", ship, cmd.len)
|
270
291
|
|
271
292
|
if @state != STATE_READ_CONTENT
|
272
293
|
s = @state
|
@@ -276,30 +297,38 @@ module Baykit
|
|
276
297
|
|
277
298
|
tur = @cur_tour
|
278
299
|
tur_id = @cur_tour_id
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
300
|
+
begin
|
301
|
+
sid = ship.ship_id
|
302
|
+
success = tur.req.post_req_content(tur_id, cmd.buf, cmd.start, cmd.len) do |len, resume|
|
303
|
+
if resume
|
304
|
+
tur.ship.resume_read(sid)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
if tur.req.bytes_posted == tur.req.bytes_limit
|
309
|
+
if tur.error != nil
|
310
|
+
# Error has occurred on header completed
|
311
|
+
#tur.res.send_http_exception(tur_id, tur.error)
|
312
|
+
#reset_state()
|
313
|
+
#return NextSocketAction::WRITE
|
314
|
+
BayLog.debug("%s Delay report error", tur)
|
315
|
+
raise tur.error
|
316
|
+
else
|
289
317
|
end_req_content(tur_id, tur)
|
290
|
-
return NextSocketAction::
|
291
|
-
rescue HttpException => e
|
292
|
-
tur.res.send_http_exception(tur_id, e)
|
293
|
-
reset_state()
|
294
|
-
return NextSocketAction::WRITE
|
318
|
+
return NextSocketAction::CONTINUE
|
295
319
|
end
|
296
320
|
end
|
297
|
-
end
|
298
321
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
322
|
+
if !success
|
323
|
+
return NextSocketAction::SUSPEND # end reading
|
324
|
+
else
|
325
|
+
return NextSocketAction::CONTINUE
|
326
|
+
end
|
327
|
+
|
328
|
+
rescue HttpException => e
|
329
|
+
tur.res.send_http_exception(tur_id, e)
|
330
|
+
reset_state()
|
331
|
+
return NextSocketAction::WRITE
|
303
332
|
end
|
304
333
|
end
|
305
334
|
|
@@ -307,13 +336,15 @@ module Baykit
|
|
307
336
|
raise Sink.new()
|
308
337
|
end
|
309
338
|
|
310
|
-
def
|
339
|
+
def req_finished()
|
311
340
|
return @state == STATE_FINISHED
|
312
341
|
end
|
313
342
|
|
314
|
-
|
315
|
-
|
316
343
|
private
|
344
|
+
def ship
|
345
|
+
return @protocol_handler.ship
|
346
|
+
end
|
347
|
+
|
317
348
|
def change_state(new_state)
|
318
349
|
@state = new_state
|
319
350
|
end
|
@@ -325,16 +356,19 @@ module Baykit
|
|
325
356
|
end
|
326
357
|
|
327
358
|
def end_req_content(chk_tur_id, tur)
|
328
|
-
tur.req.
|
359
|
+
tur.req.end_req_content(chk_tur_id)
|
329
360
|
reset_state()
|
330
361
|
end
|
331
362
|
|
332
363
|
def start_tour(tur)
|
333
|
-
secure =
|
364
|
+
secure = ship.port_docker.secure
|
334
365
|
HttpUtil.parse_host_port(tur, secure ? 443 : 80)
|
335
366
|
HttpUtil.parse_authorization(tur)
|
336
367
|
|
337
|
-
skt =
|
368
|
+
skt = ship.rudder.io
|
369
|
+
if skt.kind_of? SSL::SSLSocket
|
370
|
+
skt = skt.io
|
371
|
+
end
|
338
372
|
|
339
373
|
client_adr = tur.req.headers.get(Headers::X_FORWARDED_FOR)
|
340
374
|
if client_adr
|
@@ -10,7 +10,6 @@ module Baykit
|
|
10
10
|
module Http
|
11
11
|
module H1
|
12
12
|
class H1ProtocolHandler < Baykit::BayServer::Protocol::ProtocolHandler
|
13
|
-
include Baykit::BayServer::Docker::Http::H1::H1CommandHandler # implements
|
14
13
|
|
15
14
|
include Baykit::BayServer::Agent
|
16
15
|
include Baykit::BayServer::Protocol
|
@@ -20,17 +19,8 @@ module Baykit
|
|
20
19
|
|
21
20
|
attr :keeping
|
22
21
|
|
23
|
-
def initialize(
|
24
|
-
|
25
|
-
@packet_unpacker = H1PacketUnPacker.new(@command_unpacker, pkt_store)
|
26
|
-
@packet_packer = PacketPacker.new()
|
27
|
-
@command_packer = CommandPacker.new(@packet_packer, pkt_store)
|
28
|
-
@server_mode = svr_mode
|
29
|
-
@keeping = false
|
30
|
-
end
|
31
|
-
|
32
|
-
def inspect()
|
33
|
-
return @ship.inspect()
|
22
|
+
def initialize(h1_handler, pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, svr_mode)
|
23
|
+
super(pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, h1_handler, svr_mode)
|
34
24
|
end
|
35
25
|
|
36
26
|
######################################################
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'baykit/bayserver/tours/tour'
|
2
2
|
require 'baykit/bayserver/protocol/protocol_exception'
|
3
|
-
require 'baykit/bayserver/
|
3
|
+
require 'baykit/bayserver/common/warp_handler'
|
4
4
|
require 'baykit/bayserver/docker/http/h1/command/package'
|
5
5
|
|
6
6
|
module Baykit
|
@@ -8,14 +8,25 @@ module Baykit
|
|
8
8
|
module Docker
|
9
9
|
module Http
|
10
10
|
module H1
|
11
|
-
class H1WarpHandler
|
12
|
-
include Baykit::BayServer::
|
11
|
+
class H1WarpHandler
|
12
|
+
include Baykit::BayServer::Common::WarpHandler # implements
|
13
|
+
include H1Handler # implements
|
14
|
+
include Baykit::BayServer::Protocol
|
13
15
|
|
14
16
|
class WarpProtocolHandlerFactory
|
15
17
|
include Baykit::BayServer::Protocol::ProtocolHandlerFactory # implements
|
18
|
+
include Baykit::BayServer::Protocol
|
16
19
|
|
17
20
|
def create_protocol_handler(pkt_store)
|
18
|
-
|
21
|
+
ib_handler = H1WarpHandler.new
|
22
|
+
cmd_unpacker = H1CommandUnPacker.new(ib_handler, false)
|
23
|
+
pkt_unpacker = H1PacketUnPacker.new(cmd_unpacker, pkt_store)
|
24
|
+
pkt_packer = PacketPacker.new
|
25
|
+
cmd_packer = CommandPacker.new(pkt_packer, pkt_store)
|
26
|
+
|
27
|
+
proto_handler = H1ProtocolHandler.new(ib_handler, pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, true)
|
28
|
+
ib_handler.init(proto_handler)
|
29
|
+
return proto_handler
|
19
30
|
end
|
20
31
|
end
|
21
32
|
|
@@ -23,7 +34,7 @@ module Baykit
|
|
23
34
|
include Baykit::BayServer::Tours
|
24
35
|
include Baykit::BayServer::Agent
|
25
36
|
include Baykit::BayServer::Util
|
26
|
-
include Baykit::BayServer::
|
37
|
+
include Baykit::BayServer::Common
|
27
38
|
include Baykit::BayServer::Docker::Http::H1::Command
|
28
39
|
|
29
40
|
STATE_READ_HEADER = 1
|
@@ -32,35 +43,35 @@ module Baykit
|
|
32
43
|
|
33
44
|
FIXED_WARP_ID = 1
|
34
45
|
|
46
|
+
attr :protocol_handler
|
35
47
|
attr :state
|
36
48
|
|
37
|
-
def initialize(
|
38
|
-
super(pkt_store, false)
|
49
|
+
def initialize()
|
39
50
|
reset()
|
40
51
|
end
|
41
52
|
|
42
|
-
|
43
|
-
|
44
|
-
|
53
|
+
def init(proto_handler)
|
54
|
+
@protocol_handler = proto_handler
|
55
|
+
end
|
45
56
|
|
46
|
-
def
|
47
|
-
|
48
|
-
change_state(STATE_FINISHED)
|
57
|
+
def to_s
|
58
|
+
return ship.to_s
|
49
59
|
end
|
50
60
|
|
51
61
|
|
52
62
|
######################################################
|
53
|
-
# Implements
|
63
|
+
# Implements Reusable
|
54
64
|
######################################################
|
55
|
-
def next_warp_id
|
56
|
-
return H1WarpHandler::FIXED_WARP_ID
|
57
|
-
end
|
58
65
|
|
59
|
-
def
|
60
|
-
|
66
|
+
def reset
|
67
|
+
reset_state
|
61
68
|
end
|
62
69
|
|
63
|
-
|
70
|
+
######################################################
|
71
|
+
# Implements TourHandler
|
72
|
+
######################################################
|
73
|
+
|
74
|
+
def send_res_headers(tur)
|
64
75
|
twn = tur.town
|
65
76
|
|
66
77
|
twn_path = twn.name
|
@@ -68,7 +79,7 @@ module Baykit
|
|
68
79
|
twn_path += "/"
|
69
80
|
end
|
70
81
|
|
71
|
-
new_uri =
|
82
|
+
new_uri = ship.docker.warp_base + tur.req.uri[twn_path.length .. -1]
|
72
83
|
cmd = CmdHeader.new_req_header(tur.req.method, new_uri, "HTTP/1.1")
|
73
84
|
|
74
85
|
tur.req.headers.names.each do |name|
|
@@ -101,31 +112,39 @@ module Baykit
|
|
101
112
|
cmd.set_header(Headers::X_FORWARDED_HOST, tur.req.headers.get(Headers::HOST))
|
102
113
|
end
|
103
114
|
|
104
|
-
cmd.set_header(Headers::HOST, "#{
|
115
|
+
cmd.set_header(Headers::HOST, "#{ship.docker.host}:#{ship.docker.port}")
|
105
116
|
cmd.set_header(Headers::CONNECTION, "Keep-Alive")
|
106
117
|
|
107
|
-
if BayServer.harbor.trace_header
|
118
|
+
if BayServer.harbor.trace_header
|
108
119
|
cmd.headers.each do |kv|
|
109
120
|
BayLog.info("%s warp_http reqHdr: %s=%s", tur, kv[0], kv[1])
|
110
121
|
end
|
111
122
|
end
|
112
123
|
|
113
124
|
|
114
|
-
|
125
|
+
ship.post(cmd)
|
115
126
|
end
|
116
127
|
|
117
|
-
def
|
128
|
+
def send_res_content(tur, buf, start, len, &callback)
|
118
129
|
cmd = CmdContent.new(buf, start, len)
|
119
|
-
|
130
|
+
ship.post(cmd, &callback)
|
120
131
|
end
|
121
132
|
|
122
|
-
def
|
133
|
+
def send_end_tour(tur, keep_alive, &lis)
|
123
134
|
cmd = CmdEndContent.new()
|
124
|
-
|
125
|
-
|
126
|
-
end
|
135
|
+
ship.post(cmd, &lis)
|
136
|
+
end
|
127
137
|
|
128
|
-
|
138
|
+
|
139
|
+
######################################################
|
140
|
+
# Implements WarpHandler
|
141
|
+
######################################################
|
142
|
+
def next_warp_id
|
143
|
+
return H1WarpHandler::FIXED_WARP_ID
|
144
|
+
end
|
145
|
+
|
146
|
+
def new_warp_data(warp_id)
|
147
|
+
return WarpData.new(ship, warp_id)
|
129
148
|
end
|
130
149
|
|
131
150
|
def verify_protocol(proto)
|
@@ -137,26 +156,26 @@ module Baykit
|
|
137
156
|
######################################################
|
138
157
|
|
139
158
|
def handle_header(cmd)
|
140
|
-
tur =
|
159
|
+
tur = ship.get_tour(FIXED_WARP_ID)
|
141
160
|
wdat = WarpData.get(tur)
|
142
161
|
BayLog.debug("%s handleHeader status=%d", wdat, cmd.status);
|
143
|
-
|
162
|
+
ship.keeping = false
|
144
163
|
|
145
164
|
if @state == STATE_FINISHED
|
146
165
|
change_state(STATE_READ_HEADER)
|
147
166
|
end
|
148
167
|
|
149
168
|
if @state != STATE_READ_HEADER
|
150
|
-
raise ProtocolException("Header command not expected: state=%d", @state)
|
169
|
+
raise ProtocolException.new("Header command not expected: state=%d", @state)
|
151
170
|
end
|
152
171
|
|
153
|
-
if BayServer.harbor.trace_header
|
172
|
+
if BayServer.harbor.trace_header
|
154
173
|
BayLog.info("%s warp_http: resStatus: %d", wdat, cmd.status)
|
155
174
|
end
|
156
175
|
|
157
176
|
cmd.headers.each do |nv|
|
158
177
|
tur.res.headers.add(nv[0], nv[1])
|
159
|
-
if BayServer.harbor.trace_header
|
178
|
+
if BayServer.harbor.trace_header
|
160
179
|
BayLog.info("%s warp_http: resHeader: %s=%s", wdat, nv[0], nv[1]);
|
161
180
|
end
|
162
181
|
end
|
@@ -170,10 +189,10 @@ module Baykit
|
|
170
189
|
end_res_content(tur)
|
171
190
|
else
|
172
191
|
change_state(STATE_READ_CONTENT)
|
173
|
-
sid =
|
192
|
+
sid = ship.id()
|
174
193
|
tur.res.set_consume_listener do |len, resume|
|
175
194
|
if resume
|
176
|
-
|
195
|
+
ship.resume_read(sid)
|
177
196
|
end
|
178
197
|
end
|
179
198
|
end
|
@@ -181,7 +200,7 @@ module Baykit
|
|
181
200
|
end
|
182
201
|
|
183
202
|
def handle_content(cmd)
|
184
|
-
tur =
|
203
|
+
tur = ship.get_tour(FIXED_WARP_ID)
|
185
204
|
wdat = WarpData.get(tur)
|
186
205
|
BayLog.debug("%s handleContent len=%d posted%d contLen=%d", wdat, cmd.len, tur.res.bytes_posted, tur.res.bytes_limit);
|
187
206
|
|
@@ -189,7 +208,7 @@ module Baykit
|
|
189
208
|
raise ProtocolException.new("Content command not expected")
|
190
209
|
end
|
191
210
|
|
192
|
-
available = tur.res.
|
211
|
+
available = tur.res.send_res_content(Tour::TOUR_ID_NOCHECK, cmd.buf, cmd.start, cmd.len)
|
193
212
|
if tur.res.bytes_posted == tur.res.bytes_limit
|
194
213
|
end_res_content(tur)
|
195
214
|
return NextSocketAction::CONTINUE
|
@@ -204,26 +223,30 @@ module Baykit
|
|
204
223
|
raise Sink.new()
|
205
224
|
end
|
206
225
|
|
207
|
-
def
|
226
|
+
def req_finished
|
208
227
|
return @state == STATE_FINISHED
|
209
228
|
end
|
210
229
|
|
211
|
-
def to_s
|
212
|
-
return @ship.to_s
|
213
|
-
end
|
214
|
-
|
215
230
|
private
|
216
231
|
|
232
|
+
def reset_state
|
233
|
+
change_state(STATE_FINISHED)
|
234
|
+
end
|
235
|
+
|
217
236
|
def end_res_content(tur)
|
218
|
-
|
219
|
-
tur.res.
|
220
|
-
|
221
|
-
|
237
|
+
ship.end_warp_tour(tur)
|
238
|
+
tur.res.end_res_content(Tour::TOUR_ID_NOCHECK)
|
239
|
+
reset_state
|
240
|
+
ship.keeping = true
|
222
241
|
end
|
223
242
|
|
224
243
|
def change_state(new_state)
|
225
244
|
@state = new_state
|
226
245
|
end
|
246
|
+
|
247
|
+
def ship
|
248
|
+
return @protocol_handler.ship
|
249
|
+
end
|
227
250
|
end
|
228
251
|
end
|
229
252
|
end
|
@@ -6,19 +6,41 @@ module Baykit
|
|
6
6
|
module H2CommandHandler
|
7
7
|
include Baykit::BayServer::Protocol::CommandHandler # implements
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
def handle_preface(cmd)
|
10
|
+
raise NotImplementedError.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def handle_data(cmd)
|
14
|
+
raise NotImplementedError.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def handle_headers(cmd)
|
18
|
+
raise NotImplementedError.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle_priority(cmd)
|
22
|
+
raise NotImplementedError.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def handle_settings(cmd)
|
26
|
+
raise NotImplementedError.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def handle_window_update(cmd)
|
30
|
+
raise NotImplementedError.new
|
31
|
+
end
|
32
|
+
|
33
|
+
def handle_go_away(cmd)
|
34
|
+
raise NotImplementedError.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def handle_ping(cmd)
|
38
|
+
raise NotImplementedError.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def handle_rst_stream(cmd)
|
42
|
+
raise NotImplementedError.new
|
43
|
+
end
|
22
44
|
end
|
23
45
|
end
|
24
46
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
require 'baykit/bayserver/
|
1
|
+
require 'baykit/bayserver/common/inbound_handler'
|
2
|
+
|
3
|
+
require 'baykit/bayserver/protocol/packet_packer'
|
4
|
+
require 'baykit/bayserver/protocol/command_packer'
|
2
5
|
|
3
6
|
require 'baykit/bayserver/docker/http/h2/package'
|
4
7
|
require 'baykit/bayserver/docker/http/h2/h2_protocol_handler'
|
8
|
+
require 'baykit/bayserver/docker/http/h2/h2_handler'
|
5
9
|
require 'baykit/bayserver/docker/http/h2/command/package'
|
6
10
|
require 'baykit/bayserver/protocol/package'
|
7
11
|
require 'baykit/bayserver/tours/req_content_handler'
|
@@ -15,17 +19,30 @@ module Baykit
|
|
15
19
|
module Docker
|
16
20
|
module Http
|
17
21
|
module H2
|
18
|
-
class H2InboundHandler
|
22
|
+
class H2InboundHandler
|
19
23
|
|
20
24
|
class InboundProtocolHandlerFactory
|
21
25
|
include Baykit::BayServer::Protocol::ProtocolHandlerFactory # implements
|
22
26
|
|
27
|
+
include Baykit::BayServer::Protocol
|
28
|
+
|
23
29
|
def create_protocol_handler(pkt_store)
|
24
|
-
|
30
|
+
|
31
|
+
ib_handler = H2InboundHandler.new
|
32
|
+
cmd_unpacker = H2CommandUnPacker.new(ib_handler)
|
33
|
+
pkt_unpacker = H2PacketUnPacker.new(cmd_unpacker, pkt_store, true)
|
34
|
+
pkt_packer = PacketPacker.new()
|
35
|
+
cmd_packer = CommandPacker.new(pkt_packer, pkt_store)
|
36
|
+
|
37
|
+
proto_handler = H2ProtocolHandler.new(ib_handler, pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, true)
|
38
|
+
ib_handler.init(proto_handler)
|
39
|
+
return proto_handler
|
25
40
|
end
|
26
41
|
end
|
27
42
|
|
28
|
-
include Baykit::BayServer::
|
43
|
+
include Baykit::BayServer::Common::InboundHandler # implements
|
44
|
+
include H2Handler # implements
|
45
|
+
|
29
46
|
include Baykit::BayServer::Agent
|
30
47
|
include Baykit::BayServer::Protocol
|
31
48
|
include Baykit::BayServer::WaterCraft
|
@@ -33,6 +50,7 @@ module Baykit
|
|
33
50
|
include Baykit::BayServer::Util
|
34
51
|
include Baykit::BayServer::Docker::Http::H2::Command
|
35
52
|
|
53
|
+
attr :protocol_handler
|
36
54
|
attr :req_cont_len
|
37
55
|
attr :req_cont_read
|
38
56
|
attr :header_read
|
@@ -40,12 +58,15 @@ module Baykit
|
|
40
58
|
attr :settings
|
41
59
|
attr :analyzer
|
42
60
|
attr :http_protocol
|
61
|
+
attr :req_header_tbl
|
62
|
+
attr :res_header_tbl
|
43
63
|
|
44
|
-
def initialize
|
45
|
-
super(pkt_store, true)
|
64
|
+
def initialize
|
46
65
|
@window_size = BayServer.harbor.tour_buffer_size
|
47
66
|
@settings = H2Settings.new
|
48
67
|
@analyzer = HeaderBlockAnalyzer.new
|
68
|
+
@req_header_tbl = HeaderTable.create_dynamic_table()
|
69
|
+
@res_header_tbl = HeaderTable.create_dynamic_table()
|
49
70
|
end
|
50
71
|
|
51
72
|
######################################################
|
@@ -53,12 +74,15 @@ module Baykit
|
|
53
74
|
######################################################
|
54
75
|
|
55
76
|
def reset()
|
56
|
-
super
|
57
77
|
@header_read = false
|
58
78
|
@req_cont_len = 0
|
59
79
|
@req_cont_read = 0
|
60
80
|
end
|
61
81
|
|
82
|
+
def init(proto_handler)
|
83
|
+
@protocol_handler = proto_handler
|
84
|
+
end
|
85
|
+
|
62
86
|
######################################################
|
63
87
|
# implements InboundHandler
|
64
88
|
######################################################
|
@@ -70,7 +94,7 @@ module Baykit
|
|
70
94
|
cmd.header_blocks << blk
|
71
95
|
|
72
96
|
# headers
|
73
|
-
if BayServer.harbor.trace_header
|
97
|
+
if BayServer.harbor.trace_header
|
74
98
|
BayLog.info("%s res status: %d", tur, tur.res.headers.status)
|
75
99
|
end
|
76
100
|
tur.res.headers.names.each do |name|
|
@@ -78,7 +102,7 @@ module Baykit
|
|
78
102
|
BayLog.trace("%s Connection header is discarded", tur)
|
79
103
|
else
|
80
104
|
tur.res.headers.values(name).each do |value|
|
81
|
-
if BayServer.harbor.trace_header
|
105
|
+
if BayServer.harbor.trace_header
|
82
106
|
BayLog.info("%s H2 res header: %s=%s", tur, name, value)
|
83
107
|
end
|
84
108
|
blk = bld.build_header_block(name, value, @res_header_tbl)
|
@@ -90,21 +114,23 @@ module Baykit
|
|
90
114
|
cmd.flags.set_end_headers(true)
|
91
115
|
cmd.excluded = true
|
92
116
|
cmd.flags.set_padded(false)
|
93
|
-
@
|
117
|
+
@protocol_handler.post(cmd)
|
94
118
|
end
|
95
119
|
|
96
|
-
def send_res_content(tur, bytes, ofs, len, &
|
120
|
+
def send_res_content(tur, bytes, ofs, len, &callback)
|
121
|
+
BayLog.debug("%s send_res_content len=%d", self, len)
|
97
122
|
cmd = CmdData.new(tur.req.key, nil, bytes, ofs, len);
|
98
|
-
@
|
123
|
+
@protocol_handler.post(cmd, &callback)
|
99
124
|
end
|
100
125
|
|
101
126
|
def send_end_tour(tur, keep_alive, &callback)
|
127
|
+
BayLog.debug("%s send_end_tour. keep=%s", self, keep_alive)
|
102
128
|
cmd = CmdData.new(tur.req.key, nil, [], 0, 0)
|
103
129
|
cmd.flags.set_end_stream(true)
|
104
|
-
@
|
130
|
+
@protocol_handler.post(cmd, &callback)
|
105
131
|
end
|
106
132
|
|
107
|
-
def
|
133
|
+
def on_protocol_error(err)
|
108
134
|
BayLog.error_e err
|
109
135
|
cmd = CmdGoAway.new(CTL_STREAM_ID)
|
110
136
|
cmd.stream_id = CTL_STREAM_ID
|
@@ -112,8 +138,8 @@ module Baykit
|
|
112
138
|
cmd.error_code = H2ErrorCode::PROTOCOL_ERROR
|
113
139
|
cmd.debug_data = "Thank you!"
|
114
140
|
begin
|
115
|
-
@
|
116
|
-
@
|
141
|
+
@protocol_handler.post(cmd)
|
142
|
+
@protocol_handler.end(ship)
|
117
143
|
rescue IOError => e
|
118
144
|
BayLog.error_e(e)
|
119
145
|
end
|
@@ -126,7 +152,7 @@ module Baykit
|
|
126
152
|
######################################################
|
127
153
|
|
128
154
|
def handle_preface(cmd)
|
129
|
-
BayLog.debug("%s h2: handle_preface: proto=%s",
|
155
|
+
BayLog.debug("%s h2: handle_preface: proto=%s", ship, cmd.protocol)
|
130
156
|
|
131
157
|
@http_protocol = cmd.protocol
|
132
158
|
|
@@ -134,7 +160,7 @@ module Baykit
|
|
134
160
|
set.stream_id = 0
|
135
161
|
set.items.append(CmdSettings::Item.new(CmdSettings::MAX_CONCURRENT_STREAMS, TourStore::MAX_TOURS))
|
136
162
|
set.items.append(CmdSettings::Item.new(CmdSettings::INITIAL_WINDOW_SIZE, @window_size))
|
137
|
-
@
|
163
|
+
@protocol_handler.post(set)
|
138
164
|
|
139
165
|
set = CmdSettings.new(H2ProtocolHandler::CTL_STREAM_ID)
|
140
166
|
set.stream_id = 0
|
@@ -145,12 +171,12 @@ module Baykit
|
|
145
171
|
|
146
172
|
|
147
173
|
def handle_headers(cmd)
|
148
|
-
BayLog.debug("%s handle_headers: stm=%d dep=%d weight=%d",
|
174
|
+
BayLog.debug("%s handle_headers: stm=%d dep=%d weight=%d", ship, cmd.stream_id, cmd.stream_dependency, cmd.weight)
|
149
175
|
|
150
176
|
tur = get_tour(cmd.stream_id)
|
151
177
|
if tur == nil
|
152
178
|
BayLog.error(BayMessage.get(:INT_NO_MORE_TOURS))
|
153
|
-
tur =
|
179
|
+
tur = ship.get_tour(cmd.stream_id, true)
|
154
180
|
tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "No available tours")
|
155
181
|
return NextSocketAction::CONTINUE
|
156
182
|
end
|
@@ -162,7 +188,7 @@ module Baykit
|
|
162
188
|
next
|
163
189
|
end
|
164
190
|
@analyzer.analyze_header_block(blk, @req_header_tbl)
|
165
|
-
if BayServer.harbor.trace_header
|
191
|
+
if BayServer.harbor.trace_header
|
166
192
|
BayLog.info("%s req header: %s=%s :%s", tur, @analyzer.name, @analyzer.value, blk);
|
167
193
|
end
|
168
194
|
|
@@ -188,33 +214,12 @@ module Baykit
|
|
188
214
|
if cmd.flags.end_headers?
|
189
215
|
tur.req.protocol = "HTTP/2.0"
|
190
216
|
BayLog.debug("%s H2 read header method=%s protocol=%s uri=%s contlen=%d",
|
191
|
-
|
217
|
+
ship, tur.req.method, tur.req.protocol, tur.req.uri, tur.req.headers.content_length)
|
192
218
|
|
193
219
|
req_cont_len = tur.req.headers.content_length()
|
194
220
|
|
195
221
|
if req_cont_len > 0
|
196
|
-
|
197
|
-
tur.req.set_consume_listener(req_cont_len) do |len, resume|
|
198
|
-
@ship.check_ship_id(sid)
|
199
|
-
if len > 0
|
200
|
-
upd = CmdWindowUpdate.new(cmd.stream_id)
|
201
|
-
upd.window_size_increment = len
|
202
|
-
upd2 = CmdWindowUpdate.new( 0)
|
203
|
-
upd2.window_size_increment = len
|
204
|
-
cmd_packer = @command_packer
|
205
|
-
begin
|
206
|
-
cmd_packer.post(@ship, upd)
|
207
|
-
cmd_packer.post(@ship, upd2)
|
208
|
-
rescue IOError => e
|
209
|
-
BayLog.error_e(e)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
if resume
|
214
|
-
@ship.resume(Ship::SHIP_ID_NOCHECK)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
222
|
+
tur.req.set_limit(req_cont_len)
|
218
223
|
end
|
219
224
|
|
220
225
|
begin
|
@@ -227,6 +232,7 @@ module Baykit
|
|
227
232
|
BayLog.debug("%s Http error occurred: %s", self, e);
|
228
233
|
if req_cont_len <= 0
|
229
234
|
# no post data
|
235
|
+
tur.req.abort
|
230
236
|
tur.res.send_http_exception(Tour::TOUR_ID_NOCHECK, e)
|
231
237
|
|
232
238
|
return NextSocketAction::CONTINUE
|
@@ -244,7 +250,7 @@ module Baykit
|
|
244
250
|
end
|
245
251
|
|
246
252
|
def handle_data(cmd)
|
247
|
-
BayLog.debug("%s handle_data: stm=%d len=%d",
|
253
|
+
BayLog.debug("%s handle_data: stm=%d len=%d", ship, cmd.stream_id, cmd.length)
|
248
254
|
|
249
255
|
tur = get_tour(cmd.stream_id)
|
250
256
|
if tur == nil
|
@@ -254,29 +260,51 @@ module Baykit
|
|
254
260
|
raise ProtocolException.new("Post content not allowed")
|
255
261
|
end
|
256
262
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
if tur.error != nil
|
262
|
-
# Error has occurred on header completed
|
263
|
+
begin
|
264
|
+
success = false
|
265
|
+
if cmd.length > 0
|
266
|
+
tid = tur.tour_id
|
263
267
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
+
success = tur.req.post_req_content(Tour::TOUR_ID_NOCHECK, cmd.data, cmd.start, cmd.length) do |len, resume|
|
269
|
+
tur.check_tour_id(tid)
|
270
|
+
if len > 0
|
271
|
+
upd = CmdWindowUpdate.new(cmd.stream_id)
|
272
|
+
upd.window_size_increment = len
|
273
|
+
upd2 = CmdWindowUpdate.new( 0)
|
274
|
+
upd2.window_size_increment = len
|
275
|
+
begin
|
276
|
+
@protocol_handler.post(upd)
|
277
|
+
@protocol_handler.post(upd2)
|
278
|
+
rescue IOError => e
|
279
|
+
BayLog.error_e(e)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
if resume
|
284
|
+
tur.ship.resume_read(Ship::SHIP_ID_NOCHECK)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
if tur.req.bytes_posted >= tur.req.headers.content_length
|
289
|
+
if tur.error != nil
|
290
|
+
# Error has occurred on header completed
|
291
|
+
BayLog.debug("%s Delay report error", tur)
|
292
|
+
raise tur.error
|
293
|
+
else
|
268
294
|
end_req_content(tur.id(), tur)
|
269
|
-
rescue HttpException => e
|
270
|
-
tur.res.send_http_exception(Tour::TOUR_ID_NOCHECK, e)
|
271
|
-
return NextSocketAction::CONTINUE
|
272
295
|
end
|
273
296
|
end
|
274
297
|
end
|
275
|
-
end
|
276
298
|
|
277
|
-
|
278
|
-
|
279
|
-
|
299
|
+
if !success
|
300
|
+
return NextSocketAction::SUSPEND
|
301
|
+
else
|
302
|
+
return NextSocketAction::CONTINUE
|
303
|
+
end
|
304
|
+
|
305
|
+
rescue HttpException => e
|
306
|
+
tur.req.abort
|
307
|
+
tur.res.send_http_exception(Tour::TOUR_ID_NOCHECK, e)
|
280
308
|
return NextSocketAction::CONTINUE
|
281
309
|
end
|
282
310
|
|
@@ -288,20 +316,20 @@ module Baykit
|
|
288
316
|
end
|
289
317
|
|
290
318
|
BayLog.debug("%s handlePriority: stmid=%d dep=%d, wgt=%d",
|
291
|
-
|
319
|
+
ship, cmd.stream_id, cmd.stream_dependency, cmd.weight);
|
292
320
|
|
293
321
|
return NextSocketAction::CONTINUE
|
294
322
|
end
|
295
323
|
|
296
324
|
def handle_settings(cmd)
|
297
|
-
BayLog.debug("%s handleSettings: stmid=%d",
|
325
|
+
BayLog.debug("%s handleSettings: stmid=%d", ship, cmd.stream_id);
|
298
326
|
|
299
327
|
if cmd.flags.ack?
|
300
328
|
return NextSocketAction::CONTINUE
|
301
329
|
end
|
302
330
|
|
303
331
|
cmd.items.each do |item|
|
304
|
-
BayLog.debug("%s handle: Setting id=%d, value=%d",
|
332
|
+
BayLog.debug("%s handle: Setting id=%d, value=%d", ship, item.id, item.value);
|
305
333
|
case item.id
|
306
334
|
when CmdSettings::HEADER_TABLE_SIZE
|
307
335
|
@settings.header_table_size = item.value
|
@@ -328,12 +356,12 @@ module Baykit
|
|
328
356
|
end
|
329
357
|
|
330
358
|
res = CmdSettings.new(0, H2Flags.new(H2Flags::FLAGS_ACK))
|
331
|
-
@
|
359
|
+
@protocol_handler.post(res)
|
332
360
|
return NextSocketAction::CONTINUE
|
333
361
|
end
|
334
362
|
|
335
363
|
def handle_window_update(cmd)
|
336
|
-
BayLog.debug("%s handleWindowUpdate: stmid=%d siz=%d",
|
364
|
+
BayLog.debug("%s handleWindowUpdate: stmid=%d siz=%d", ship, cmd.stream_id, cmd.window_size_increment);
|
337
365
|
|
338
366
|
if cmd.window_size_increment == 0
|
339
367
|
raise ProtocolException.new("Invalid increment value")
|
@@ -345,40 +373,54 @@ module Baykit
|
|
345
373
|
|
346
374
|
def handle_go_away(cmd)
|
347
375
|
BayLog.debug("%s received GoAway: lastStm=%d code=%d desc=%s debug=%s",
|
348
|
-
|
376
|
+
ship, cmd.last_stream_id, cmd.error_code, H2ErrorCode.msg.get(cmd.error_code.to_s.to_sym), cmd.debug_data);
|
349
377
|
return NextSocketAction::CLOSE
|
350
378
|
end
|
351
379
|
|
352
380
|
def handle_ping(cmd)
|
353
|
-
BayLog.debug("%s handle_ping: stm=%d",
|
381
|
+
BayLog.debug("%s handle_ping: stm=%d", ship, cmd.stream_id)
|
354
382
|
|
355
383
|
res = CmdPing.new(cmd.stream_id, H2Flags.new(H2Flags::FLAGS_ACK), cmd.opaque_data)
|
356
|
-
@
|
384
|
+
@protocol_handler.post(res)
|
357
385
|
return NextSocketAction::CONTINUE
|
358
386
|
end
|
359
387
|
|
360
388
|
def handle_rst_stream(cmd)
|
361
|
-
BayLog.
|
362
|
-
|
363
|
-
|
389
|
+
BayLog.warn("%s received RstStream: stmid=%d code=%d desc=%s",
|
390
|
+
ship, cmd.stream_id, cmd.error_code, H2ErrorCode.msg.get(cmd.error_code.to_s.to_sym))
|
391
|
+
tur = get_tour(cmd.stream_id)
|
392
|
+
if tur == nil
|
393
|
+
BayLog.warn("%s stream not found id=%d", ship, cmd.stream_id)
|
394
|
+
else
|
395
|
+
tur.req.abort
|
396
|
+
return NextSocketAction::CONTINUE
|
397
|
+
end
|
364
398
|
end
|
365
399
|
|
366
400
|
private
|
401
|
+
|
402
|
+
def ship
|
403
|
+
return @protocol_handler.ship
|
404
|
+
end
|
405
|
+
|
367
406
|
def get_tour(key)
|
368
|
-
|
407
|
+
ship.get_tour(key)
|
369
408
|
end
|
370
409
|
|
371
410
|
def end_req_content(check_id, tur)
|
372
|
-
tur.req.
|
411
|
+
tur.req.end_req_content check_id
|
373
412
|
end
|
374
413
|
|
375
414
|
def start_tour(tur)
|
376
|
-
HttpUtil.parse_host_port(tur,
|
415
|
+
HttpUtil.parse_host_port(tur, ship.port_docker.secure ? 443 : 80)
|
377
416
|
HttpUtil.parse_authorization(tur)
|
378
417
|
|
379
418
|
tur.req.protocol = @http_protocol
|
380
419
|
|
381
|
-
skt =
|
420
|
+
skt = ship.rudder.io
|
421
|
+
if skt.kind_of? OpenSSL::SSL::SSLSocket
|
422
|
+
skt = skt.io
|
423
|
+
end
|
382
424
|
|
383
425
|
client_adr = tur.req.headers.get(Headers::X_FORWARDED_FOR)
|
384
426
|
if client_adr
|
@@ -399,12 +441,12 @@ module Baykit
|
|
399
441
|
server_port, tur.req.server_address = Socket.unpack_sockaddr_in(server_addr)
|
400
442
|
rescue => e
|
401
443
|
BayLog.error_e(e)
|
402
|
-
BayLog.debug("%s Caught error (Continue)",
|
444
|
+
BayLog.debug("%s Caught error (Continue)", ship)
|
403
445
|
end
|
404
446
|
|
405
447
|
tur.req.server_port = tur.req.req_port
|
406
448
|
tur.req.server_name = tur.req.req_host
|
407
|
-
tur.is_secure =
|
449
|
+
tur.is_secure = ship.port_docker.secure
|
408
450
|
|
409
451
|
tur.go
|
410
452
|
end
|
@@ -20,17 +20,9 @@ module Baykit
|
|
20
20
|
|
21
21
|
CTL_STREAM_ID = 0
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def initialize(pkt_store, svr_mode)
|
27
|
-
@command_unpacker = H2CommandUnPacker.new(self)
|
28
|
-
@packet_unpacker = H2PacketUnPacker.new(@command_unpacker, pkt_store, svr_mode)
|
29
|
-
@packet_packer = PacketPacker.new()
|
30
|
-
@command_packer = CommandPacker.new(@packet_packer, pkt_store)
|
31
|
-
@server_mode = svr_mode
|
32
|
-
@req_header_tbl = HeaderTable.create_dynamic_table()
|
33
|
-
@res_header_tbl = HeaderTable.create_dynamic_table()
|
23
|
+
|
24
|
+
def initialize(h2_handler, pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, svr_mode)
|
25
|
+
super(pkt_unpacker, pkt_packer, cmd_unpacker, cmd_packer, h2_handler, svr_mode)
|
34
26
|
end
|
35
27
|
|
36
28
|
######################################################
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'baykit/bayserver/
|
1
|
+
require 'baykit/bayserver/common/warp_handler'
|
2
2
|
require 'baykit/bayserver/protocol/protocol_exception'
|
3
3
|
|
4
4
|
module Baykit
|
@@ -7,7 +7,7 @@ module Baykit
|
|
7
7
|
module Http
|
8
8
|
module H2
|
9
9
|
class H2WarpHandler < H2ProtocolHandler
|
10
|
-
include Baykit::BayServer::
|
10
|
+
include Baykit::BayServer::Common::WarpHandler # implements
|
11
11
|
|
12
12
|
class WarpProtocolHandlerFactory
|
13
13
|
include Baykit::BayServer::Protocol::ProtocolHandlerFactory # implements
|
@@ -2,8 +2,8 @@ require 'openssl'
|
|
2
2
|
|
3
3
|
require 'baykit/bayserver/agent/transporter/package'
|
4
4
|
require 'baykit/bayserver/docker/base/port_base'
|
5
|
+
require 'baykit/bayserver/docker/base/warp_base'
|
5
6
|
require 'baykit/bayserver/protocol/packet_store'
|
6
|
-
require 'baykit/bayserver/docker/warp/package'
|
7
7
|
require 'baykit/bayserver/docker/http/h1/package'
|
8
8
|
require 'baykit/bayserver/docker/http/h2/package'
|
9
9
|
|
@@ -12,7 +12,7 @@ module Baykit
|
|
12
12
|
module BayServer
|
13
13
|
module Docker
|
14
14
|
module Http
|
15
|
-
class HtpWarpDocker < Baykit::BayServer::Docker::
|
15
|
+
class HtpWarpDocker < Baykit::BayServer::Docker::Base::WarpBase
|
16
16
|
include Baykit::BayServer::Docker::Http::HtpDocker # implements
|
17
17
|
|
18
18
|
include OpenSSL
|
@@ -89,12 +89,25 @@ module Baykit
|
|
89
89
|
return H1_PROTO_NAME
|
90
90
|
end
|
91
91
|
|
92
|
-
def new_transporter(agt,
|
92
|
+
def new_transporter(agt, rd, sip)
|
93
93
|
if @secure
|
94
|
-
|
94
|
+
tp = SecureTransporter.new(
|
95
|
+
agt.net_multiplexer,
|
96
|
+
sip,
|
97
|
+
false,
|
98
|
+
false, IOUtil.get_sock_recv_buf_size(rd.io),
|
99
|
+
@trace_ssl,
|
100
|
+
@ssl_ctx)
|
95
101
|
else
|
96
|
-
|
102
|
+
tp = PlainTransporter.new(
|
103
|
+
agt.net_multiplexer,
|
104
|
+
sip,
|
105
|
+
false,
|
106
|
+
IOUtil.get_sock_recv_buf_size(rd.io),
|
107
|
+
false)
|
97
108
|
end
|
109
|
+
tp.init
|
110
|
+
return tp
|
98
111
|
end
|
99
112
|
|
100
113
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bayserver-docker-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michisuke-P
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bayserver-core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.0
|
27
27
|
description: BayServer is one of the high-speed web servers. It operates as a single-threaded,
|
28
28
|
asynchronous server, which makes it exceptionally fast. It also supports multi-core
|
29
29
|
processors, harnessing the full potential of the CPU's capabilities.
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/baykit/bayserver/docker/http/h1/h1_command.rb
|
42
42
|
- lib/baykit/bayserver/docker/http/h1/h1_command_handler.rb
|
43
43
|
- lib/baykit/bayserver/docker/http/h1/h1_command_unpacker.rb
|
44
|
+
- lib/baykit/bayserver/docker/http/h1/h1_handler.rb
|
44
45
|
- lib/baykit/bayserver/docker/http/h1/h1_inbound_handler.rb
|
45
46
|
- lib/baykit/bayserver/docker/http/h1/h1_packet.rb
|
46
47
|
- lib/baykit/bayserver/docker/http/h1/h1_packet_factory.rb
|
@@ -64,6 +65,7 @@ files:
|
|
64
65
|
- lib/baykit/bayserver/docker/http/h2/h2_command_unpacker.rb
|
65
66
|
- lib/baykit/bayserver/docker/http/h2/h2_error_code.rb
|
66
67
|
- lib/baykit/bayserver/docker/http/h2/h2_flags.rb
|
68
|
+
- lib/baykit/bayserver/docker/http/h2/h2_handler.rb
|
67
69
|
- lib/baykit/bayserver/docker/http/h2/h2_inbound_handler.rb
|
68
70
|
- lib/baykit/bayserver/docker/http/h2/h2_packet.rb
|
69
71
|
- lib/baykit/bayserver/docker/http/h2/h2_packet_factory.rb
|