Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions prometheus_client/exposition.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down