fix(sf): корректное urlencode form-data в okn_egrkn_client (#1066) #1147

Merged
bot-reviewer merged 1 commit from fix/okn-form-encoding into main 2026-06-07 14:13:34 +00:00
Collaborator

Проблема

sync_okn_objects падал на построении запроса: sequence item 1: expected a bytes-like object, tuple found.

Причина: client.post(url, data=list[tuple], headers={"Content-Type": "application/x-www-form-urlencoded"}) — при ручном Content-Type httpx не urlencode-ит список кортежей, а пытается join-ить их как байты.

Фикс

  • urllib.parse.urlencode(form_data)content=body (сырая строка). Гарантированно кодирует повторяющиеся ключи data[0][name]=...&data[0][value]=....
  • Content-Type: application/x-www-form-urlencoded; charset=UTF-8 добавлен в _HEADERS (при content= httpx не выставляет его автоматически).
  • UA-заголовки из _HEADERS (#1146) сохранены — 403 не вернётся.
  • Логика coord-swap [lat, lon] → PostGIS не тронута.

Тест

Новый test_post_uses_content_urlencode_not_data: перехватывает kwargs client.post(), проверяет content= (не data=), корректность urlencoded-строки, присутствие UA. Все 11 тестов зелёные.

Closes #1066

## Проблема `sync_okn_objects` падал на построении запроса: `sequence item 1: expected a bytes-like object, tuple found`. Причина: `client.post(url, data=list[tuple], headers={"Content-Type": "application/x-www-form-urlencoded"})` — при ручном Content-Type httpx не urlencode-ит список кортежей, а пытается join-ить их как байты. ## Фикс - `urllib.parse.urlencode(form_data)` → `content=body` (сырая строка). Гарантированно кодирует повторяющиеся ключи `data[0][name]=...&data[0][value]=...`. - `Content-Type: application/x-www-form-urlencoded; charset=UTF-8` добавлен в `_HEADERS` (при `content=` httpx не выставляет его автоматически). - UA-заголовки из `_HEADERS` (#1146) сохранены — 403 не вернётся. - Логика coord-swap `[lat, lon] → PostGIS` не тронута. ## Тест Новый `test_post_uses_content_urlencode_not_data`: перехватывает kwargs `client.post()`, проверяет `content=` (не `data=`), корректность urlencoded-строки, присутствие UA. Все 11 тестов зелёные. Closes #1066
bot-backend added 1 commit 2026-06-07 14:09:00 +00:00
fix(sf): корректное urlencode form-data в okn_egrkn_client (#1066)
All checks were successful
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Successful in 6m26s
CI / backend-tests (push) Successful in 6m30s
49e26b69d0
lekss361 added the
GG-форсайт
scope/backend
site-finder
ИРД
labels 2026-06-07 14:09:38 +00:00
bot-reviewer approved these changes 2026-06-07 14:13:21 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — urlencode form-data fix в okn_egrkn_client (чинит crash sync_okn_objects).

  • urllib.parse.urlencode(form_data) → корректно кодирует list[tuple] с повторяющимися ключами (data[0][name]=…&data[0][value]=…) → client.post(content=body) (raw str). Стандартный, надёжный способ. ✓
  • Content-Type: application/x-www-form-urlencoded; charset=UTF-8 добавлен в _HEADERS (при content= httpx не выставляет автоматически; charset=UTF-8 уместен для кириллицы). ✓
  • UA-заголовки (#1146) сохранены → 403 не вернётся; оба verify-пути используют _HEADERS. coord-swap не тронут. ✓
  • Тест test_post_uses_content_urlencode_not_data прямо проверяет content= (не data=), parse_qs корректность ключей/значений (Екатеринбург/1), UA в заголовках — точно таргетит баг. (#1141 mocked-тесты пропустили это, т.к. мокали httpx.Client целиком — реальный encoding не исполнялся.)

Третий okn-фикс подряд (#1141 ingest → #1146 UA-403 → #1147 urlencode), но каждый легитимен — воркер сходится на рабочем scraper'е. Без миграции, 1 файл + тест.

Merging (squash).

<!-- gendesign-review-bot: sha=49e26b6 verdict=approve --> ✅ **APPROVE** — urlencode form-data fix в okn_egrkn_client (чинит crash sync_okn_objects). - `urllib.parse.urlencode(form_data)` → корректно кодирует list[tuple] с повторяющимися ключами (`data[0][name]=…&data[0][value]=…`) → `client.post(content=body)` (raw str). Стандартный, надёжный способ. ✓ - `Content-Type: application/x-www-form-urlencoded; charset=UTF-8` добавлен в `_HEADERS` (при `content=` httpx не выставляет автоматически; charset=UTF-8 уместен для кириллицы). ✓ - UA-заголовки (#1146) сохранены → 403 не вернётся; оба verify-пути используют `_HEADERS`. coord-swap не тронут. ✓ - Тест `test_post_uses_content_urlencode_not_data` прямо проверяет `content=` (не `data=`), parse_qs корректность ключей/значений (Екатеринбург/1), UA в заголовках — точно таргетит баг. (#1141 mocked-тесты пропустили это, т.к. мокали httpx.Client целиком — реальный encoding не исполнялся.) Третий okn-фикс подряд (#1141 ingest → #1146 UA-403 → #1147 urlencode), но каждый легитимен — воркер сходится на рабочем scraper'е. Без миграции, 1 файл + тест. Merging (squash).
bot-reviewer merged commit a6e100b52a into main 2026-06-07 14:13:34 +00:00
bot-reviewer deleted branch fix/okn-form-encoding 2026-06-07 14:13:34 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1147
No description provided.