@@ -87,9 +87,12 @@ defmodule Bandit.HTTP2.Stream do
87
87
# These functions are intended to be called by the connection process which contains this
88
88
# stream. All of these start with `deliver_`
89
89
90
- @ spec deliver_headers ( stream_handle ( ) , Plug.Conn . headers ( ) , boolean ( ) ) :: term ( )
91
- def deliver_headers ( :closed , _headers , _end_stream ) , do: :ok
92
- def deliver_headers ( pid , headers , end_stream ) , do: send ( pid , { :headers , headers , end_stream } )
90
+ @ spec deliver_headers ( stream_handle ( ) , Plug.Conn . headers ( ) , non_neg_integer ( ) , boolean ( ) ) ::
91
+ term ( )
92
+ def deliver_headers ( :closed , _headers , _frame_size , _end_stream ) , do: :ok
93
+
94
+ def deliver_headers ( pid , headers , frame_size , end_stream ) ,
95
+ do: send ( pid , { :headers , headers , frame_size , end_stream } )
93
96
94
97
@ spec deliver_data ( stream_handle ( ) , iodata ( ) , boolean ( ) ) :: term ( )
95
98
def deliver_data ( :closed , _data , _end_stream ) , do: :ok
@@ -107,7 +110,7 @@ defmodule Bandit.HTTP2.Stream do
107
110
108
111
def read_headers ( % __MODULE__ { state: :idle } = stream ) do
109
112
case do_recv ( stream , stream . read_timeout ) do
110
- { :headers , headers , stream } ->
113
+ { :headers , headers , frame_size , stream } ->
111
114
method = Bandit.Headers . get_header ( headers , ":method" )
112
115
request_target = build_request_target! ( headers )
113
116
@@ -123,7 +126,7 @@ defmodule Bandit.HTTP2.Stream do
123
126
content_length = get_content_length! ( headers )
124
127
headers = combine_cookie_crumbs ( headers )
125
128
stream = % { stream | bytes_remaining: content_length }
126
- { :ok , method , request_target , headers , stream }
129
+ { :ok , method , request_target , headers , % { req_header_bytes: frame_size } , stream }
127
130
rescue
128
131
exception ->
129
132
reraise % { exception | method: method , request_target: request_target } , __STACKTRACE__
@@ -244,7 +247,7 @@ defmodule Bandit.HTTP2.Stream do
244
247
defp do_read_data ( % __MODULE__ { state: state } = stream , max_bytes , timeout , acc )
245
248
when state in [ :open , :local_closed ] do
246
249
case do_recv ( stream , timeout ) do
247
- { :headers , trailers , stream } ->
250
+ { :headers , trailers , _frame_size , stream } ->
248
251
no_pseudo_headers! ( trailers )
249
252
Logger . warning ( "Ignoring trailers #{ inspect ( trailers ) } " )
250
253
do_read_data ( stream , max_bytes , timeout , acc )
@@ -278,8 +281,9 @@ defmodule Bandit.HTTP2.Stream do
278
281
279
282
defp do_recv ( % __MODULE__ { state: :idle } = stream , timeout ) do
280
283
receive do
281
- { :headers , headers , end_stream } ->
282
- { :headers , headers , stream |> do_recv_headers ( ) |> do_recv_end_stream ( end_stream ) }
284
+ { :headers , headers , frame_size , end_stream } ->
285
+ { :headers , headers , frame_size ,
286
+ stream |> do_recv_headers ( ) |> do_recv_end_stream ( end_stream ) }
283
287
284
288
{ :data , _data , _end_stream } ->
285
289
connection_error! ( "Received DATA in idle state" )
@@ -297,8 +301,9 @@ defmodule Bandit.HTTP2.Stream do
297
301
defp do_recv ( % __MODULE__ { state: state } = stream , timeout )
298
302
when state in [ :open , :local_closed ] do
299
303
receive do
300
- { :headers , headers , end_stream } ->
301
- { :headers , headers , stream |> do_recv_headers ( ) |> do_recv_end_stream ( end_stream ) }
304
+ { :headers , headers , frame_size , end_stream } ->
305
+ { :headers , headers , frame_size ,
306
+ stream |> do_recv_headers ( ) |> do_recv_end_stream ( end_stream ) }
302
307
303
308
{ :data , data , end_stream } ->
304
309
{ :data , data , stream |> do_recv_data ( data ) |> do_recv_end_stream ( end_stream ) }
@@ -315,7 +320,7 @@ defmodule Bandit.HTTP2.Stream do
315
320
316
321
defp do_recv ( % __MODULE__ { state: :remote_closed } = stream , timeout ) do
317
322
receive do
318
- { :headers , _headers , _end_stream } ->
323
+ { :headers , _headers , _frame_size , _end_stream } ->
319
324
do_stream_closed_error! ( "Received HEADERS in remote_closed state" )
320
325
321
326
{ :data , _data , _end_stream } ->
@@ -333,7 +338,7 @@ defmodule Bandit.HTTP2.Stream do
333
338
334
339
defp do_recv ( % __MODULE__ { state: :closed } = stream , timeout ) do
335
340
receive do
336
- { :headers , _headers , _end_stream } -> stream
341
+ { :headers , _headers , _frame_size , _end_stream } -> stream
337
342
{ :data , _data , _end_stream } -> stream
338
343
{ :send_window_update , _delta } -> stream
339
344
{ :rst_stream , _error_code } -> stream
@@ -470,7 +475,7 @@ defmodule Bandit.HTTP2.Stream do
470
475
471
476
def ensure_completed ( % __MODULE__ { state: :local_closed } = stream ) do
472
477
receive do
473
- { :headers , _headers , true } -> do_recv_end_stream ( stream , true )
478
+ { :headers , _headers , _frame_size , true } -> do_recv_end_stream ( stream , true )
474
479
{ :data , _data , true } -> do_recv_end_stream ( stream , true )
475
480
after
476
481
# RFC9113§8.1 - hint the client to stop sending data
0 commit comments