1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 12:47:35 +00:00

LookupServer: Make lookup() return DNSAnswer's instead of strings

This way, we propagate proper TTL. None of the callers currently care, though.
This commit is contained in:
Sergey Bugaev 2021-02-14 16:57:41 +03:00 committed by Andreas Kling
parent 3fba6bfb5e
commit 19cfed329e
3 changed files with 40 additions and 23 deletions

View file

@ -50,9 +50,13 @@ void ClientConnection::die()
OwnPtr<Messages::LookupServer::LookupNameResponse> ClientConnection::handle(const Messages::LookupServer::LookupName& message) OwnPtr<Messages::LookupServer::LookupNameResponse> ClientConnection::handle(const Messages::LookupServer::LookupName& message)
{ {
auto addresses = LookupServer::the().lookup(message.name(), T_A); auto answers = LookupServer::the().lookup(message.name(), T_A);
if (addresses.is_empty()) if (answers.is_empty())
return make<Messages::LookupServer::LookupNameResponse>(1, Vector<String>()); return make<Messages::LookupServer::LookupNameResponse>(1, Vector<String>());
Vector<String> addresses;
for (auto& answer : answers) {
addresses.append(answer.record_data());
}
return make<Messages::LookupServer::LookupNameResponse>(0, move(addresses)); return make<Messages::LookupServer::LookupNameResponse>(0, move(addresses));
} }
@ -66,9 +70,9 @@ OwnPtr<Messages::LookupServer::LookupAddressResponse> ClientConnection::handle(c
address[2], address[2],
address[1], address[1],
address[0]); address[0]);
auto hosts = LookupServer::the().lookup(name, T_PTR); auto answers = LookupServer::the().lookup(name, T_PTR);
if (hosts.is_empty()) if (answers.is_empty())
return make<Messages::LookupServer::LookupAddressResponse>(1, String()); return make<Messages::LookupServer::LookupAddressResponse>(1, String());
return make<Messages::LookupServer::LookupAddressResponse>(0, hosts[0]); return make<Messages::LookupServer::LookupAddressResponse>(0, answers[0].record_data());
} }
} }

View file

@ -126,22 +126,32 @@ void LookupServer::load_etc_hosts()
} }
} }
Vector<String> LookupServer::lookup(const DNSName& name, unsigned short record_type) Vector<DNSAnswer> LookupServer::lookup(const DNSName& name, unsigned short record_type)
{ {
#if LOOKUPSERVER_DEBUG #if LOOKUPSERVER_DEBUG
dbgln("Got request for '{}'", name.as_string()); dbgln("Got request for '{}'", name.as_string());
#endif #endif
Vector<String> responses; Vector<DNSAnswer> answers;
auto add_answer = [&](const DNSAnswer& answer) {
DNSAnswer answer_with_original_case {
name,
answer.type(),
answer.class_code(),
answer.ttl(),
answer.record_data()
};
answers.append(answer_with_original_case);
};
// First, try local data. // First, try local data.
if (auto local_answers = m_etc_hosts.get(name); local_answers.has_value()) { if (auto local_answers = m_etc_hosts.get(name); local_answers.has_value()) {
for (auto& answer : local_answers.value()) { for (auto& answer : local_answers.value()) {
if (answer.type() == record_type) if (answer.type() == record_type)
responses.append(answer.name().as_string()); add_answer(answer);
} }
if (!responses.is_empty()) if (!answers.is_empty())
return responses; return answers;
} }
// Second, try our cache. // Second, try our cache.
@ -152,11 +162,11 @@ Vector<String> LookupServer::lookup(const DNSName& name, unsigned short record_t
#if LOOKUPSERVER_DEBUG #if LOOKUPSERVER_DEBUG
dbgln("Cache hit: {} -> {}", name.as_string(), answer.record_data()); dbgln("Cache hit: {} -> {}", name.as_string(), answer.record_data());
#endif #endif
responses.append(answer.record_data()); add_answer(answer);
} }
} }
if (!responses.is_empty()) if (!answers.is_empty())
return responses; return answers;
} }
// Third, ask the upstream nameservers. // Third, ask the upstream nameservers.
@ -166,12 +176,15 @@ Vector<String> LookupServer::lookup(const DNSName& name, unsigned short record_t
#endif #endif
bool did_get_response = false; bool did_get_response = false;
int retries = 3; int retries = 3;
Vector<DNSAnswer> upstream_answers;
do { do {
responses = lookup(name, nameserver, did_get_response, record_type); upstream_answers = lookup(name, nameserver, did_get_response, record_type);
if (did_get_response) if (did_get_response)
break; break;
} while (--retries); } while (--retries);
if (!responses.is_empty()) { if (!upstream_answers.is_empty()) {
for (auto& answer : upstream_answers)
add_answer(answer);
break; break;
} else { } else {
if (!did_get_response) if (!did_get_response)
@ -180,15 +193,15 @@ Vector<String> LookupServer::lookup(const DNSName& name, unsigned short record_t
dbgln("Received response from '{}' but no result(s), trying next nameserver", nameserver); dbgln("Received response from '{}' but no result(s), trying next nameserver", nameserver);
} }
} }
if (responses.is_empty()) { if (answers.is_empty()) {
fprintf(stderr, "LookupServer: Tried all nameservers but never got a response :(\n"); fprintf(stderr, "LookupServer: Tried all nameservers but never got a response :(\n");
return {}; return {};
} }
return move(responses); return move(answers);
} }
Vector<String> LookupServer::lookup(const DNSName& name, const String& nameserver, bool& did_get_response, unsigned short record_type, ShouldRandomizeCase should_randomize_case) Vector<DNSAnswer> LookupServer::lookup(const DNSName& name, const String& nameserver, bool& did_get_response, unsigned short record_type, ShouldRandomizeCase should_randomize_case)
{ {
DNSPacket request; DNSPacket request;
request.set_is_query(); request.set_is_query();
@ -270,15 +283,15 @@ Vector<String> LookupServer::lookup(const DNSName& name, const String& nameserve
return {}; return {};
} }
Vector<String, 8> responses; Vector<DNSAnswer, 8> answers;
for (auto& answer : response.answers()) { for (auto& answer : response.answers()) {
put_in_cache(answer); put_in_cache(answer);
if (answer.type() != record_type) if (answer.type() != record_type)
continue; continue;
responses.append(answer.record_data()); answers.append(answer);
} }
return responses; return move(answers);
} }
void LookupServer::put_in_cache(const DNSAnswer& answer) void LookupServer::put_in_cache(const DNSAnswer& answer)

View file

@ -39,7 +39,7 @@ class LookupServer final : public Core::Object {
public: public:
static LookupServer& the(); static LookupServer& the();
Vector<String> lookup(const DNSName& name, unsigned short record_type); Vector<DNSAnswer> lookup(const DNSName& name, unsigned short record_type);
private: private:
LookupServer(); LookupServer();
@ -47,7 +47,7 @@ private:
void load_etc_hosts(); void load_etc_hosts();
void put_in_cache(const DNSAnswer&); void put_in_cache(const DNSAnswer&);
Vector<String> lookup(const DNSName& hostname, const String& nameserver, bool& did_get_response, unsigned short record_type, ShouldRandomizeCase = ShouldRandomizeCase::Yes); Vector<DNSAnswer> lookup(const DNSName& hostname, const String& nameserver, bool& did_get_response, unsigned short record_type, ShouldRandomizeCase = ShouldRandomizeCase::Yes);
RefPtr<Core::LocalServer> m_local_server; RefPtr<Core::LocalServer> m_local_server;