diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index 345b247d..2069279e 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -14,6 +14,7 @@ build_opener, HTTPHandler, HTTPRedirectHandler, Request, ) import warnings +import ssl from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer from .openmetrics import exposition as openmetrics @@ -352,6 +353,35 @@ def default_handler( return _make_handler(url, method, timeout, headers, data, HTTPHandler) +def tls_handler( + url: str, + method: str, + timeout: Optional[float], + headers: List[Tuple[str, str]], + data: bytes, + bundle_path: Optional[str] = None +) -> Callable[[], None]: + def 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( url: str, method: str,