@@ -2374,3 +2374,73 @@ def testDOHWithPaddingWithECS(self):
23742374
23752375class TestDOHEDNSPadding (DOHEDNSPadding , DNSDistDOHTest ):
23762376 _dohLibrary = "nghttp2"
2377+
2378+
2379+ class TestDOHNoIdleTimeoutKeepsConnection (DNSDistDOHTest , DNSDistTest ):
2380+ _serverKey = "server.key"
2381+ _serverCert = "server.chain"
2382+ _serverName = "tls.tests.dnsdist.org"
2383+ _caCert = "ca.pem"
2384+ _dohServerPort = pickAvailablePort ()
2385+ _dohBaseURL = "https://%s:%d/PowerDNS" % (_serverName , _dohServerPort )
2386+
2387+ _config_template = """
2388+ newServer{address="127.0.0.1:%d"}
2389+ addDOHLocal("127.0.0.1:%d", "%s", "%s", { "/PowerDNS" }, {idleTimeout = 0})
2390+ """
2391+ _config_params = [
2392+ "_testServerPort" ,
2393+ "_dohServerPort" ,
2394+ "_serverCert" ,
2395+ "_serverKey" ,
2396+ ]
2397+ _verboseMode = True
2398+
2399+ def testKeepsConnection (self ):
2400+ """
2401+ DOH: Keeps connection with idleTimeout
2402+ """
2403+ name = "simple.doh.tests.powerdns.com."
2404+ query = dns .message .make_query (name , "A" , "IN" )
2405+ expectedQuery = dns .message .make_query (name , "A" , "IN" )
2406+ response = dns .message .make_response (query )
2407+ rrset = dns .rrset .from_text (name , 3600 , dns .rdataclass .IN , dns .rdatatype .A , "127.0.0.1" )
2408+ response .answer .append (rrset )
2409+
2410+ conn = self .openDOHConnection (self ._dohServerPort , caFile = self ._caCert , timeout = 2.0 )
2411+ conn .setopt (pycurl .HTTP_VERSION , pycurl .CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE )
2412+ conn .setopt (pycurl .SSL_VERIFYPEER , 1 )
2413+ conn .setopt (pycurl .SSL_VERIFYHOST , 2 )
2414+ conn .setopt (pycurl .CAINFO , self ._caCert )
2415+
2416+ (receivedQuery , receivedResponse ) = self .sendDOHQuery (
2417+ self ._dohServerPort ,
2418+ self ._serverName ,
2419+ self ._dohBaseURL ,
2420+ query ,
2421+ response = response ,
2422+ caFile = self ._caCert ,
2423+ conn = conn ,
2424+ )
2425+ self .assertTrue (receivedQuery )
2426+ self .assertTrue (receivedResponse )
2427+ receivedQuery .id = expectedQuery .id
2428+ self .assertEqual (expectedQuery , receivedQuery )
2429+
2430+ time .sleep (3 )
2431+
2432+ (receivedQuery , receivedResponse ) = self .sendDOHQuery (
2433+ self ._dohServerPort ,
2434+ self ._serverName ,
2435+ self ._dohBaseURL ,
2436+ query ,
2437+ response = response ,
2438+ caFile = self ._caCert ,
2439+ conn = conn ,
2440+ )
2441+ self .assertTrue (receivedQuery )
2442+ self .assertTrue (receivedResponse )
2443+ receivedQuery .id = expectedQuery .id
2444+ self .assertEqual (expectedQuery , receivedQuery )
2445+
2446+ self .assertEqual (conn .getinfo (pycurl .NUM_CONNECTS ), 0 )
0 commit comments