浏览代码

test: specific request method for unknown hosts

Nicolas Duchon 2 周之前
父节点
当前提交
fa7bcf1b9e
共有 29 个文件被更改,包括 45 次插入37 次删除
  1. 1 0
      nginx.tmpl
  2. 12 0
      test/conftest.py
  3. 1 1
      test/test_acme-http-challenge-location/test_acme-http-challenge-location-disabled.py
  4. 1 1
      test/test_acme-http-challenge-location/test_acme-http-challenge-location-enabled-is-default.py
  5. 1 1
      test/test_acme-http-challenge-location/test_acme-http-challenge-location-legacy.py
  6. 1 2
      test/test_custom/test_defaults-location.py
  7. 1 2
      test/test_custom/test_defaults.py
  8. 1 2
      test/test_custom/test_location-per-vhost.py
  9. 1 2
      test/test_custom/test_per-vhost.py
  10. 1 2
      test/test_custom/test_proxy-wide.py
  11. 1 1
      test/test_docker-unix-socket/test_docker-unix-socket.py
  12. 1 1
      test/test_dockergen/test_dockergen.py
  13. 1 1
      test/test_dockergen/test_dockergen_network_segregation-custom-label.py
  14. 1 1
      test/test_dockergen/test_dockergen_network_segregation.py
  15. 1 1
      test/test_enable-http-on-missing-cert/test_enable-http-on-missing-cert.py
  16. 3 3
      test/test_events/test_events.py
  17. 1 1
      test/test_headers/test_http.py
  18. 1 1
      test/test_headers/test_https.py
  19. 2 2
      test/test_ipv6/test_ipv6.py
  20. 1 1
      test/test_multiple-hosts/test_multiple-hosts.py
  21. 1 1
      test/test_multiple-networks/test_multiple-networks.py
  22. 1 1
      test/test_multiports/test_multiports-base-json.py
  23. 1 1
      test/test_multiports/test_multiports-base-yaml.py
  24. 2 2
      test/test_multiports/test_multiports-invalid-syntax.py
  25. 1 1
      test/test_nominal/test_nominal.py
  26. 2 2
      test/test_ssl/test_nohttp.py
  27. 1 1
      test/test_ssl/test_wildcard-cert-nohttps.py
  28. 1 1
      test/test_unreachable-network/test_unreachable-network.py
  29. 1 1
      test/test_wildcard-host/test_wildcard-host.py

+ 1 - 0
nginx.tmpl

@@ -880,6 +880,7 @@ server {
     }
         {{- end }}
     location ^~ / {
+        add_header X-Powered-By "nginx-proxy";
         return 503;
     }
 }

+ 12 - 0
test/conftest.py

@@ -104,6 +104,18 @@ class RequestsForDocker:
         nginx_proxy_container = self.get_nginx_proxy_container()
         return container_ip(nginx_proxy_container)
 
+    def get_unknown_host(self, *args, **kwargs) -> Response:
+        with ipv6(kwargs.pop('ipv6', False)):
+            @backoff.on_predicate(
+                backoff.constant,
+                lambda r: r.status_code != 503 or r.headers.get("X-Powered-By") != "nginx-proxy",
+                interval=.25,
+                max_tries=20
+            )
+            def _request(*_args, **_kwargs):
+                return self.session.get(*_args, **_kwargs)
+            return _request(*args, **kwargs)
+
     def _with_backoff(self, method_name, *args, **kwargs) -> Response:
         """Apply backoff retry logic to any session HTTP method."""
         with ipv6(kwargs.pop('ipv6', False)):

+ 1 - 1
test/test_acme-http-challenge-location/test_acme-http-challenge-location-disabled.py

