55
66import json
77from typing import Any
8- from unittest .mock import Mock
8+ from unittest .mock import Mock , patch
99from uuid import UUID
1010
1111import pytest
1212from aiohttp import web
1313from faker import Faker
1414from pydantic import BaseModel
15- from simcore_service_webserver .utils_aiohttp import envelope_json_response , iter_origins
15+ from simcore_service_webserver .utils_aiohttp import (
16+ envelope_json_response ,
17+ get_api_base_url ,
18+ iter_origins ,
19+ )
1620
1721
1822@pytest .fixture
@@ -31,6 +35,18 @@ class Point(BaseModel):
3135 }
3236
3337
38+ @pytest .fixture
39+ def make_request ():
40+ def _make_request (headers = None , scheme = "http" , host = "example.com" ):
41+ req = Mock (spec = web .Request )
42+ req .headers = headers or {}
43+ req .scheme = scheme
44+ req .host = host
45+ return req
46+
47+ return _make_request
48+
49+
3450def test_enveloped_successful_response (data : dict ):
3551 resp = envelope_json_response (data , web .HTTPCreated )
3652 assert resp .text is not None
@@ -111,3 +127,52 @@ def test_iter_origins(headers, expected_output):
111127 results = list (iter_origins (request ))
112128
113129 assert results == expected_output
130+
131+
132+ def test_no_forwarded_headers_regular_host (make_request ):
133+ req = make_request ()
134+ with patch ("common_library.network.is_ip_address" , return_value = False ):
135+ url = get_api_base_url (req )
136+ assert url == "http://api.example.com"
137+
138+
139+ def test_no_forwarded_headers_ip_host (make_request ):
140+ req = make_request (host = "192.168.1.2" )
141+ with patch ("common_library.network.is_ip_address" , return_value = True ):
142+ url = get_api_base_url (req )
143+ assert url == "http://192.168.1.2"
144+
145+
146+ def test_with_forwarded_headers (make_request ):
147+ headers = {"X-Forwarded-Proto" : "https" , "X-Forwarded-Host" : "mydomain.com" }
148+ req = make_request (headers = headers , scheme = "http" , host = "example.com" )
149+ with patch ("common_library.network.is_ip_address" , return_value = False ):
150+ url = get_api_base_url (req )
151+ assert url == "https://api.mydomain.com"
152+
153+
154+ def test_with_multiple_forwarded_headers (make_request ):
155+ headers = {
156+ "X-Forwarded-Proto" : "https, http" ,
157+ "X-Forwarded-Host" : "api1.com, api2.com" ,
158+ }
159+ req = make_request (headers = headers , scheme = "http" , host = "example.com" )
160+ with patch ("common_library.network.is_ip_address" , side_effect = [False , False ]):
161+ url = get_api_base_url (req )
162+ assert url == "https://api.api1.com"
163+
164+
165+ def test_forwarded_host_with_port (make_request ):
166+ headers = {"X-Forwarded-Proto" : "https" , "X-Forwarded-Host" : "mydomain.com:8080" }
167+ req = make_request (headers = headers , scheme = "http" , host = "example.com:8080" )
168+ with patch ("common_library.network.is_ip_address" , return_value = False ):
169+ url = get_api_base_url (req )
170+ assert url == "https://api.mydomain.com"
171+
172+
173+ def test_empty_forwarded_headers_fallback (make_request ):
174+ headers = {"X-Forwarded-Proto" : "" , "X-Forwarded-Host" : "" }
175+ req = make_request (headers = headers , scheme = "https" , host = "example.com" )
176+ with patch ("common_library.network.is_ip_address" , return_value = False ):
177+ url = get_api_base_url (req )
178+ assert url == "https://api.example.com"
0 commit comments