bayserver-docker-http 2.2.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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/docker/http/h1/command/cmd_content.rb +46 -0
  3. data/lib/baykit/bayserver/docker/http/h1/command/cmd_end_content.rb +37 -0
  4. data/lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb +306 -0
  5. data/lib/baykit/bayserver/docker/http/h1/command/package.rb +3 -0
  6. data/lib/baykit/bayserver/docker/http/h1/h1_command.rb +19 -0
  7. data/lib/baykit/bayserver/docker/http/h1/h1_command_handler.rb +31 -0
  8. data/lib/baykit/bayserver/docker/http/h1/h1_command_unpacker.rb +58 -0
  9. data/lib/baykit/bayserver/docker/http/h1/h1_inbound_handler.rb +371 -0
  10. data/lib/baykit/bayserver/docker/http/h1/h1_packet.rb +28 -0
  11. data/lib/baykit/bayserver/docker/http/h1/h1_packet_factory.rb +21 -0
  12. data/lib/baykit/bayserver/docker/http/h1/h1_packet_unpacker.rb +180 -0
  13. data/lib/baykit/bayserver/docker/http/h1/h1_protocol_handler.rb +66 -0
  14. data/lib/baykit/bayserver/docker/http/h1/h1_type.rb +18 -0
  15. data/lib/baykit/bayserver/docker/http/h1/h1_warp_handler.rb +228 -0
  16. data/lib/baykit/bayserver/docker/http/h1/package.rb +11 -0
  17. data/lib/baykit/bayserver/docker/http/h2/command/cmd_data.rb +65 -0
  18. data/lib/baykit/bayserver/docker/http/h2/command/cmd_go_away.rb +67 -0
  19. data/lib/baykit/bayserver/docker/http/h2/command/cmd_headers.rb +108 -0
  20. data/lib/baykit/bayserver/docker/http/h2/command/cmd_ping.rb +50 -0
  21. data/lib/baykit/bayserver/docker/http/h2/command/cmd_preface.rb +51 -0
  22. data/lib/baykit/bayserver/docker/http/h2/command/cmd_priority.rb +59 -0
  23. data/lib/baykit/bayserver/docker/http/h2/command/cmd_rst_stream.rb +50 -0
  24. data/lib/baykit/bayserver/docker/http/h2/command/cmd_settings.rb +98 -0
  25. data/lib/baykit/bayserver/docker/http/h2/command/cmd_window_update.rb +53 -0
  26. data/lib/baykit/bayserver/docker/http/h2/command/package.rb +9 -0
  27. data/lib/baykit/bayserver/docker/http/h2/h2_command.rb +42 -0
  28. data/lib/baykit/bayserver/docker/http/h2/h2_command_handler.rb +29 -0
  29. data/lib/baykit/bayserver/docker/http/h2/h2_command_unpacker.rb +73 -0
  30. data/lib/baykit/bayserver/docker/http/h2/h2_error_code.rb +53 -0
  31. data/lib/baykit/bayserver/docker/http/h2/h2_flags.rb +82 -0
  32. data/lib/baykit/bayserver/docker/http/h2/h2_inbound_handler.rb +417 -0
  33. data/lib/baykit/bayserver/docker/http/h2/h2_packet.rb +204 -0
  34. data/lib/baykit/bayserver/docker/http/h2/h2_packet_factory.rb +21 -0
  35. data/lib/baykit/bayserver/docker/http/h2/h2_packet_unpacker.rb +224 -0
  36. data/lib/baykit/bayserver/docker/http/h2/h2_protocol_handler.rb +58 -0
  37. data/lib/baykit/bayserver/docker/http/h2/h2_settings.rb +42 -0
  38. data/lib/baykit/bayserver/docker/http/h2/h2_type.rb +26 -0
  39. data/lib/baykit/bayserver/docker/http/h2/h2_warp_handler.rb +142 -0
  40. data/lib/baykit/bayserver/docker/http/h2/header_block.rb +191 -0
  41. data/lib/baykit/bayserver/docker/http/h2/header_block_analyzer.rb +88 -0
  42. data/lib/baykit/bayserver/docker/http/h2/header_block_builder.rb +68 -0
  43. data/lib/baykit/bayserver/docker/http/h2/header_table.rb +167 -0
  44. data/lib/baykit/bayserver/docker/http/h2/huffman/hnode.rb +28 -0
  45. data/lib/baykit/bayserver/docker/http/h2/huffman/htree.rb +339 -0
  46. data/lib/baykit/bayserver/docker/http/h2/package.rb +17 -0
  47. data/lib/baykit/bayserver/docker/http/htp_docker.rb +23 -0
  48. data/lib/baykit/bayserver/docker/http/htp_port_docker.rb +107 -0
  49. data/lib/baykit/bayserver/docker/http/htp_warp_docker.rb +125 -0
  50. data/lib/baykit/bayserver/docker/http/htp_warp_ship_helper.rb +19 -0
  51. data/lib/baykit/bayserver/docker/http/package.rb +6 -0
  52. metadata +106 -0
