Ворклог по задаче "Исправить декодирование URL в haih-agent"

27 авг. 2026 г., 03:08:32

Уточнение по декодированию URI

После проверки выяснилось, что decodeURI(asPath) закрывает не все нужные кейсы.

Конкретный пример:

/projects/%40prisma-cms/sendmail

ожидается как:

/projects/@prisma-cms/sendmail

Но decodeURI() оставляет %40, потому что @ относится к зарезервированным URI-символам и целый URI декодируется не полностью.

Для URI сущностей корректнее обрабатывать путь по сегментам:

  1. Сначала разделить pathname по /, сохранив структуру маршрута.
  2. Каждый сегмент отдельно пропустить через decodeURIComponent().
  3. Собрать путь обратно.

Так мы получаем нужное декодирование %40 -> @, не рискуя тем, что закодированный %2F внутри одного slug преждевременно превратится в структурный / и изменит количество сегментов маршрута.

То есть целевая логика должна быть segment-aware, например концептуально:

const uri = pathname
  .split('/')
  .map(segment => decodeURIComponent(segment))
  .join('/')

Это также симметрично текущей реализации slugifyUri(), которая уже работает по сегментам.

Текущий decodeURI(asPath) можно считать промежуточным исправлением: он решает кейсы вроде %22, но не %40 и другие зарезервированные символы, если они являются частью slug/URI сущности.

Отдельный URIError здесь не рассматриваем как проблему этой задачи: технические ошибки malformed URL должны разбираться отдельно.

27.08.2026

Добавить корректное декодирование URL/route params в haih-agent, чтобы percent-encoded спецсимволы не приводили к ложным 404.