Skip to content

Commit 7d93a97

Browse files
qual: base64url encoding without padding by default
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent 006151b commit 7d93a97

4 files changed

Lines changed: 15 additions & 3 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ authors = [
88
{ name = "Alex Klinkhamer", email = "about.rendezqueue@grencez.dev" }
99
]
1010
dependencies = [
11-
"sxpb @ git+https://github.com/sxproto/sxpb-py@1a270175d69e58975ba231fa276d27b9d28c00d1",
1211
]
1312
readme = "README.md"
1413
requires-python = ">=3.9"
@@ -38,6 +37,7 @@ package-dir = "src"
3837
dev = [
3938
"pytest",
4039
"ruff",
40+
"sxpb @ git+https://github.com/sxproto/sxpb-py@04fbc53342cb7c7dd75166be955253711966f5e2",
4141
"ty",
4242
]
4343

src/rendezqueue/client.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ def _poll(self) -> None:
8989
# Take snapshot of queue to send
9090
snapshot_queue = list(self.outgoing_queue)
9191
b64_values = [
92-
base64.b64encode(v).decode("ascii") for v in snapshot_queue
92+
base64.urlsafe_b64encode(v).decode("ascii").rstrip("=")
93+
for v in snapshot_queue
9394
]
9495

9596
request_body = {
@@ -171,7 +172,9 @@ def _decode_response(self, msg: Dict[str, Any]) -> Dict[str, Any]:
171172
return msg
172173

173174
def _b64decode_padded(self, s: str) -> bytes:
175+
# Support both regular base64 and base64url by standardizing to base64url alphabet
176+
s = s.replace("+", "-").replace("/", "_")
174177
missing_padding = len(s) % 4
175178
if missing_padding:
176179
s += "=" * (4 - missing_padding)
177-
return base64.b64decode(s, validate=False)
180+
return base64.urlsafe_b64decode(s)

src/rendezqueue/impl.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def btoa(s: str) -> str:
1616

1717
def atob(s: str) -> str:
1818
# URL-safe base64 decoding with padding added
19+
# Support both regular base64 and base64url by standardizing to base64url alphabet
20+
s = s.replace("+", "-").replace("/", "_")
1921
missing_padding = len(s) % 4
2022
if missing_padding:
2123
s += "=" * (4 - missing_padding)

test/client_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ def test_decode_padding(self):
108108
decoded = self.client._decode_response(msg)
109109
self.assertEqual(decoded["values"][0], b"test padding")
110110

111+
def test_base64url_decoding(self):
112+
# Test base64url decoding with missing padding
113+
encoded = base64.urlsafe_b64encode(b"ab\xbf\x9c").decode("ascii").rstrip("=")
114+
msg = {"values": [encoded], "b64": 1}
115+
decoded = self.client._decode_response(msg)
116+
self.assertEqual(decoded["values"][0], b"ab\xbf\x9c")
117+
111118
@patch("urllib.request.urlopen")
112119
def test_defaults(self, mock_urlopen):
113120
# Initialize client without callbacks

0 commit comments

Comments
 (0)