From 16077272b43d0ac0a183fac5d9534b7e482023a4 Mon Sep 17 00:00:00 2001 From: "fernandino.silva" Date: Thu, 8 Sep 2022 16:01:03 +0100 Subject: [PATCH 1/3] Attempt to have a new pushgw tls_handler Signed-off-by: fernandino.silva --- prometheus_client/exposition.py | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index 345b247d..d030484d 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -15,6 +15,7 @@ ) import warnings from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer +import ssl from .openmetrics import exposition as openmetrics from .registry import CollectorRegistry, REGISTRY @@ -352,6 +353,40 @@ def default_handler( return _make_handler(url, method, timeout, headers, data, HTTPHandler) +def tls_handler( + url, + method, + timeout, + headers, + data, + BUNDLE_PATH: str = None +) -> Callable[[], None]: + def handler(): + if BUNDLE_PATH is not None: + try: + ssl_context = ssl.SSLContext() + ssl_context.load_verify_locations(cafile=BUNDLE_PATH) + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_REQUIRED + ssl_handler = urllib.request.HTTPSHandler(context=ssl_context) + + request = urllib.request.Request(url, data=data) + request.get_method = lambda: method + for k, v in headers: + request.add_header(k, v) + response = urllib.request.build_opener(ssl_handler).open( + request, timeout=timeout + ) + if response.getcode() >= 400: + logging.warning("Failed. {} {}").format( + response.geturl(), response.info() + ) + except Exception as e: + logging.warning("Failed. Exception: {}".format(e)) + + return handler + + def passthrough_redirect_handler( url: str, method: str, From 2d60fed7cc7536990c2a20e0df5ea670c39e7fbf Mon Sep 17 00:00:00 2001 From: "fernandino.silva" Date: Thu, 8 Sep 2022 17:29:18 +0100 Subject: [PATCH 2/3] Some help from @kgaughan Signed-off-by: fernandino.silva --- prometheus_client/exposition.py | 53 +++++++++++++++------------------ 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index d030484d..f68f0825 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -354,37 +354,32 @@ def default_handler( def tls_handler( - url, - method, - timeout, - headers, - data, - BUNDLE_PATH: str = None + url: str, + method: str, + timeout: Optional[float], + headers: List[Tuple[str, str]], + data: bytes, + bundle_path: Optional[str] = None ) -> Callable[[], None]: def handler(): - if BUNDLE_PATH is not None: - try: - ssl_context = ssl.SSLContext() - ssl_context.load_verify_locations(cafile=BUNDLE_PATH) - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_REQUIRED - ssl_handler = urllib.request.HTTPSHandler(context=ssl_context) - - request = urllib.request.Request(url, data=data) - request.get_method = lambda: method - for k, v in headers: - request.add_header(k, v) - response = urllib.request.build_opener(ssl_handler).open( - request, timeout=timeout - ) - if response.getcode() >= 400: - logging.warning("Failed. {} {}").format( - response.geturl(), response.info() - ) - except Exception as e: - logging.warning("Failed. Exception: {}".format(e)) - - return handler + ssl_context = ssl.SSLContext() + if bundle_path is not None: + ssl_context.load_verify_locations(cafile=bundle_path) + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_REQUIRED + ssl_handler = urllib.request.HTTPSHandler(context=ssl_context) + + request = urllib.request.Request(url, data=data) + request.get_method = lambda: method + for k, v in headers: + request.add_header(k, v) + response = urllib.request.build_opener(ssl_handler).open( + request, + timeout=timeout, + ) + if response.getcode() >= 400: + raise OSError(f"error talking to pushgateway: {response.code} {response.msg}") + return handler def passthrough_redirect_handler( From 440ab2e64f6fc0bbca78daae62de2a7d5626f1d8 Mon Sep 17 00:00:00 2001 From: "fernandino.silva" Date: Thu, 8 Sep 2022 17:39:17 +0100 Subject: [PATCH 3/3] Addressing isort_lint Signed-off-by: fernandino.silva --- prometheus_client/exposition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index f68f0825..2069279e 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -14,8 +14,8 @@ build_opener, HTTPHandler, HTTPRedirectHandler, Request, ) import warnings -from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer import ssl +from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer from .openmetrics import exposition as openmetrics from .registry import CollectorRegistry, REGISTRY