This is an automated email from the ASF dual-hosted git repository. cmcfarlen pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push: new cf64a4d590 Fix bug with reverse dns lookup from hosts files (#10392) cf64a4d590 is described below commit cf64a4d5900811e2c74ddaa6b29cd562bad09e4e Author: Chris McFarlen <ch...@mcfarlen.us> AuthorDate: Mon Sep 11 11:47:21 2023 -0500 Fix bug with reverse dns lookup from hosts files (#10392) * Fix bug with reverse dns lookup from hosts files Include autest to verify * add parent port * fix parent select so localhost isn't marked down --------- Co-authored-by: Chris McFarlen <cmcfar...@apple.com> --- iocore/hostdb/HostDB.cc | 2 +- tests/gold_tests/dns/dns_reverse_lookup.test.py | 95 ++++++++++++++++++++++ tests/gold_tests/dns/hosts_file | 1 + .../reverse_lookup.replay.yaml} | 40 ++++++++- 4 files changed, 136 insertions(+), 2 deletions(-) diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc index dee38a2c2a..8dca07a3c6 100644 --- a/iocore/hostdb/HostDB.cc +++ b/iocore/hostdb/HostDB.cc @@ -1383,7 +1383,7 @@ HostDBContinuation::do_dns() if (auto static_hosts = hostDB.acquire_host_file(); static_hosts) { if (auto r = static_hosts->lookup(hash); r && action.continuation) { // Set the TTL based on how often we stat() the host file - r = lookup_done(hash.host_name, static_hosts->ttl, nullptr, r); + r = lookup_done(r->name_view(), static_hosts->ttl, nullptr, r); reply_to_cont(action.continuation, r.get()); hostdb_cont_free(this); return; diff --git a/tests/gold_tests/dns/dns_reverse_lookup.test.py b/tests/gold_tests/dns/dns_reverse_lookup.test.py new file mode 100644 index 0000000000..a14eda030b --- /dev/null +++ b/tests/gold_tests/dns/dns_reverse_lookup.test.py @@ -0,0 +1,95 @@ +''' +Verify that ATS can perform a reverse lookup when necessary +''' +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ports import get_port +import os + +Test.Summary = ''' +Verify ATS can perform a reverse lookup when necessary +''' + +# +# This test verifies a fix for a regression that incorrectly marked a hostdb record as failed doing a reverse DNS +# lookup from the hosts file. If a parent.config exists, then ATS will perform a reverse lookup on remaps that +# have an ip address in the map-to url. While this doesn't fail the initil request, subsequent requests that resolve +# to the same host record will see the failed lookup attempt and fail the request with a host not found. +# +# This test verfiies the correct behavior in case future code chages introduce a similar regression +# + + +class DNSReverseLookupTest: + replay_file = "replay/reverse_lookup.replay.yaml" + + def __init__(self): + self._server = Test.MakeVerifierServerProcess("server", DNSReverseLookupTest.replay_file) + self._configure_trafficserver() + + def _configure_trafficserver(self): + self._ts = Test.MakeATSProcess("ts", enable_cache=False) + + # This first rule would trigger the bug + self._ts.Disk.remap_config.AddLine( + f"map /test1 http://127.0.0.1:{self._server.Variables.http_port}/", + ) + # This first rule would fail in the presense of the bug, but this test verifies correct behavior + self._ts.Disk.remap_config.AddLine( + f"map /test2 http://localhost:{self._server.Variables.http_port}/", + ) + self._ts.Disk.parent_config.AddLine( + f'dest_domain=. parent=parent_host:{self._ts.Variables.port} round_robin=consistent_hash go_direct=false' + ) + self._ts.Disk.parent_config.AddLine( + # this doesn't need to match, just exist so ats will do the reverse lookup + f'dest_host=other_host scheme=http parent="parent_host:8080"' + ) + + self._ts.Disk.records_config.update({ + 'proxy.config.diags.debug.enabled': 1, + 'proxy.config.diags.debug.tags': 'hostdb|dns|http', + 'proxy.config.http.connect_attempts_max_retries': 0, + 'proxy.config.http.connect_attempts_rr_retries': 0, + 'proxy.config.hostdb.fail.timeout': 10, + 'proxy.config.dns.resolv_conf': 'NULL', + 'proxy.config.hostdb.ttl_mode': 1, + 'proxy.config.hostdb.timeout': 2, + 'proxy.config.hostdb.lookup_timeout': 2, + 'proxy.config.http.transaction_no_activity_timeout_in': 2, + 'proxy.config.http.connect_attempts_timeout': 2, + 'proxy.config.hostdb.host_file.interval': 1, + 'proxy.config.hostdb.host_file.path': os.path.join(Test.TestDirectory, "hosts_file"), + }) + + def test_rev_dns(self): + tr = Test.AddTestRun() + + tr.Processes.Default.StartBefore(self._server) + tr.Processes.Default.StartBefore(self._ts) + + tr.AddVerifierClientProcess( + "client", + DNSReverseLookupTest.replay_file, + http_ports=[self._ts.Variables.port] + ) + + def run(self): + self.test_rev_dns() + + +DNSReverseLookupTest().run() diff --git a/tests/gold_tests/dns/hosts_file b/tests/gold_tests/dns/hosts_file index aa068875a8..4b32d2fe13 100644 --- a/tests/gold_tests/dns/hosts_file +++ b/tests/gold_tests/dns/hosts_file @@ -15,3 +15,4 @@ # limitations under the License. 0.0.0.1 resolve.this.com +127.0.0.1 localhost diff --git a/tests/gold_tests/dns/hosts_file b/tests/gold_tests/dns/replay/reverse_lookup.replay.yaml similarity index 54% copy from tests/gold_tests/dns/hosts_file copy to tests/gold_tests/dns/replay/reverse_lookup.replay.yaml index aa068875a8..e9a5c5dec3 100644 --- a/tests/gold_tests/dns/hosts_file +++ b/tests/gold_tests/dns/replay/reverse_lookup.replay.yaml @@ -14,4 +14,42 @@ # See the License for the specific language governing permissions and # limitations under the License. -0.0.0.1 resolve.this.com +meta: + version: "1.0" + +sessions: +- transactions: + - client-request: + # Delay to allow hostdb to sync external host file + delay: 1s + method: "GET" + version: "1.1" + url: /test1 + headers: + fields: + - [ Host, example.com ] + - [ X-Request, request ] + - [ uuid, 1 ] + + server-response: + status: 200 + + proxy-response: + status: 200 + + - client-request: + method: "GET" + version: "1.1" + url: /test2 + headers: + fields: + - [ Host, example.com ] + - [ X-Request, request ] + - [ uuid, 1 ] + + server-response: + status: 200 + + proxy-response: + status: 200 +