Skip to content
Merged
Show file tree
Hide file tree
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
66 changes: 66 additions & 0 deletions python/lib/sift_client/_tests/_internal/test_transport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""Tests for URL normalization in GrpcConfig and RestConfig."""

import pytest

from sift_client.transport.grpc_transport import GrpcConfig
from sift_client.transport.rest_transport import RestConfig


class TestGrpcConfigUrl:
def test_adds_https_when_missing(self):
config = GrpcConfig(url="grpc.sift.com", api_key="api")
assert config.uri == "https://grpc.sift.com"

def test_adds_https_on_localhost(self):
config = GrpcConfig(url="localhost:50051", api_key="api", use_ssl=False)
assert config.uri == "http://localhost:50051"

def test_adds_https_on_ip(self):
conifg = GrpcConfig(url="129.10.1.1", api_key="api")
assert conifg.uri == "https://129.10.1.1"

def test_adds_https_on_ipv6(self):
config = GrpcConfig(url="[::]:8080", api_key="api")
assert config.uri == "https://[::]:8080"

def test_adds_http_when_missing_local(self):
config = GrpcConfig(url="grpc.sift.com", api_key="api", use_ssl=False)
assert config.uri == "http://grpc.sift.com"

def test_url_keeps_https(self):
config = GrpcConfig(url="https://grpc.sift.com", api_key="api")
assert config.uri == "https://grpc.sift.com"

def test_url_keeps_http(self):
config = GrpcConfig(url="http://grpc.sift.com", api_key="api", use_ssl=False)
assert config.uri == "http://grpc.sift.com"

def test_raises_on_invalid_url(self):
with pytest.raises(ValueError, match="Invalid connection URL"):
GrpcConfig(url="htp://localhost:8080", api_key="api")

def test_raise_on_invalid_url2(self):
with pytest.raises(ValueError, match="Invalid connection URL"):
GrpcConfig(url="https:/localhost:50051", api_key="api")

def test_raise_on_missing_url(self):
with pytest.raises(ValueError, match="Invalid connection URL"):
GrpcConfig(url="", api_key="api")


class TestRestConfigUrl:
def test_adds_https_when_missing(self):
config = RestConfig(base_url="rest.sift.com", api_key="api")
assert config.base_url == "https://rest.sift.com"

def test_add_http_when_missing_local(self):
config = RestConfig(base_url="rest.sift.com", api_key="api", use_ssl=False)
assert config.base_url == "http://rest.sift.com"

def test_url_keeps_https(self):
config = RestConfig(base_url="https://rest.sift.com", api_key="api")
assert config.base_url == "https://rest.sift.com"

def test_url_keeps_http(self):
config = RestConfig(base_url="http://rest.sift.com", api_key="api", use_ssl=False)
assert config.base_url == "http://rest.sift.com"
13 changes: 12 additions & 1 deletion python/lib/sift_client/transport/grpc_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import logging
import threading
from typing import Any
from urllib.parse import urlparse

from sift_py.grpc.transport import (
SiftChannelConfig,
Expand Down Expand Up @@ -55,7 +56,17 @@ def __init__(
use_async: Whether to use async gRPC client.
metadata: Additional metadata to include in all requests.
"""
self.uri = url
parsed_url = urlparse(url)
normalized_url = url
if not parsed_url.netloc and parsed_url.scheme not in ("http", "https"):
# missing netloc means no '://' separator and will prepend the scheme
normalized_url = f"https://{url}" if use_ssl else f"http://{url}"
parsed_url = urlparse(normalized_url)
if parsed_url.scheme not in ("http", "https") or not parsed_url.netloc:
raise ValueError(
f"Invalid connection URL '{url}'. Expected format: 'http[s]://hostname[:port]'."
)
self.uri = normalized_url
self.api_key = api_key
self.use_ssl = use_ssl
self.cert_via_openssl = cert_via_openssl
Expand Down
Loading