Задача: Исправить декодирование URL в haih-agent
Исправить декодирование URL в haih-agent
Добавить корректное декодирование URL/route params в haih-agent, чтобы percent-encoded спецсимволы не приводили к ложным 404.
Проблема
В haih-agent воспроизводится та же ошибка, что и на freecode.academy: URL со спецсимволами в percent-encoded виде могут приводить к 404, хотя соответствующая сущность существует.
Причина подтверждена: отсутствует корректное декодирование URL. В прикладном кейсе использование decodeURI решает проблему.
Что нужно сделать
- Найти общий участок в
haih-agent, где URL/route params/slug используются для поиска сущности или сопоставления маршрута. - Добавить единообразное декодирование до бизнес-логики/lookup, чтобы percent-encoded символы сравнивались с данными в ожидаемом формате.
- Определить точное место применения
decodeURI/эквивалента так, чтобы исправление работало централизованно, а проекты на базеhaih-agentне были вынуждены чинить это локально. - Не допустить двойного декодирования и ошибок на уже decoded значениях.
- Проверить взаимодействие с URL generation/canonical URLs, чтобы encode/decode были симметричны и выполнялись ровно по одному разу на соответствующей границе.
Пример проблемного кейса
/comments/topics/dzheneriki-typescript/nu-vot-ts-tebe-govorit-%22ty-zanimaeshsya-figney%22,-i
До исправления такой URL может давать 404 из-за %22 и других encoded-символов. После декодирования должна находиться существующая страница/сущность.
Связанный SEO/GEO контекст
Эта работа стала частью более общего базиса для человекопонятных URL: haih-agent должен уметь генерировать и обслуживать стабильные slug URI, а приложения на его базе — использовать этот механизм для SEO-friendly маршрутов.
Связанная задача fi1osof.ru: Прокачать SEO/GEO
Реализация: https://github.com/haih-net/agent/commit/1f99a51dd407eb4e58f9e2f83f411a265db2f24c
Коммит не ограничивается decodeURI: он добавляет slugify URI для концептов и автоматический 301 redirect при изменении URI, то есть формирует общий фундамент для перехода приложений на ЧПУ.
Ворклоги
Уточнение по декодированию URI
После проверки выяснилось, что decodeURI(asPath) закрывает не все нужные кейсы.
Конкретный пример:
/projects/%40prisma-cms/sendmail
ожидается как:
/projects/@prisma-cms/sendmail
Но decodeURI() оставляет %40, потому что @ относится к зарезервированным URI-символам и целый URI декодируется не полностью.
Для URI сущностей корректнее обрабатывать путь по сегментам:
- Сначала разделить pathname по
/, сохранив структуру маршрута. - Каждый сегмент отдельно пропустить через
decodeURIComponent(). - Собрать путь обратно.
Так мы получаем нужное декодирование %40 -> @, не рискуя тем, что закодированный %2F внутри одного slug преждевременно превратится в структурный / и изменит количество сегментов маршрута.
То есть целевая логика должна быть segment-aware, например концептуально:
const uri = pathname
.split('/')
.map(segment => decodeURIComponent(segment))
.join('/')
Это также симметрично текущей реализации slugifyUri(), которая уже работает по сегментам.
Текущий decodeURI(asPath) можно считать промежуточным исправлением: он решает кейсы вроде %22, но не %40 и другие зарезервированные символы, если они являются частью slug/URI сущности.
Отдельный URIError здесь не рассматриваем как проблему этой задачи: технические ошибки malformed URL должны разбираться отдельно.
Прогресс: исправление реализовано и расширено до базиса ЧПУ
Реализация выполнена в коммите: https://github.com/haih-net/agent/commit/1f99a51dd407eb4e58f9e2f83f411a265db2f24c
Входящие URI теперь декодируются через decodeURI в ключевых местах работы с router.asPath, что устраняет ложные 404 для существующих страниц с percent-encoded символами.
Одновременно работа расширена до общего URI-базиса haih-agent: добавлена генерация slugified URI из имени концепта и автоматический 301 redirect при смене URI. Это сделано как фундамент для перехода приложений на базе haih-agent к человекопонятным URL.
Практическое продолжение — SEO/GEO fi1osof.ru, где текущие URL задач и проектов используют технические CUID. Связанная задача: Прокачать SEO/GEO.