Skip to content

Commit cee3bfb

Browse files
author
abel
committed
(fix) Updated the cookie assistant to support the exchange server not returning any cookie
1 parent 9aae397 commit cee3bfb

File tree

4 files changed

+123
-6
lines changed

4 files changed

+123
-6
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
All notable changes to this project will be documented in this file.
44

5-
## [1.2.0] - 2024-02-12
5+
## [1.3.1] - 2024-02-29
6+
### Changed
7+
- Updated cookie assistant logic to support the Indexer exchange server not using cookies and the chain server using them
8+
9+
## [1.3.0] - 2024-02-12
610
### Changed
711
- Removed `asyncio` from the dependencies
812

pyinjective/core/network.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ async def chain_metadata(self, metadata_query_provider: Callable) -> Tuple[Tuple
2323

2424
async def exchange_metadata(self, metadata_query_provider: Callable) -> Tuple[Tuple[str, str]]:
2525
cookie = await self.exchange_cookie(metadata_query_provider=metadata_query_provider)
26-
return (("cookie", cookie),)
26+
metadata = None
27+
if cookie is not None and cookie != "":
28+
metadata = (("cookie", cookie),)
29+
return metadata
2730

2831

2932
class KubernetesLoadBalancedCookieAssistant(CookieAssistant):
@@ -67,7 +70,7 @@ async def _fetch_exchange_cookie(self, metadata_query_provider: Callable):
6770
cookie_info = next((value for key, value in metadata if key == "set-cookie"), None)
6871

6972
if cookie_info is None:
70-
raise RuntimeError(f"Error fetching exchange cookie ({metadata})")
73+
cookie_info = ""
7174

7275
self._exchange_cookie = cookie_info
7376

@@ -83,7 +86,12 @@ def _is_cookie_expired(self, cookie_data: str) -> bool:
8386
cookie = SimpleCookie()
8487
cookie.load(cookie_data)
8588

86-
expiration_time = datetime.datetime.strptime(cookie["GCLB"]["expires"], "%a, %d-%b-%Y %H:%M:%S %Z").timestamp()
89+
if "GCLB" not in cookie:
90+
expiration_time = 0
91+
else:
92+
expiration_time = datetime.datetime.strptime(
93+
cookie["GCLB"]["expires"], "%a, %d-%b-%Y %H:%M:%S %Z"
94+
).timestamp()
8795

8896
timestamp_diff = expiration_time - time.time()
8997
return timestamp_diff < self.SESSION_RENEWAL_OFFSET
@@ -130,7 +138,7 @@ async def _fetch_exchange_cookie(self, metadata_query_provider: Callable):
130138
cookie_info = next((value for key, value in metadata if key == "set-cookie"), None)
131139

132140
if cookie_info is None:
133-
raise RuntimeError(f"Error fetching exchange cookie ({metadata})")
141+
cookie_info = ""
134142

135143
self._exchange_cookie = cookie_info
136144

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "injective-py"
3-
version = "1.3.0"
3+
version = "1.3.1"
44
description = "Injective Python SDK, with Exchange API Client"
55
authors = ["Injective Labs <[email protected]>"]
66
license = "Apache-2.0"

tests/core/test_network.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import pytest
2+
3+
from pyinjective.core.network import BareMetalLoadBalancedCookieAssistant, KubernetesLoadBalancedCookieAssistant
4+
5+
6+
class TestBareMetalLoadBalancedCookieAssistant:
7+
@pytest.mark.asyncio
8+
async def test_chain_metadata(self):
9+
assistant = BareMetalLoadBalancedCookieAssistant()
10+
dummy_metadata = [("set-cookie", "expected_cookie")]
11+
12+
async def dummy_metadata_provider():
13+
return dummy_metadata
14+
15+
metadata = await assistant.chain_metadata(metadata_query_provider=dummy_metadata_provider)
16+
expected_metadata = (("cookie", "expected_cookie"),)
17+
18+
assert expected_metadata == metadata
19+
20+
@pytest.mark.asyncio
21+
async def test_chain_metadata_fails_when_cookie_info_not_included_in_server_response(self):
22+
assistant = BareMetalLoadBalancedCookieAssistant()
23+
dummy_metadata = [("invalid_key", "invalid_value")]
24+
25+
async def dummy_metadata_provider():
26+
return dummy_metadata
27+
28+
with pytest.raises(RuntimeError, match=f"Error fetching chain cookie ({dummy_metadata})"):
29+
await assistant.chain_metadata(metadata_query_provider=dummy_metadata_provider)
30+
31+
@pytest.mark.asyncio
32+
async def test_exchange_metadata(self):
33+
assistant = BareMetalLoadBalancedCookieAssistant()
34+
dummy_metadata = [("set-cookie", "expected_cookie")]
35+
36+
async def dummy_metadata_provider():
37+
return dummy_metadata
38+
39+
metadata = await assistant.exchange_metadata(metadata_query_provider=dummy_metadata_provider)
40+
expected_metadata = (("cookie", "expected_cookie"),)
41+
42+
assert expected_metadata == metadata
43+
44+
@pytest.mark.asyncio
45+
async def test_exchange_metadata_is_none_when_cookie_info_not_included_in_server_response(self):
46+
assistant = BareMetalLoadBalancedCookieAssistant()
47+
dummy_metadata = [("invalid_key", "invalid_value")]
48+
49+
async def dummy_metadata_provider():
50+
return dummy_metadata
51+
52+
metadata = await assistant.exchange_metadata(metadata_query_provider=dummy_metadata_provider)
53+
54+
assert metadata is None
55+
56+
57+
class TestKubernetesLoadBalancedCookieAssistant:
58+
@pytest.mark.asyncio
59+
async def test_chain_metadata(self):
60+
assistant = KubernetesLoadBalancedCookieAssistant()
61+
dummy_metadata = [("set-cookie", "expected_cookie")]
62+
63+
async def dummy_metadata_provider():
64+
return dummy_metadata
65+
66+
metadata = await assistant.chain_metadata(metadata_query_provider=dummy_metadata_provider)
67+
expected_metadata = (("cookie", "expected_cookie"),)
68+
69+
assert expected_metadata == metadata
70+
71+
@pytest.mark.asyncio
72+
async def test_chain_metadata_fails_when_cookie_info_not_included_in_server_response(self):
73+
assistant = KubernetesLoadBalancedCookieAssistant()
74+
dummy_metadata = [("invalid_key", "invalid_value")]
75+
76+
async def dummy_metadata_provider():
77+
return dummy_metadata
78+
79+
with pytest.raises(RuntimeError, match=f"Error fetching chain cookie ({dummy_metadata})"):
80+
await assistant.chain_metadata(metadata_query_provider=dummy_metadata_provider)
81+
82+
@pytest.mark.asyncio
83+
async def test_exchange_metadata(self):
84+
assistant = KubernetesLoadBalancedCookieAssistant()
85+
dummy_metadata = [("set-cookie", "expected_cookie")]
86+
87+
async def dummy_metadata_provider():
88+
return dummy_metadata
89+
90+
metadata = await assistant.exchange_metadata(metadata_query_provider=dummy_metadata_provider)
91+
expected_metadata = (("cookie", "expected_cookie"),)
92+
93+
assert expected_metadata == metadata
94+
95+
@pytest.mark.asyncio
96+
async def test_exchange_metadata_is_none_when_cookie_info_not_included_in_server_response(self):
97+
assistant = KubernetesLoadBalancedCookieAssistant()
98+
dummy_metadata = [("invalid_key", "invalid_value")]
99+
100+
async def dummy_metadata_provider():
101+
return dummy_metadata
102+
103+
metadata = await assistant.exchange_metadata(metadata_query_provider=dummy_metadata_provider)
104+
105+
assert metadata is None

0 commit comments

Comments
 (0)