frontend->d_quicheParams.d_keyLogFile = std::string(bind.tls.key_log_file);
frontend->d_quicheParams.d_ccAlgo = std::string(bind.quic.congestion_control_algorithm);
frontend->d_internalPipeBufferSize = bind.quic.internal_pipe_buffer_size;
+
+ if (!bind.doh.responses_map.empty()) {
+ auto newMap = std::make_shared<std::vector<std::shared_ptr<DOHResponseMapEntry>>>();
+ for (const auto& responsesMap : bind.doh.responses_map) {
+ std::optional<std::unordered_map<std::string, std::string>> headers;
+ if (!responsesMap.headers.empty()) {
+ headers = std::unordered_map<std::string, std::string>();
+ for (const auto& header : responsesMap.headers) {
+ headers->emplace(boost::to_lower_copy(std::string(header.key)), std::string(header.value));
+ }
+ }
+ auto entry = std::make_shared<DOHResponseMapEntry>(std::string(responsesMap.expression), responsesMap.status, PacketBuffer(responsesMap.content.begin(), responsesMap.content.end()), headers);
+ newMap->emplace_back(std::move(entry));
+ }
+ frontend->d_responsesMap = std::move(newMap);
+ }
+
state.doh3Frontend = std::move(frontend);
}
#endif /* HAVE_DNS_OVER_HTTP3 */
frontend->reloadCertificates();
}
});
+
+ luaCtx.registerFunction<void (std::shared_ptr<DOH3Frontend>::*)(const LuaArray<std::shared_ptr<DOHResponseMapEntry>>&)>("setResponsesMap", [](const std::shared_ptr<DOH3Frontend>& frontend, const LuaArray<std::shared_ptr<DOHResponseMapEntry>>& map) {
+ if (frontend != nullptr) {
+ auto newMap = std::make_shared<std::vector<std::shared_ptr<DOHResponseMapEntry>>>();
+ newMap->reserve(map.size());
+
+ for (const auto& entry : map) {
+ newMap->push_back(entry.second);
+ }
+
+ frontend->d_responsesMap = std::move(newMap);
+ }
+ });
#endif
luaCtx.writeFunction("showDOHResponseCodes", []() {
return;
}
+ /* the responses map can be updated at runtime, so we need to take a copy of
+ the shared pointer, increasing the reference counter */
+ auto responsesMap = unit->dsc->df->d_responsesMap;
+ if (responsesMap) {
+ for (const auto& entry : *responsesMap) {
+ if (entry->matches(unit->getHTTPPath())) {
+ const auto& customHeaders = entry->getHeaders();
+ unit->status_code = entry->getStatusCode();
+ unit->response = entry->getContent();
+ if (customHeaders) {
+ unit->headers = *customHeaders;
+ }
+
+ auto conn = getConnection(unit->dsc->df->d_server_config->d_connections, unit->serverConnID);
+ handleResponse(*unit->dsc->df, *conn, unit->streamID, unit->status_code, unit->response, unit->d_contentTypeOut);
+ unit->ids.doh3u.reset();
+ return;
+ }
+ }
+ }
+
if (unit->query.size() < sizeof(dnsheader)) {
++dnsdist::metrics::g_stats.nonCompliantQueries;
++clientState.nonCompliantQueries;
#include <unordered_map>
#include "config.h"
+#include "dnsdist-doh-common.hh"
#include "noinitvector.hh"
#ifdef HAVE_DNS_OVER_HTTP3
}
std::shared_ptr<const Logr::Logger> d_logger{nullptr};
+ std::shared_ptr<std::vector<std::shared_ptr<DOHResponseMapEntry>>> d_responsesMap;
std::unique_ptr<DOH3ServerConfig> d_server_config;
ComboAddress d_local;