@@ -209,24 +209,25 @@ class Http3ApplicationImpl final : public Session::Application { |
209 | 209 | started_ = true; |
210 | 210 | Debug(&session(), "Starting HTTP/3 application."); |
211 | 211 |
|
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]] { |
214 | 214 | // The params are not available yet. Cannot start. |
215 | 215 | Debug(&session(), |
216 | 216 | "Cannot start HTTP/3 application yet. No remote transport params"); |
217 | 217 | return false; |
218 | 218 | } |
219 | 219 |
|
220 | | - if (params->initial_max_streams_uni < 3) { |
| 220 | + if (params.initial_max_streams_uni() < 3) { |
221 | 221 | // HTTP3 requires 3 unidirectional control streams to be opened in each |
222 | 222 | // direction in additional to the bidirectional streams that are used to |
223 | 223 | // actually carry request and response payload back and forth. |
224 | 224 | // See: |
225 | 225 | // https://nghttp2.org/nghttp3/programmers-guide.html#binding-control-streams |
226 | 226 | Debug(&session(), |
227 | 227 | "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()); |
230 | 231 | return false; |
231 | 232 | } |
232 | 233 |
|
@@ -235,17 +236,14 @@ class Http3ApplicationImpl final : public Session::Application { |
235 | 236 | // of requests that the client can actually created. |
236 | 237 | if (session().is_server()) { |
237 | 238 | nghttp3_conn_set_max_client_streams_bidi( |
238 | | - *this, params->initial_max_streams_bidi); |
| 239 | + *this, params.initial_max_streams_bidi()); |
239 | 240 | } |
240 | 241 |
|
241 | 242 | Debug(&session(), "Creating and binding HTTP/3 control streams"); |
242 | 243 | 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_) && |
249 | 247 | nghttp3_conn_bind_control_stream(*this, control_stream_id_) == 0 && |
250 | 248 | nghttp3_conn_bind_qpack_streams( |
251 | 249 | *this, qpack_enc_stream_id_, qpack_dec_stream_id_) == 0; |
@@ -306,8 +304,7 @@ class Http3ApplicationImpl final : public Session::Application { |
306 | 304 | Debug(&session(), |
307 | 305 | "Extending stream and connection offset by %zd bytes", |
308 | 306 | nread); |
309 | | - session().ExtendStreamOffset(id, nread); |
310 | | - session().ExtendOffset(nread); |
| 307 | + session().Consume(id, nread); |
311 | 308 | } |
312 | 309 |
|
313 | 310 | // If this data arrived as 0-RTT, mark the stream. We set it after |
@@ -365,24 +362,11 @@ class Http3ApplicationImpl final : public Session::Application { |
365 | 362 | case EndpointLabel::LOCAL: |
366 | 363 | return; |
367 | 364 | 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); |
386 | 370 | } |
387 | 371 | } |
388 | 372 | } |
@@ -530,8 +514,7 @@ class Http3ApplicationImpl final : public Session::Application { |
530 | 514 | return; |
531 | 515 | } |
532 | 516 |
|
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)); |
535 | 518 | session().Close(); |
536 | 519 | } |
537 | 520 |
|
@@ -548,8 +531,7 @@ class Http3ApplicationImpl final : public Session::Application { |
548 | 531 | return; |
549 | 532 | } |
550 | 533 |
|
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)); |
553 | 535 | session().Close(); |
554 | 536 | } |
555 | 537 |
|
@@ -687,17 +669,30 @@ class Http3ApplicationImpl final : public Session::Application { |
687 | 669 | return {StreamPriority::DEFAULT, StreamPriorityFlags::NON_INCREMENTAL}; |
688 | 670 | } |
689 | 671 |
|
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"); |
691 | 679 | data->count = kMaxVectorCount; |
692 | 680 | ssize_t ret = 0; |
693 | 681 | Debug(&session(), "HTTP/3 application getting stream data"); |
694 | 682 | 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); |
697 | 691 | // A negative return value indicates an error. |
698 | 692 | if (ret < 0) { |
699 | 693 | return static_cast<int>(ret); |
700 | 694 | } |
| 695 | + data->fin = fin != 0; |
701 | 696 |
|
702 | 697 | data->count = static_cast<size_t>(ret); |
703 | 698 | if (data->id >= 0 && data->id != control_stream_id_ && |
@@ -710,7 +705,7 @@ class Http3ApplicationImpl final : public Session::Application { |
710 | 705 | return 0; |
711 | 706 | } |
712 | 707 |
|
713 | | - bool StreamCommit(StreamData* data, size_t datalen) override { |
| 708 | + bool StreamCommit(Session::StreamData* data, size_t datalen) override { |
714 | 709 | Debug(&session(), |
715 | 710 | "HTTP/3 application committing stream %" PRIi64 " data %zu", |
716 | 711 | data->id, |
@@ -720,8 +715,7 @@ class Http3ApplicationImpl final : public Session::Application { |
720 | 715 | // nghttp3 tracks its own offset via add_write_offset. |
721 | 716 | int err = nghttp3_conn_add_write_offset(*this, data->id, datalen); |
722 | 717 | 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)); |
725 | 719 | return false; |
726 | 720 | } |
727 | 721 | // Raw application bytes are committed to the stream's outbound |
@@ -1212,10 +1206,10 @@ class Http3ApplicationImpl final : public Session::Application { |
1212 | 1206 | void* conn_user_data, |
1213 | 1207 | void* stream_user_data) { |
1214 | 1208 | 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); |
1219 | 1213 | return NGTCP2_SUCCESS; |
1220 | 1214 | } |
1221 | 1215 |
|
|