Ворклог по задаче "Исправить декодирование URL в haih-agent"
Уточнение по декодированию 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 должны разбираться отдельно.
Добавить корректное декодирование URL/route params в haih-agent, чтобы percent-encoded спецсимволы не приводили к ложным 404.