diff --git a/README.md b/README.md index 152de7d..af07734 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ pip install altertable-lakehouse from altertable_lakehouse import Client client = Client(username="your_username", password="your_password") + +# Disable TLS certificate verification for development only +client = Client(username="your_username", password="your_password", verify=False) ``` ### Querying diff --git a/src/altertable_lakehouse/client.py b/src/altertable_lakehouse/client.py index 2a2138f..8d83b80 100644 --- a/src/altertable_lakehouse/client.py +++ b/src/altertable_lakehouse/client.py @@ -1,6 +1,7 @@ import os import json import base64 +import ssl import httpx from typing import Any, Dict, Iterator, Optional, Union, Tuple, NoReturn from .models import ( @@ -23,7 +24,8 @@ def __init__( password: Optional[str] = None, token: Optional[str] = None, timeout: float = 30.0, - user_agent_suffix: Optional[str] = None + user_agent_suffix: Optional[str] = None, + verify: Union[bool, ssl.SSLContext] = True, ): self.base_url = base_url.rstrip("/") self.timeout = timeout @@ -50,6 +52,7 @@ def __init__( self._client = httpx.Client( base_url=self.base_url, timeout=self.timeout, + verify=verify, headers={ "Authorization": f"Basic {auth_token}", "User-Agent": ua diff --git a/tests/test_client.py b/tests/test_client.py index 1f02063..aadd253 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,6 +1,8 @@ # type: ignore import os +import ssl import pytest +import httpx from testcontainers.core.container import DockerContainer from altertable_lakehouse import Client, models, errors @@ -17,7 +19,7 @@ def mock_server(): port = container.get_exposed_port(15000) host = container.get_container_host_ip() - os.environ["ALTERTABLE_MOCK_PORT"] = port + os.environ["ALTERTABLE_MOCK_PORT"] = str(port) os.environ["ALTERTABLE_MOCK_HOST"] = host yield container @@ -68,3 +70,35 @@ def test_cancel_query(client): client.cancel_query("00000000-0000-0000-0000-000000000000", "session-id") except errors.ApiError as e: assert e.status_code == 404 + +def test_client_forwards_verify_false(monkeypatch, base_url): + captured = {} + + class DummyHttpxClient: + def __init__(self, **kwargs): + captured.update(kwargs) + + monkeypatch.setattr(httpx, "Client", DummyHttpxClient) + + Client(base_url=base_url, username="testuser", password="testpass", verify=False) + + assert captured["verify"] is False + +def test_client_forwards_ssl_context(monkeypatch, base_url): + captured = {} + ssl_context = ssl.create_default_context() + + class DummyHttpxClient: + def __init__(self, **kwargs): + captured.update(kwargs) + + monkeypatch.setattr(httpx, "Client", DummyHttpxClient) + + Client( + base_url=base_url, + username="testuser", + password="testpass", + verify=ssl_context, + ) + + assert captured["verify"] is ssl_context