@@ -27,7 +27,7 @@ def test_noredirect_acme_challenge_location_enabled(docker_compose, nginxproxy,
     assert r.status_code == 200
 
 def test_unknown_domain_acme_challenge_location_disabled(docker_compose, nginxproxy, acme_challenge_path):
-    r = nginxproxy.get(
+    r = nginxproxy.get_unknown_host(
         f"http://web-unknown.nginx-proxy.tld/{acme_challenge_path}",
         allow_redirects=False
     )

+ 1 - 1
test/test_acme-http-challenge-location/test_acme-http-challenge-location-enabled-is-default.py

@@ -27,7 +27,7 @@ def test_noredirect_acme_challenge_location_disabled(docker_compose, nginxproxy,
     assert r.status_code == 404
 
 def test_unknown_domain_acme_challenge_location_default_enabled(docker_compose, nginxproxy, acme_challenge_path):
-    r = nginxproxy.get(
+    r = nginxproxy.get_unknown_host(
         f"http://web-unknown.nginx-proxy.tld/{acme_challenge_path}",
         allow_redirects=False
     )

+ 1 - 1
test/test_acme-http-challenge-location/test_acme-http-challenge-location-legacy.py

@@ -13,7 +13,7 @@ def test_noredirect_acme_challenge_location_legacy(docker_compose, nginxproxy, a
     assert r.status_code == 404
 
 def test_unknown_domain_acme_challenge_location_legacy(docker_compose, nginxproxy, acme_challenge_path):
-    r = nginxproxy.get(
+    r = nginxproxy.get_unknown_host(
         f"http://web-unknown.nginx-proxy.tld/{acme_challenge_path}",
         allow_redirects=False
     )

+ 1 - 2
test/test_custom/test_defaults-location.py

@@ -1,6 +1,5 @@
 def test_custom_default_conf_does_not_apply_to_unknown_vhost(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
-    assert r.status_code == 503
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert "X-test" not in r.headers
 
 def test_custom_default_conf_applies_to_web1(docker_compose, nginxproxy):

+ 1 - 2
test/test_custom/test_defaults.py

@@ -1,6 +1,5 @@
 def test_custom_conf_does_not_apply_to_unknown_vhost(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
-    assert r.status_code == 503
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert "X-test" not in r.headers
 
 def test_custom_conf_applies_to_web1(docker_compose, nginxproxy):

+ 1 - 2
test/test_custom/test_location-per-vhost.py

@@ -1,6 +1,5 @@
 def test_custom_conf_does_not_apply_to_unknown_vhost(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
-    assert r.status_code == 503
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert "X-test" not in r.headers
 
 def test_custom_conf_applies_to_web1(docker_compose, nginxproxy):

+ 1 - 2
test/test_custom/test_per-vhost.py

@@ -1,6 +1,5 @@
 def test_custom_conf_does_not_apply_to_unknown_vhost(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
-    assert r.status_code == 503
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert "X-test" not in r.headers
 
 def test_custom_conf_applies_to_web1(docker_compose, nginxproxy):

+ 1 - 2
test/test_custom/test_proxy-wide.py

@@ -1,6 +1,5 @@
 def test_custom_conf_does_not_apply_to_unknown_vhost(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
-    assert r.status_code == 503
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert "X-test" not in r.headers
 
 def test_custom_conf_applies_to_web1(docker_compose, nginxproxy):

+ 1 - 1
test/test_docker-unix-socket/test_docker-unix-socket.py

@@ -1,5 +1,5 @@
 def test_unknown_virtual_host(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/port")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/port")
     assert r.status_code == 503
 
 def test_forwards_to_web1(docker_compose, nginxproxy):

+ 1 - 1
test/test_dockergen/test_dockergen.py

@@ -11,7 +11,7 @@ pytestmark = pytest.mark.skipif(
 
 
 def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
+    r = nginxproxy.get_unknown_host("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_dockergen/test_dockergen_network_segregation-custom-label.py

@@ -11,7 +11,7 @@ pytestmark = pytest.mark.skipif(
 
 
 def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
+    r = nginxproxy.get_unknown_host("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_dockergen/test_dockergen_network_segregation.py

@@ -11,7 +11,7 @@ pytestmark = pytest.mark.skipif(
 
 
 def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
+    r = nginxproxy.get_unknown_host("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_enable-http-on-missing-cert/test_enable-http-on-missing-cert.py

@@ -1,5 +1,5 @@
 def test_nohttp_missing_cert_disabled(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nohttp-missing-cert-disabled.nginx-proxy.tld/", allow_redirects=False)
+    r = nginxproxy.get_unknown_host("http://nohttp-missing-cert-disabled.nginx-proxy.tld/", allow_redirects=False)
     assert r.status_code == 503
 
 def test_nohttp_missing_cert_enabled(docker_compose, nginxproxy):

+ 3 - 3
test/test_events/test_events.py

@@ -56,7 +56,7 @@ def web2(docker_compose):
         pass
 
 def test_nginx_proxy_behavior_when_alone(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert r.status_code == 503
 
 
@@ -67,7 +67,7 @@ def test_new_container_is_detected_vhost(web1, nginxproxy):
 
     web1.remove(force=True)
     sleep(2)
-    r = nginxproxy.get("http://web1.nginx-proxy/port")
+    r = nginxproxy.get_unknown_host("http://web1.nginx-proxy/port")
     assert r.status_code == 503
 
 def test_new_container_is_detected_vpath(web2, nginxproxy):
@@ -79,6 +79,6 @@ def test_new_container_is_detected_vpath(web2, nginxproxy):
 
     web2.remove(force=True)
     sleep(2)
-    r = nginxproxy.get("http://nginx-proxy/web2/port")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/web2/port")
     assert r.status_code == 503
 

+ 1 - 1
test/test_headers/test_http.py

@@ -93,7 +93,7 @@ def test_httpoxy_safe(docker_compose, nginxproxy):
 
 def test_no_host_server_tokens_off(docker_compose, nginxproxy):
     ip = nginxproxy.get_ip()
-    r = nginxproxy.get(f"http://{ip}/headers")
+    r = nginxproxy.get_unknown_host(f"http://{ip}/headers")
     assert r.status_code == 503
     assert r.headers["Server"] == "nginx"
 

+ 1 - 1
test/test_headers/test_https.py

@@ -97,7 +97,7 @@ def test_httpoxy_safe(docker_compose, nginxproxy):
 @pytest.mark.filterwarnings('ignore::urllib3.exceptions.InsecureRequestWarning')
 def test_no_host_server_tokens_off(docker_compose, nginxproxy):
     ip = nginxproxy.get_ip()
-    r = nginxproxy.get(f"https://{ip}/headers", verify=False)
+    r = nginxproxy.get_unknown_host(f"https://{ip}/headers", verify=False)
     assert r.status_code == 503
     assert r.headers["Server"] == "nginx"
 

+ 2 - 2
test/test_ipv6/test_ipv6.py

@@ -9,7 +9,7 @@ pytestmark = pytest.mark.skipif(
 
 
 def test_unknown_virtual_host_ipv4(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/port")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/port")
     assert r.status_code == 503
 
 
@@ -26,7 +26,7 @@ def test_forwards_to_web2_ipv4(docker_compose, nginxproxy):
 
 
 def test_unknown_virtual_host_ipv6(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/port", ipv6=True)
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/port", ipv6=True)
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_multiple-hosts/test_multiple-hosts.py

@@ -1,5 +1,5 @@
 def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://unknown.nginx-proxy.tld/port")
+    r = nginxproxy.get_unknown_host("http://unknown.nginx-proxy.tld/port")
     assert r.status_code == 503
 
 def test_webA_is_forwarded(docker_compose, nginxproxy):

+ 1 - 1
test/test_multiple-networks/test_multiple-networks.py

@@ -2,7 +2,7 @@ import re
 
 
 def test_unknown_virtual_host(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/")
     assert r.status_code == 503
 
 def test_forwards_to_web1(docker_compose, nginxproxy):

+ 1 - 1
test/test_multiports/test_multiports-base-json.py

@@ -2,7 +2,7 @@ def test_virtual_host_is_dropped_when_using_multiports(docker_compose, nginxprox
     r = nginxproxy.get("http://notskipped.nginx-proxy.tld/port")
     assert r.status_code == 200
     assert "answer from port 81\n" in r.text
-    r = nginxproxy.get("http://skipped.nginx-proxy.tld/")
+    r = nginxproxy.get_unknown_host("http://skipped.nginx-proxy.tld/")
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_multiports/test_multiports-base-yaml.py

@@ -2,7 +2,7 @@ def test_virtual_host_is_dropped_when_using_multiports(docker_compose, nginxprox
     r = nginxproxy.get("http://notskipped.nginx-proxy.tld/port")
     assert r.status_code == 200
     assert "answer from port 81\n" in r.text
-    r = nginxproxy.get("http://skipped.nginx-proxy.tld/")
+    r = nginxproxy.get_unknown_host("http://skipped.nginx-proxy.tld/")
     assert r.status_code == 503
 
 

+ 2 - 2
test/test_multiports/test_multiports-invalid-syntax.py

@@ -2,9 +2,9 @@ import re
 
 
 def test_virtual_hosts_with_syntax_error_should_not_be_reachable(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://test1.nginx-proxy.tld")
+    r = nginxproxy.get_unknown_host("http://test1.nginx-proxy.tld")
     assert r.status_code == 503
-    r = nginxproxy.get("http://test2.nginx-proxy.tld")
+    r = nginxproxy.get_unknown_host("http://test2.nginx-proxy.tld")
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_nominal/test_nominal.py

@@ -5,7 +5,7 @@ from requests import ConnectionError
 
 
 def test_unknown_virtual_host(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://nginx-proxy/port")
+    r = nginxproxy.get_unknown_host("http://nginx-proxy/port")
     assert r.status_code == 503
 
 

+ 2 - 2
test/test_ssl/test_nohttp.py

@@ -1,12 +1,12 @@
 def test_web2_http_is_connection_refused(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://web2.nginx-proxy.tld/", allow_redirects=False)
+    r = nginxproxy.get_unknown_host("http://web2.nginx-proxy.tld/", allow_redirects=False)
     assert r.status_code == 503
 
 
 def test_web2_http_is_connection_refused_for_acme_challenge(
     docker_compose, nginxproxy, acme_challenge_path
 ):
-    r = nginxproxy.get(f"http://web2.nginx-proxy.tld/{acme_challenge_path}", allow_redirects=False)
+    r = nginxproxy.get_unknown_host(f"http://web2.nginx-proxy.tld/{acme_challenge_path}", allow_redirects=False)
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_ssl/test_wildcard-cert-nohttps.py

@@ -31,7 +31,7 @@ def test_https_request_to_nohttps_vhost_goes_to_fallback_server(docker_compose,
     assert """certificate is not valid for '3.web.nginx-proxy.tld'""" in str(excinfo.value) or \
            """hostname '3.web.nginx-proxy.tld' doesn't match 'nginx-proxy.tld'""" in str(excinfo.value)
 
-    r = nginxproxy.get("https://3.web.nginx-proxy.tld/port", verify=False)
+    r = nginxproxy.get_unknown_host("https://3.web.nginx-proxy.tld/port", verify=False)
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_unreachable-network/test_unreachable-network.py

@@ -10,7 +10,7 @@ def test_default_nginx_welcome_page_should_not_be_served(docker_compose, nginxpr
 
 
 def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
-    r = nginxproxy.get("http://unknown.nginx-proxy/", allow_redirects=False)
+    r = nginxproxy.get_unknown_host("http://unknown.nginx-proxy/", allow_redirects=False)
     assert r.status_code == 503
 
 

+ 1 - 1
test/test_wildcard-host/test_wildcard-host.py

@@ -28,5 +28,5 @@ def test_wildcard_prefix(docker_compose, nginxproxy, host, expected_port):
     "web4.whatever.nginx-proxy.regexp-to-infinity-and-beyond"
 ])
 def test_non_matching_host_is_503(docker_compose, nginxproxy, host):
-    r = nginxproxy.get(f"http://{host}/port")
+    r = nginxproxy.get_unknown_host(f"http://{host}/port")
     assert r.status_code == 503, r.text