diff --git a/Libraries/LibDNS/Resolver.h b/Libraries/LibDNS/Resolver.h index 355ce42f044..3f9f0f9c2dc 100644 --- a/Libraries/LibDNS/Resolver.h +++ b/Libraries/LibDNS/Resolver.h @@ -78,6 +78,11 @@ public: return result; } + bool has_cached_addresses() const + { + return has_record_of_type(Messages::ResourceType::A) || has_record_of_type(Messages::ResourceType::AAAA); + } + void check_expiration() { if (!m_valid) @@ -110,8 +115,9 @@ public: Vector records() const { Vector result; + result.ensure_capacity(m_cached_records.size()); for (auto& re : m_cached_records) - result.append(re.record); + result.unchecked_append(re.record); return result; } @@ -164,6 +170,7 @@ public: bool can_be_removed() const { return !m_valid && m_request_done; } bool is_done() const { return m_request_done; } + bool is_empty() const { return m_cached_records.is_empty(); } void set_dnssec_validated(bool validated) { m_dnssec_validated = validated; } bool is_dnssec_validated() const { return m_dnssec_validated; } void set_being_dnssec_validated(bool validated) { m_being_dnssec_validated = validated; } diff --git a/Services/RequestServer/ConnectionFromClient.cpp b/Services/RequestServer/ConnectionFromClient.cpp index c5d9f39cdb1..2e9f23f11d2 100644 --- a/Services/RequestServer/ConnectionFromClient.cpp +++ b/Services/RequestServer/ConnectionFromClient.cpp @@ -53,7 +53,7 @@ static NonnullRefPtr default_resolver() return Error::from_string_literal("No DNS server configured"); auto resolved = TRY(default_resolver()->dns.lookup(*g_dns_info.server_hostname)->await()); - if (resolved->cached_addresses().is_empty()) + if (!resolved->has_cached_addresses()) return Error::from_string_literal("Failed to resolve DNS server hostname"); auto address = resolved->cached_addresses().first().visit([](auto& addr) -> Core::SocketAddress { return { addr, g_dns_info.port }; }); g_dns_info.server_address = address; @@ -469,7 +469,7 @@ void ConnectionFromClient::start_request(i32 request_id, ByteString method, URL: async_request_finished(request_id, 0, {}, Requests::NetworkError::UnableToResolveHost); }) .when_resolved([this, request_id, host = move(host), url = move(url), method = move(method), request_body = move(request_body), request_headers = move(request_headers), proxy_data](auto const& dns_result) mutable { - if (dns_result->records().is_empty() || dns_result->cached_addresses().is_empty()) { + if (dns_result->is_empty() || !dns_result->has_cached_addresses()) { dbgln("StartRequest: DNS lookup failed for '{}'", host); // FIXME: Implement timing info for DNS lookup failure. async_request_finished(request_id, 0, {}, Requests::NetworkError::UnableToResolveHost); @@ -821,7 +821,7 @@ void ConnectionFromClient::websocket_connect(i64 websocket_id, URL::URL url, Byt async_websocket_errored(websocket_id, static_cast(Requests::WebSocket::Error::CouldNotEstablishConnection)); }) .when_resolved([this, websocket_id, host = move(host), url = move(url), origin = move(origin), protocols = move(protocols), extensions = move(extensions), additional_request_headers = move(additional_request_headers)](auto const& dns_result) mutable { - if (dns_result->records().is_empty() || dns_result->cached_addresses().is_empty()) { + if (dns_result->is_empty() || !dns_result->has_cached_addresses()) { dbgln("WebSocketConnect: DNS lookup failed for '{}'", host); async_websocket_errored(websocket_id, static_cast(Requests::WebSocket::Error::CouldNotEstablishConnection)); return;