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:
parent
3fba6bfb5e
commit
19cfed329e
3 changed files with 40 additions and 23 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue