From: Charles-Henri Bruyand Date: Fri, 12 Jan 2024 15:08:00 +0000 (+0100) Subject: dnsdist: add content-type header information in http/3 responses, add relayed respons... X-Git-Tag: dnsdist-1.9.0-rc1~39^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a6a6615cc79afd7ef19a68381c9ff605cff5e955;p=thirdparty%2Fpdns.git dnsdist: add content-type header information in http/3 responses, add relayed response size in http/3 vinfologs --- diff --git a/pdns/dnsdistdist/doh3.cc b/pdns/dnsdistdist/doh3.cc index 4861e058dd..279b19b840 100644 --- a/pdns/dnsdistdist/doh3.cc +++ b/pdns/dnsdistdist/doh3.cc @@ -159,7 +159,7 @@ public: if (!unit->ids.selfGenerated) { double udiff = unit->ids.queryRealTime.udiff(); - vinfolog("Got answer from %s, relayed to %s (http/3), took %f us", unit->downstream->d_config.remote.toStringWithPort(), unit->ids.origRemote.toStringWithPort(), udiff); + vinfolog("Got answer from %s, relayed to %s (DoH3, %d bytes), took %f us", unit->downstream->d_config.remote.toStringWithPort(), unit->ids.origRemote.toStringWithPort(), unit->response.size(), udiff); auto backendProtocol = unit->downstream->getProtocol(); if (backendProtocol == dnsdist::Protocol::DoUDP && unit->tcp) { @@ -290,7 +290,7 @@ static void h3_send_response(H3Connection& conn, const uint64_t streamID, uint16 { std::string status = std::to_string(statusCode); std::string lenStr = std::to_string(len); - std::array headers{ + std::array headers{ (quiche_h3_header){ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast): Quiche API .name = reinterpret_cast(":status"), @@ -307,9 +307,20 @@ static void h3_send_response(H3Connection& conn, const uint64_t streamID, uint16 .value = reinterpret_cast(lenStr.data()), .value_len = lenStr.size(), }, + (quiche_h3_header){ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast): Quiche API + .name = reinterpret_cast("content-type"), + .name_len = sizeof("content-type") - 1, + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast): Quiche API + .value = reinterpret_cast("application/dns-message"), + .value_len = sizeof("application/dns-message") - 1, + }, }; auto returnValue = quiche_h3_send_response(conn.d_http3.get(), conn.d_conn.get(), - streamID, headers.data(), headers.size(), len == 0); + streamID, headers.data(), + // do not include content-type header info if there is no content + (len > 0 ? headers.size() : headers.size() - 1), + len == 0); if (returnValue != 0) { /* in theory it could be QUICHE_H3_ERR_STREAM_BLOCKED if the stream is not writable / congested, but we are not going to handle this case */ quiche_conn_stream_shutdown(conn.d_conn.get(), streamID, QUICHE_SHUTDOWN_WRITE, static_cast(dnsdist::doq::DOQ_Error_Codes::DOQ_INTERNAL_ERROR)); diff --git a/pdns/dnsdistdist/doq.cc b/pdns/dnsdistdist/doq.cc index 30572192ac..117437002c 100644 --- a/pdns/dnsdistdist/doq.cc +++ b/pdns/dnsdistdist/doq.cc @@ -156,7 +156,7 @@ public: if (!unit->ids.selfGenerated) { double udiff = unit->ids.queryRealTime.udiff(); - vinfolog("Got answer from %s, relayed to %s (quic), took %f us", unit->downstream->d_config.remote.toStringWithPort(), unit->ids.origRemote.toStringWithPort(), udiff); + vinfolog("Got answer from %s, relayed to %s (quic, %d bytes), took %f us", unit->downstream->d_config.remote.toStringWithPort(), unit->ids.origRemote.toStringWithPort(), unit->response.size(), udiff); auto backendProtocol = unit->downstream->getProtocol(); if (backendProtocol == dnsdist::Protocol::DoUDP && unit->tcp) {