новый мииф\
Some checks failed
CI / Lint (ruff + mypy) (push) Failing after 36s
CI / Run tests (push) Has been skipped
CI / Docker build test (push) Successful in 18s

This commit is contained in:
2026-03-30 17:10:24 +07:00
parent 03aa7805d1
commit 1d2f615b21
2 changed files with 22 additions and 3 deletions

View File

@@ -1,4 +1,5 @@
import logging import logging
from urllib.parse import parse_qs, urlparse
import httpx import httpx
@@ -88,9 +89,15 @@ class GlitchTipClient:
if 'rel="next"' not in part or 'results="true"' not in part or "cursor=" not in part: if 'rel="next"' not in part or 'results="true"' not in part or "cursor=" not in part:
continue continue
start = part.index("cursor=") + len("cursor=") url_start = part.find("<")
end = part.find(">", start) url_end = part.find(">", url_start + 1)
return part[start:end] if end != -1 else part[start:] if url_start == -1 or url_end == -1:
continue
parsed = urlparse(part[url_start + 1 : url_end].strip())
cursor_values = parse_qs(parsed.query).get("cursor")
if cursor_values:
return cursor_values[0]
return None return None

View File

@@ -44,6 +44,18 @@ async def test_list_issues_retries_without_query_params_on_422() -> None:
] ]
def test_parse_next_cursor_extracts_only_cursor_value() -> None:
link_header = (
'<https://glitchtip.example.com/api/0/projects/org/backend-production/issues/'
'?limit=100&cursor=cD0yMDI2LTAzLTI2KzIxJTNBNTklM0EyMS4xNjkxNDklMkIwMCUzQTAw'
'%26limit%3D100>; rel="next"; results="true"; cursor="..."'
)
cursor = GlitchTipClient._parse_next_cursor(link_header)
assert cursor == "cD0yMDI2LTAzLTI2KzIxJTNBNTklM0EyMS4xNjkxNDklMkIwMCUzQTAw&limit=100"
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_list_issues_preserves_non_422_errors() -> None: async def test_list_issues_preserves_non_422_errors() -> None:
def handler(request: httpx.Request) -> httpx.Response: def handler(request: httpx.Request) -> httpx.Response: