Ошибка OAuth2 после обновления Indy: восстановление корректного кодирования специальных символов
В статье рассматривается проблема, возникшая после обновления компонента Indy до версии Indy 10 SVN 5412, связанная с ошибкой 400 Bad Request при запросе OAuth2 токена. Проблема заключалась в том, что специальные символы в запросе не кодировались должным образом, что приводило к ошибке на стороне сервера.
Описание проблемы
При использовании Indy 10.0.52 запрос на получение OAuth2 токена проходил успешно, но после обновления до Indy 10 SVN 5412 начались проблемы с кодированием специальных символов в запросе. В частности, символ процента (%) не кодировался как %25, что является стандартным поведением для URL-адресов.
Контекст
Исходный код на Object Pascal для запроса токена OAuth2 содержит использование TMemoryStream для отправки данных. Однако, в новой версии Indy, TIdHTTP не выполняет кодирование содержимого TMemoryStream, что делает ответственность за корректное форматирование данных лежащей на разработчике.
Подтвержденный ответ
Разработчик должен убедиться, что данные, отправляемые через TIdHTTP, правильно форматированы. Вместо использования TMemoryStream можно использовать перегрузку TIdHTTP.Post(TStrings), которая автоматически кодирует строки в формате application/x-www-form-urlencoded.
В Indy 10.0.52 метод TIdHTTP.Post(TStrings) кодировал только значения параметров, используя TIdURI.ParamsEncode, и только символы из набора '*#%<> []' или не-ASCII символы в диапазоне от #33 до #128 включательно.
В последних версиях Indy (на момент написания статьи 10.6.2.5418), TIdHTTP.Post(TStrings) поддерживает Unicode и кодирует как имена, так и значения параметров в соответствии со стандартом HTML5, кодируя любые Unicode символы, не входящие в набор 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*-._'.
Решение
Для решения проблемы рекомендуется использовать TStringList и метод TIdHTTP.Post(TStrings) для отправки данных. Пример кода на Object Pascal:
Переход на использование TStringList и метода TIdHTTP.Post(TStrings) позволяет автоматически кодировать специальные символы в запросе, что решает проблему с ошибкой 400 Bad Request после обновления Indy до последней версии.
### Описание:
В статье рассматривается проблема, связанная с неправильным кодированием специальных символов в запросе OAuth2 после обновления компонента Indy, и предлагается решение через использование метода `TIdHTTP.Post(TStrings)` для корректной отпра
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.