@@ -0,0 +1,228 @@
1
+ require 'baykit/bayserver/tours/tour'
2
+ require 'baykit/bayserver/protocol/protocol_exception'
3
+ require 'baykit/bayserver/docker/warp/package'
4
+ require 'baykit/bayserver/docker/http/h1/command/package'
5
+
6
+ module Baykit
7
+ module BayServer
8
+ module Docker
9
+ module Http
10
+ module H1
11
+ class H1WarpHandler < H1ProtocolHandler
12
+ include Baykit::BayServer::Docker::Warp::WarpHandler # implements
13
+
14
+ class WarpProtocolHandlerFactory
15
+ include Baykit::BayServer::Protocol::ProtocolHandlerFactory # implements
16
+
17
+ def create_protocol_handler(pkt_store)
18
+ return H1WarpHandler.new(pkt_store)
19
+ end
20
+ end
21
+
22
+ include Baykit::BayServer::Protocol
23
+ include Baykit::BayServer::Tours
24
+ include Baykit::BayServer::Agent
25
+ include Baykit::BayServer::Util
26
+ include Baykit::BayServer::Docker::Warp
27
+ include Baykit::BayServer::Docker::Http::H1::Command
28
+
29
+ STATE_READ_HEADER = 1
30
+ STATE_READ_CONTENT = 2
31
+ STATE_FINISHED = 3
32
+
33
+ FIXED_WARP_ID = 1
34
+
35
+ attr :state
36
+
37
+ def initialize(pkt_store)
38
+ super(pkt_store, false)
39
+ reset()
40
+ end
41
+
42
+ ######################################################
43
+ # Implements Reusable
44
+ ######################################################
45
+
46
+ def reset()
47
+ super
48
+ change_state(STATE_FINISHED)
49
+ end
50
+
51
+
52
+ ######################################################
53
+ # Implements WarpHandler
54
+ ######################################################
55
+ def next_warp_id
56
+ return H1WarpHandler::FIXED_WARP_ID
57
+ end
58
+
59
+ def new_warp_data(warp_id)
60
+ return WarpData.new(@ship, warp_id)
61
+ end
62
+
63
+ def post_warp_headers(tur)
64
+ twn = tur.town
65
+
66
+ twn_path = twn.name
67
+ if !twn_path.end_with?("/")
68
+ twn_path += "/"
69
+ end
70
+
71
+ new_uri = @ship.docker.warp_base + tur.req.uri[twn_path.length .. -1]
72
+ cmd = CmdHeader.new_req_header(tur.req.method, new_uri, "HTTP/1.1")
73
+
74
+ tur.req.headers.names.each do |name|
75
+ tur.req.headers.values(name).each do |value|
76
+ cmd.add_header(name, value)
77
+ end
78
+ end
79
+
80
+ if tur.req.headers.contains(Headers::X_FORWARDED_FOR)
81
+ cmd.set_header(Headers::X_FORWARDED_FOR, tur.req.headers.get(Headers::X_FORWARDED_FOR))
82
+ else
83
+ cmd.set_header(Headers::X_FORWARDED_FOR, tur.req.remote_address)
84
+ end
85
+
86
+ if tur.req.headers.contains(Headers::X_FORWARDED_PROTO)
87
+ cmd.set_header(Headers::X_FORWARDED_PROTO, tur.req.headers.get(Headers::X_FORWARDED_PROTO))
88
+ else
89
+ cmd.set_header(Headers::X_FORWARDED_PROTO, tur.is_secure ? "https" : "http")
90
+ end
91
+
92
+ if tur.req.headers.contains(Headers::X_FORWARDED_PORT)
93
+ cmd.set_header(Headers::X_FORWARDED_PORT, tur.req.headers.get(Headers::X_FORWARDED_PORT))
94
+ else
95
+ cmd.set_header(Headers::X_FORWARDED_PORT, tur.req.server_port.to_s)
96
+ end
97
+
98
+ if tur.req.headers.contains(Headers::X_FORWARDED_HOST)
99
+ cmd.set_header(Headers::X_FORWARDED_HOST, tur.req.headers.get(Headers::X_FORWARDED_HOST))
100
+ else
101
+ cmd.set_header(Headers::X_FORWARDED_HOST, tur.req.headers.get(Headers::HOST))
102
+ end
103
+
104
+ cmd.set_header(Headers::HOST, "#{@ship.docker.host}:#{@ship.docker.port}")
105
+ cmd.set_header(Headers::CONNECTION, "Keep-Alive")
106
+
107
+ if BayServer.harbor.trace_header?
108
+ cmd.headers.each do |kv|
109
+ BayLog.info("%s warp_http reqHdr: %s=%s", tur, kv[0], kv[1])
110
+ end
111
+ end
112
+
113
+
114
+ @command_packer.post(@ship, cmd)
115
+ end
116
+
117
+ def post_warp_contents(tur, buf, start, len, &callback)
118
+ cmd = CmdContent.new(buf, start, len)
119
+ @command_packer.post(@ship, cmd, &callback)
120
+ end
121
+
122
+ def post_warp_end(tur)
123
+
124
+ end
125
+
126
+ def verify_protocol(proto)
127
+
128
+ end
129
+
130
+ ######################################################
131
+ # Implements H1CommandHandler
132
+ ######################################################
133
+
134
+ def handle_header(cmd)
135
+ tur = @ship.get_tour(FIXED_WARP_ID)
136
+ wdat = WarpData.get(tur)
137
+ BayLog.debug("%s handleHeader status=%d", wdat, cmd.status);
138
+ @ship.keeping = false
139
+
140
+ if @state == STATE_FINISHED
141
+ change_state(STATE_READ_HEADER)
142
+ end
143
+
144
+ if @state != STATE_READ_HEADER
145
+ raise ProtocolException("Header command not expected: state=%d", @state)
146
+ end
147
+
148
+ if BayServer.harbor.trace_header?
149
+ BayLog.info("%s warp_http: resStatus: %d", wdat, cmd.status)
150
+ end
151
+
152
+ cmd.headers.each do |nv|
153
+ tur.res.headers.add(nv[0], nv[1])
154
+ if BayServer.harbor.trace_header?
155
+ BayLog.info("%s warp_http: resHeader: %s=%s", wdat, nv[0], nv[1]);
156
+ end
157
+ end
158
+
159
+ tur.res.headers.status = cmd.status
160
+ res_cont_len = tur.res.headers.content_length
161
+ tur.res.send_headers(Tour::TOUR_ID_NOCHECK)
162
+
163
+ BayLog.debug("%s contLen in header: %d", wdat, res_cont_len)
164
+ if res_cont_len == 0 || cmd.status == HttpStatus::NOT_MODIFIED
165
+ end_res_content(tur)
166
+ else
167
+ change_state(STATE_READ_CONTENT)
168
+ sid = @ship.id()
169
+ tur.res.set_consume_listener do |len, resume|
170
+ if resume
171
+ @ship.resume(sid)
172
+ end
173
+ end
174
+ end
175
+ return NextSocketAction::CONTINUE
176
+ end
177
+
178
+ def handle_content(cmd)
179
+ tur = @ship.get_tour(FIXED_WARP_ID)
180
+ wdat = WarpData.get(tur)
181
+ BayLog.debug("%s handleContent len=%d posted%d contLen=%d", wdat, cmd.len, tur.res.bytes_posted, tur.res.bytes_limit);
182
+
183
+ if @state != STATE_READ_CONTENT
184
+ raise ProtocolException.new("Content command not expected")
185
+ end
186
+
187
+ available = tur.res.send_content(Tour::TOUR_ID_NOCHECK, cmd.buf, cmd.start, cmd.len)
188
+ if tur.res.bytes_posted == tur.res.bytes_limit
189
+ end_res_content(tur)
190
+ return NextSocketAction::CONTINUE
191
+ elsif !available
192
+ return NextSocketAction::SUSPEND
193
+ else
194
+ NextSocketAction::CONTINUE
195
+ end
196
+ end
197
+
198
+ def handle_end_content(cmd)
199
+ raise Sink.new()
200
+ end
201
+
202
+ def finished()
203
+ return @state == STATE_FINISHED
204
+ end
205
+
206
+ def to_s
207
+ return @ship.to_s
208
+ end
209
+
210
+ private
211
+
212
+ def end_res_content(tur)
213
+ @ship.end_warp_tour(tur)
214
+ tur.res.end_content(Tour::TOUR_ID_NOCHECK)
215
+ reset()
216
+ @ship.keeping = true
217
+ end
218
+
219
+ def change_state(new_state)
220
+ @state = new_state
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
@@ -0,0 +1,11 @@
1
+ require 'baykit/bayserver/docker/http/h1/h1_type'
2
+ require 'baykit/bayserver/docker/http/h1/h1_packet'
3
+ require 'baykit/bayserver/docker/http/h1/h1_packet_factory'
4
+ require 'baykit/bayserver/docker/http/h1/h1_packet_unpacker'
5
+ require 'baykit/bayserver/docker/http/h1/h1_command'
6
+ require 'baykit/bayserver/docker/http/h1/h1_command_unpacker'
7
+ require 'baykit/bayserver/docker/http/h1/h1_command_handler'
8
+ require 'baykit/bayserver/docker/http/h1/h1_inbound_handler'
9
+ require 'baykit/bayserver/docker/http/h1/h1_protocol_handler'
10
+ require 'baykit/bayserver/docker/http/h1/h1_warp_handler'
11
+
@@ -0,0 +1,65 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ #
4
+ # HTTP/2 Data payload format
5
+ #
6
+ # +---------------+
7
+ # |Pad Length? (8)|
8
+ # +---------------+-----------------------------------------------+
9
+ # | Data (*) ...
10
+ # +---------------------------------------------------------------+
11
+ # | Padding (*) ...
12
+ # +---------------------------------------------------------------+
13
+ #
14
+ module Baykit
15
+ module BayServer
16
+ module Docker
17
+ module Http
18
+ module H2
19
+ module Command
20
+
21
+ class CmdData < Baykit::BayServer::Docker::Http::H2::H2Command
22
+ include Baykit::BayServer::Docker::Http::H2
23
+
24
+ #
25
+ # This class refers external byte array, so this IS NOT mutable
26
+ #
27
+ attr :start
28
+ attr :length
29
+ attr :data
30
+
31
+ def initialize(stream_id, flags, data=nil, start=nil, len=nil)
32
+ super(H2Type::DATA, stream_id, flags)
33
+ @data = data
34
+ @start = start
35
+ @length = len
36
+ end
37
+
38
+ def unpack(pkt)
39
+ super
40
+ @data = pkt.buf
41
+ @start = pkt.header_len
42
+ @length = pkt.data_len()
43
+ end
44
+
45
+ def pack(pkt)
46
+ acc = pkt.new_data_accessor()
47
+ if @flags.padded?
48
+ raise RuntimeError.new("Padding not supported")
49
+ end
50
+ acc.put_bytes(@data, @start, @length)
51
+ super
52
+ end
53
+
54
+ def handle(cmd_handler)
55
+ return cmd_handler.handle_data(self)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+
@@ -0,0 +1,67 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ require 'baykit/bayserver/util/string_util'
4
+
5
+ #
6
+ # HTTP/2 GoAway payload format
7
+ #
8
+ # +-+-------------------------------------------------------------+
9
+ # |R| Last-Stream-ID (31) |
10
+ # +-+-------------------------------------------------------------+
11
+ # | Error Code (32) |
12
+ # +---------------------------------------------------------------+
13
+ # | Additional Debug Data (*) |
14
+ # +---------------------------------------------------------------+
15
+ #
16
+ #
17
+ module Baykit
18
+ module BayServer
19
+ module Docker
20
+ module Http
21
+ module H2
22
+ module Command
23
+
24
+ class CmdGoAway < Baykit::BayServer::Docker::Http::H2::H2Command
25
+ include Baykit::BayServer::Util
26
+ include Baykit::BayServer::Docker::Http::H2
27
+
28
+ attr_accessor :last_stream_id
29
+ attr_accessor :error_code
30
+ attr_accessor :debug_data
31
+
32
+ def initialize(stream_id, flags=nil)
33
+ super(H2Type::GOAWAY, stream_id, flags)
34
+ end
35
+
36
+ def unpack(pkt)
37
+ super
38
+ acc = pkt.new_data_accessor
39
+ val = acc.get_int
40
+ @last_stream_id = H2Packet.extract_int31(val)
41
+ @error_code = acc.get_int
42
+ @debug_data = StringUtil.alloc(pkt.data_len() - acc.pos)
43
+ acc.get_bytes(@debug_data, 0, @debug_data.length)
44
+ end
45
+
46
+ def pack(pkt)
47
+ acc = pkt.new_data_accessor()
48
+ acc.put_int(@last_stream_id)
49
+ acc.put_int(@error_code)
50
+ if @debug_data != nil
51
+ acc.put_bytes(@debug_data, 0, @debug_data.length)
52
+ end
53
+ super
54
+ end
55
+
56
+ def handle(cmd_handler)
57
+ return cmd_handler.handle_go_away(self)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+
@@ -0,0 +1,108 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ #
4
+ # HTTP/2 Header payload format
5
+ #
6
+ # +---------------+
7
+ # |Pad Length? (8)|
8
+ # +-+-------------+-----------------------------------------------+
9
+ # |E| Stream Dependency? (31) |
10
+ # +-+-------------+-----------------------------------------------+
11
+ # | Weight? (8) |
12
+ # +-+-------------+-----------------------------------------------+
13
+ # | Header Block Fragment (*) ...
14
+ # +---------------------------------------------------------------+
15
+ # | Padding (*) ...
16
+ # +---------------------------------------------------------------+
17
+ #
18
+ module Baykit
19
+ module BayServer
20
+ module Docker
21
+ module Http
22
+ module H2
23
+ module Command
24
+
25
+ class CmdHeaders < Baykit::BayServer::Docker::Http::H2::H2Command
26
+ include Baykit::BayServer::Docker::Http::H2
27
+
28
+ attr :pad_length
29
+ attr_accessor :excluded
30
+ attr :stream_dependency
31
+ attr :weight
32
+ attr :header_blocks
33
+
34
+ def initialize(stream_id, flags=nil)
35
+ super(H2Type::HEADERS, stream_id, flags)
36
+ @pad_length = 0
37
+ @excluded = false
38
+ @stream_dependency = 0
39
+ @weight = 0
40
+ @header_blocks = []
41
+ end
42
+
43
+ def unpack(pkt)
44
+ super
45
+ acc = pkt.new_h2_data_accessor
46
+
47
+ if pkt.flags.padded?
48
+ @pad_length = acc.get_byte
49
+ end
50
+ if pkt.flags.priority?
51
+ val = acc.get_int
52
+ @excluded = H2Packet.extract_flag(val) == 1
53
+ @stream_dependency = H2Packet.extract_int31(val)
54
+ @weight = acc.get_byte
55
+ end
56
+ read_header_block(acc, pkt.data_len())
57
+ end
58
+
59
+ def pack(pkt)
60
+ acc = pkt.new_h2_data_accessor
61
+
62
+ if @flags.padded?
63
+ acc.put_byte(@pad_length)
64
+ end
65
+
66
+ if @flags.priority?
67
+ acc.put_int(H2Packet.make_stream_dependency32(@excluded, @stream_dependency))
68
+ acc.put_byte(@weight)
69
+ end
70
+ write_header_block(acc)
71
+ super
72
+ end
73
+
74
+ def handle(cmd_handler)
75
+ return cmd_handler.handle_headers(self)
76
+ end
77
+
78
+ def read_header_block(acc, len)
79
+ while acc.pos < len
80
+ blk = HeaderBlock.unpack(acc)
81
+ #if(BayLog.trace_mode?)
82
+ # BayLog.trace "h2: Read header block: #{blk}"
83
+ #end
84
+ @header_blocks << blk
85
+ end
86
+ end
87
+
88
+ def write_header_block(acc)
89
+ @header_blocks.each do |blk|
90
+ #if(BayLog.trace_mode?)
91
+ # BayLog.trace "h2: Write header block: #{blk}"
92
+ #end
93
+ HeaderBlock.pack(blk, acc)
94
+ end
95
+ end
96
+
97
+ def add_header_block(blk)
98
+ @header_blocks.append(blk)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+
@@ -0,0 +1,50 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ #
4
+ #
5
+ module Baykit
6
+ module BayServer
7
+ module Docker
8
+ module Http
9
+ module H2
10
+ module Command
11
+
12
+ class CmdPing < Baykit::BayServer::Docker::Http::H2::H2Command
13
+ include Baykit::BayServer::Docker::Http::H2
14
+
15
+ attr :opaque_data
16
+
17
+ def initialize(stream_id, flags=nil, opaque_data=nil)
18
+ super(H2Type::PING, stream_id, flags)
19
+ if opaque_data == nil
20
+ @opaque_data = [0, 0, 0, 0, 0, 0, 0, 0].pack("C*")
21
+ else
22
+ @opaque_data = opaque_data
23
+ end
24
+ end
25
+
26
+ def unpack(pkt)
27
+ super
28
+ acc = pkt.new_data_accessor()
29
+
30
+ acc.get_bytes(@opaque_data, 0, 8)
31
+ end
32
+
33
+ def pack(pkt)
34
+ acc = pkt.new_data_accessor()
35
+ acc.put_bytes(@opaque_data)
36
+ super
37
+ end
38
+
39
+ def handle(cmd_handler)
40
+ return cmd_handler.handle_ping(self)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+
@@ -0,0 +1,51 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+ require 'baykit/bayserver/util/string_util'
3
+
4
+ #
5
+ #
6
+ # Preface is dummy command and packet
7
+ #
8
+ # packet is not in frame format but raw data: "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
9
+ #
10
+ module Baykit
11
+ module BayServer
12
+ module Docker
13
+ module Http
14
+ module H2
15
+ module Command
16
+
17
+ class CmdPreface < Baykit::BayServer::Docker::Http::H2::H2Command
18
+ include Baykit::BayServer::Docker::Http::H2
19
+ include Baykit::BayServer::Util
20
+
21
+ PREFACE_BYTES = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
22
+ attr :protocol
23
+
24
+ def initialize(stream_id, flags=nil)
25
+ super(H2Type::PREFACE, stream_id, flags)
26
+ end
27
+
28
+ def unpack(pkt)
29
+ acc = pkt.new_data_accessor()
30
+ preface_data = StringUtil.alloc(24)
31
+ acc.get_bytes(preface_data, 0, 24)
32
+ @protocol = preface_data[6, 8]
33
+ end
34
+
35
+ def pack(pkt)
36
+ acc = pkt.new_h2_data_accessor()
37
+ acc.put_bytes(PREFACE_BYTES)
38
+ end
39
+
40
+ def handle(cmd_handler)
41
+ return cmd_handler.handle_preface(self)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+
@@ -0,0 +1,59 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ #
4
+ # HTTP/2 Priority payload format
5
+ #
6
+ # +-+-------------------------------------------------------------+
7
+ # |E| Stream Dependency (31) |
8
+ # +-+-------------+-----------------------------------------------+
9
+ # | Weight (8) |
10
+ # +-+-------------+
11
+ #
12
+ #
13
+ module Baykit
14
+ module BayServer
15
+ module Docker
16
+ module Http
17
+ module H2
18
+ module Command
19
+
20
+ class CmdPriority < Baykit::BayServer::Docker::Http::H2::H2Command
21
+ include Baykit::BayServer::Docker::Http::H2
22
+
23
+ attr :weight
24
+ attr :excluded
25
+ attr :stream_dependency
26
+
27
+ def initialize(stream_id, flags=nil)
28
+ super(H2Type::PRIORITY, stream_id, flags)
29
+ end
30
+
31
+ def unpack(pkt)
32
+ super
33
+ acc = pkt.new_data_accessor()
34
+
35
+ val = acc.get_int
36
+ @excluded = H2Packet.extract_flag(val) == 1
37
+ @stream_dependency = H2Packet.extract_int31(val)
38
+ @weight = acc.get_byte
39
+ end
40
+
41
+ def pack(pkt)
42
+ acc = pkt.new_data_accessor()
43
+ acc.put_int(H2Packet.make_stream_dependency32(@excluded, @stream_dependency))
44
+ acc.put_byte(@weight)
45
+ super
46
+ end
47
+
48
+ def handle(cmd_handler)
49
+ return cmd_handler.handle_priority(self)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+
@@ -0,0 +1,50 @@
1
+ require 'baykit/bayserver/docker/http/h2/package'
2
+
3
+ #
4
+ # HTTP/2 RstStream payload format
5
+ #
6
+ # +---------------------------------------------------------------+
7
+ # | Error Code (32) |
8
+ # +---------------------------------------------------------------+
9
+ #
10
+ #
11
+ module Baykit
12
+ module BayServer
13
+ module Docker
14
+ module Http
15
+ module H2
16
+ module Command
17
+
18
+ class CmdRstStream < Baykit::BayServer::Docker::Http::H2::H2Command
19
+ include Baykit::BayServer::Docker::Http::H2
20
+
21
+ attr :error_code
22
+
23
+ def initialize(stream_id, flags=nil)
24
+ super(H2Type::RST_STREAM, stream_id, flags)
25
+ end
26
+
27
+ def unpack(pkt)
28
+ super
29
+ acc = pkt.new_data_accessor
30
+ @error_code = acc.get_int
31
+ end
32
+
33
+ def pack(pkt)
34
+ acc = pkt.new_data_accessor
35
+ acc.put_int(@error_code)
36
+ super
37
+ end
38
+
39
+ def handle(cmd_handler)
40
+ return cmd_handler.handle_rst_stream(self)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+