auto config = QuicheConfig(quiche_config_new(QUICHE_PROTOCOL_VERSION), quiche_config_free);
d_quicheParams.d_alpn = std::string(DOH3_ALPN.begin(), DOH3_ALPN.end());
- configureQuiche(config, d_quicheParams);
+ configureQuiche(config, d_quicheParams, true);
// quiche_h3_config_new
auto http3config = QuicheHTTP3Config(quiche_h3_config_new(), quiche_h3_config_free);
}
}
-void configureQuiche(QuicheConfig& config, const QuicheParams& params)
+void configureQuiche(QuicheConfig& config, const QuicheParams& params, bool isHTTP)
{
for (const auto& pair : params.d_tlsConfig.d_certKeyPairs) {
auto res = quiche_config_load_cert_chain_from_pem_file(config.get(), pair.d_cert.c_str());
quiche_config_set_initial_max_stream_data_bidi_local(config.get(), 8192);
quiche_config_set_initial_max_stream_data_bidi_remote(config.get(), 8192);
+ if (isHTTP) {
+ /* see rfc9114 section 6.2. Unidirectional Streams:
+ Each endpoint needs to create at least one unidirectional stream for the HTTP control stream.
+ QPACK requires two additional unidirectional streams, and other extensions might require further streams.
+ Therefore, the transport parameters sent by both clients and servers MUST allow the peer to create at least three
+ unidirectional streams.
+ These transport parameters SHOULD also provide at least 1,024 bytes of flow-control credit to each unidirectional stream.
+ */
+ quiche_config_set_initial_max_streams_uni(config.get(), 3U);
+ quiche_config_set_initial_max_stream_data_uni(config.get(), 1024U);
+ }
+
// The number of total bytes of incoming stream data to be buffered for the whole connection
// https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_data
quiche_config_set_initial_max_data(config.get(), 8192 * params.d_maxInFlight);
void handleStatelessRetry(Socket& sock, const PacketBuffer& clientConnID, const PacketBuffer& serverConnID, const ComboAddress& peer, uint32_t version, PacketBuffer& buffer);
void handleVersionNegociation(Socket& sock, const PacketBuffer& clientConnID, const PacketBuffer& serverConnID, const ComboAddress& peer, PacketBuffer& buffer);
void flushEgress(Socket& sock, QuicheConnection& conn, const ComboAddress& peer, PacketBuffer& buffer);
-void configureQuiche(QuicheConfig& config, const QuicheParams& params);
+void configureQuiche(QuicheConfig& config, const QuicheParams& params, bool isHTTP);
};
{
auto config = QuicheConfig(quiche_config_new(QUICHE_PROTOCOL_VERSION), quiche_config_free);
d_quicheParams.d_alpn = std::string(DOQ_ALPN.begin(), DOQ_ALPN.end());
- configureQuiche(config, d_quicheParams);
+ configureQuiche(config, d_quicheParams, false);
d_server_config = std::make_unique<DOQServerConfig>(std::move(config), d_internalPipeBufferSize);
}