Skip to content

Commit 46c7fec

Browse files
committed
use redirect port when specified
1 parent 58931a7 commit 46c7fec

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

src/snowflake/connector/auth/_http_server.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ def __init__(
8484
else:
8585
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
8686

87-
port = parsed_uri.port or 0
87+
if parsed_redirect.hostname in ("localhost", "127.0.0.1"):
88+
port = parsed_redirect.port or 0
89+
else:
90+
port = parsed_uri.port or 0
8891
for attempt in range(1, self.DEFAULT_MAX_ATTEMPTS + 1):
8992
try:
9093
self._socket.bind(
@@ -125,9 +128,12 @@ def __init__(
125128
query=parsed_uri.query,
126129
fragment=parsed_uri.fragment,
127130
)
128-
if parsed_redirect.hostname in ("localhost", "127.0.0.1"):
131+
if (
132+
parsed_redirect.hostname in ("localhost", "127.0.0.1")
133+
and port != parsed_redirect.port
134+
):
129135
logger.debug(
130-
f"Redirect URI hostname is {parsed_redirect.hostname}, redirect port {parsed_redirect.port} will be changed to the server port {port}."
136+
f"Updating redirect port {parsed_redirect.port} to match the server port {port}."
131137
)
132138
self._redirect_uri = urllib.parse.ParseResult(
133139
scheme=parsed_redirect.scheme,

test/unit/test_auth_callback_server.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,59 @@ def test_auth_callback_server_updates_localhost_redirect_uri_port_to_match_socke
122122
assert callback_server._redirect_uri.port == callback_server.port
123123

124124

125+
@pytest.mark.parametrize(
126+
"socket_host",
127+
[
128+
"127.0.0.1",
129+
"localhost",
130+
],
131+
)
132+
@pytest.mark.parametrize(
133+
"socket_port",
134+
[
135+
"",
136+
":0",
137+
":12345",
138+
],
139+
)
140+
@pytest.mark.parametrize(
141+
"redirect_host",
142+
[
143+
"127.0.0.1",
144+
"localhost",
145+
],
146+
)
147+
@pytest.mark.parametrize(
148+
"redirect_port",
149+
[
150+
54321,
151+
54320,
152+
],
153+
)
154+
@pytest.mark.parametrize(
155+
"dontwait",
156+
["false", "true"],
157+
)
158+
@pytest.mark.parametrize("reuse_port", ["true", "false"])
159+
def test_auth_callback_server_uses_redirect_uri_port_when_specified(
160+
monkeypatch,
161+
socket_host,
162+
socket_port,
163+
redirect_host,
164+
redirect_port,
165+
dontwait,
166+
reuse_port,
167+
) -> None:
168+
monkeypatch.setenv("SNOWFLAKE_AUTH_SOCKET_REUSE_PORT", reuse_port)
169+
monkeypatch.setenv("SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAIT", dontwait)
170+
with AuthHttpServer(
171+
uri=f"http://{socket_host}{socket_port}/test_request",
172+
redirect_uri=f"http://{redirect_host}:{redirect_port}/test_request",
173+
) as callback_server:
174+
assert callback_server.port == redirect_port
175+
assert callback_server._redirect_uri.port == redirect_port
176+
177+
125178
@pytest.mark.parametrize(
126179
"socket_host",
127180
[

0 commit comments

Comments
 (0)