@@ -209,24 +209,25 @@ class Http3ApplicationImpl final : public Session::Application {
209209 started_ = true ;
210210 Debug (&session (), " Starting HTTP/3 application." );
211211
212- auto params = ngtcp2_conn_get_remote_transport_params ( session ());
213- if (params == nullptr ) [[unlikely]] {
212+ const auto params = session (). remote_transport_params ( );
213+ if (! params) [[unlikely]] {
214214 // The params are not available yet. Cannot start.
215215 Debug (&session (),
216216 " Cannot start HTTP/3 application yet. No remote transport params" );
217217 return false ;
218218 }
219219
220- if (params-> initial_max_streams_uni < 3 ) {
220+ if (params. initial_max_streams_uni () < 3 ) {
221221 // HTTP3 requires 3 unidirectional control streams to be opened in each
222222 // direction in additional to the bidirectional streams that are used to
223223 // actually carry request and response payload back and forth.
224224 // See:
225225 // https://nghttp2.org/nghttp3/programmers-guide.html#binding-control-streams
226226 Debug (&session (),
227227 " Cannot start HTTP/3 application. Initial max "
228- " unidirectional streams [%zu] is too low. Must be at least 3" ,
229- params->initial_max_streams_uni );
228+ " unidirectional streams [%" PRIu64
229+ " ] is too low. Must be at least 3" ,
230+ params.initial_max_streams_uni ());
230231 return false ;
231232 }
232233
@@ -235,17 +236,14 @@ class Http3ApplicationImpl final : public Session::Application {
235236 // of requests that the client can actually created.
236237 if (session ().is_server ()) {
237238 nghttp3_conn_set_max_client_streams_bidi (
238- *this , params-> initial_max_streams_bidi );
239+ *this , params. initial_max_streams_bidi () );
239240 }
240241
241242 Debug (&session (), " Creating and binding HTTP/3 control streams" );
242243 bool ret =
243- ngtcp2_conn_open_uni_stream (session (), &control_stream_id_, nullptr ) ==
244- 0 &&
245- ngtcp2_conn_open_uni_stream (
246- session (), &qpack_enc_stream_id_, nullptr ) == 0 &&
247- ngtcp2_conn_open_uni_stream (
248- session (), &qpack_dec_stream_id_, nullptr ) == 0 &&
244+ session ().OpenUnidirectionalStream (&control_stream_id_) &&
245+ session ().OpenUnidirectionalStream (&qpack_enc_stream_id_) &&
246+ session ().OpenUnidirectionalStream (&qpack_dec_stream_id_) &&
249247 nghttp3_conn_bind_control_stream (*this , control_stream_id_) == 0 &&
250248 nghttp3_conn_bind_qpack_streams (
251249 *this , qpack_enc_stream_id_, qpack_dec_stream_id_) == 0 ;
@@ -306,8 +304,7 @@ class Http3ApplicationImpl final : public Session::Application {
306304 Debug (&session (),
307305 " Extending stream and connection offset by %zd bytes" ,
308306 nread);
309- session ().ExtendStreamOffset (id, nread);
310- session ().ExtendOffset (nread);
307+ session ().Consume (id, nread);
311308 }
312309
313310 // If this data arrived as 0-RTT, mark the stream. We set it after
@@ -365,24 +362,11 @@ class Http3ApplicationImpl final : public Session::Application {
365362 case EndpointLabel::LOCAL :
366363 return ;
367364 case EndpointLabel::REMOTE : {
368- switch (direction) {
369- case Direction::BIDIRECTIONAL : {
370- Debug (&session (),
371- " HTTP/3 application extending max bidi streams by %" PRIu64,
372- max_streams);
373- ngtcp2_conn_extend_max_streams_bidi (
374- session (), static_cast <size_t >(max_streams));
375- break ;
376- }
377- case Direction::UNIDIRECTIONAL : {
378- Debug (&session (),
379- " HTTP/3 application extending max uni streams by %" PRIu64,
380- max_streams);
381- ngtcp2_conn_extend_max_streams_uni (
382- session (), static_cast <size_t >(max_streams));
383- break ;
384- }
385- }
365+ Debug (&session (),
366+ " HTTP/3 application extending max %s streams by %" PRIu64,
367+ direction == Direction::BIDIRECTIONAL ? " bidi" : " uni" ,
368+ max_streams);
369+ session ().ExtendMaxStreams (direction, max_streams);
386370 }
387371 }
388372 }
@@ -530,8 +514,7 @@ class Http3ApplicationImpl final : public Session::Application {
530514 return ;
531515 }
532516
533- session ().SetLastError (
534- QuicError::ForApplication (nghttp3_err_infer_quic_app_error_code (rv)));
517+ session ().SetApplicationError (nghttp3_err_infer_quic_app_error_code (rv));
535518 session ().Close ();
536519 }
537520
@@ -548,8 +531,7 @@ class Http3ApplicationImpl final : public Session::Application {
548531 return ;
549532 }
550533
551- session ().SetLastError (
552- QuicError::ForApplication (nghttp3_err_infer_quic_app_error_code (rv)));
534+ session ().SetApplicationError (nghttp3_err_infer_quic_app_error_code (rv));
553535 session ().Close ();
554536 }
555537
@@ -687,17 +669,30 @@ class Http3ApplicationImpl final : public Session::Application {
687669 return {StreamPriority::DEFAULT , StreamPriorityFlags::NON_INCREMENTAL };
688670 }
689671
690- int GetStreamData (StreamData* data) override {
672+ int GetStreamData (Session::StreamData* data) override {
673+ static_assert (
674+ sizeof (ngtcp2_vec) == sizeof (nghttp3_vec) &&
675+ alignof (ngtcp2_vec) == alignof (nghttp3_vec) &&
676+ offsetof (ngtcp2_vec, base) == offsetof (nghttp3_vec, base) &&
677+ offsetof (ngtcp2_vec, len) == offsetof (nghttp3_vec, len),
678+ " ngtcp2_vec and nghttp3_vec must have identical layout" );
691679 data->count = kMaxVectorCount ;
692680 ssize_t ret = 0 ;
693681 Debug (&session (), " HTTP/3 application getting stream data" );
694682 if (conn_ && session ().max_data_left ()) {
695- ret = nghttp3_conn_writev_stream (
696- *this , &data->id , &data->fin , *data, data->count );
683+ // nghttp3 reports fin through an int out-param; bridge it to the bool.
684+ int fin = 0 ;
685+ ret =
686+ nghttp3_conn_writev_stream (*this ,
687+ &data->id ,
688+ &fin,
689+ reinterpret_cast <nghttp3_vec*>(data->data ),
690+ data->count );
697691 // A negative return value indicates an error.
698692 if (ret < 0 ) {
699693 return static_cast <int >(ret);
700694 }
695+ data->fin = fin != 0 ;
701696
702697 data->count = static_cast <size_t >(ret);
703698 if (data->id >= 0 && data->id != control_stream_id_ &&
@@ -710,7 +705,7 @@ class Http3ApplicationImpl final : public Session::Application {
710705 return 0 ;
711706 }
712707
713- bool StreamCommit (StreamData* data, size_t datalen) override {
708+ bool StreamCommit (Session:: StreamData* data, size_t datalen) override {
714709 Debug (&session (),
715710 " HTTP/3 application committing stream %" PRIi64 " data %zu" ,
716711 data->id ,
@@ -720,8 +715,7 @@ class Http3ApplicationImpl final : public Session::Application {
720715 // nghttp3 tracks its own offset via add_write_offset.
721716 int err = nghttp3_conn_add_write_offset (*this , data->id , datalen);
722717 if (err != 0 ) {
723- session ().SetLastError (QuicError::ForApplication (
724- nghttp3_err_infer_quic_app_error_code (err)));
718+ session ().SetApplicationError (nghttp3_err_infer_quic_app_error_code (err));
725719 return false ;
726720 }
727721 // Raw application bytes are committed to the stream's outbound
@@ -1212,10 +1206,10 @@ class Http3ApplicationImpl final : public Session::Application {
12121206 void * conn_user_data,
12131207 void * stream_user_data) {
12141208 NGHTTP3_CALLBACK_SCOPE (app);
1215- auto & session = app.session ();
1216- Debug (&session, " HTTP/3 application deferred consume %zu bytes" , consumed);
1217- session. ExtendStreamOffset (id, consumed);
1218- session. ExtendOffset ( consumed);
1209+ Debug (& app.session (),
1210+ " HTTP/3 application deferred consume %zu bytes" ,
1211+ consumed);
1212+ app. session (). Consume (id, consumed);
12191213 return NGTCP2_SUCCESS ;
12201214 }
12211215
0 commit comments