}
conn.WriteHeaders(hp)
// we send window update on stream when app read data from rx fifo, so send DATA frame and wait for WINDOW_UPDATE frame
+ // first increment is bigger because half of the fifo size was reserved for headers
conn.WriteData(streamID, false, []byte("AAAA"))
- err = VerifyWindowUpdate(conn, streamID, 4)
+ err = VerifyWindowUpdate(conn, streamID, 4+conn.Settings[http2.SettingMaxHeaderListSize])
if err != nil {
return err
}
h2c->our_window = HTTP2_CONNECTION_WINDOW_SIZE;
h2c->settings = h2m->settings;
/* adjust settings according to app rx_fifo size */
+ h2c->settings.max_header_list_size =
+ clib_min (h2c->settings.max_header_list_size, (hc->app_rx_fifo_size >> 1));
h2c->settings.initial_window_size =
- clib_min (h2c->settings.initial_window_size, hc->app_rx_fifo_size);
+ clib_min (h2c->settings.initial_window_size,
+ (hc->app_rx_fifo_size - h2c->settings.max_header_list_size));
h2c->req_by_stream_id = hash_create (0, sizeof (uword));
h2c->new_tx_streams = clib_llist_make_head (wrk->req_pool, sched_list);
h2c->old_tx_streams = clib_llist_make_head (wrk->req_pool, sched_list);
if (req->flags & HTTP2_REQ_F_APP_CLOSED)
session_transport_closed_notify (&req->base.connection);
else
- session_transport_closing_notify (&req->base.connection);
+ {
+ http_io_as_drain_unread (&req->base);
+ session_transport_closing_notify (&req->base.connection);
+ }
h2c = http2_conn_ctx_get_w_thread (hc);
session_transport_delete_notify (&req->base.connection);
req->as_fifo_offset = 0;
}
+always_inline void
+http_io_as_drain_unread (http_req_t *req)
+{
+ session_t *as = session_get_from_handle (req->hr_pa_session_handle);
+ svm_fifo_dequeue_drop_all (as->rx_fifo);
+}
+
/* Abstraction of transport session fifo operations */
always_inline u32