Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обход проблем с невидимыми символами при отправке файлов на PHP через прокси с NTLM-аутентификацией в Delphi

Delphi , ОС и Железо , Windows

При работе с веб-запросами в Delphi, особенно через прокси-серверы с NTLM-аутентификацией, можно столкнуться с непредвиденными проблемами, такими как появление невидимых символов в запросе. В данной статье мы рассмотрим, как решить эту проблему, используя функционал Winsock API.

Описание проблемы

Разработчик столкнулся с проблемой, при которой при отправке запроса на PHP-скрипт через прокси с NTLM-аутентификацию, используя функции Wininet, в контенте запроса появлялись невидимые символы (0x00), разделяющие каждую пару символов. Это приводило к тому, что сервер получал неверные данные.

Пример запроса

POST /upload.php HTTP/1.1
User-Agent: MYUSERAGENT
Host: 127.0.0.1
Cookie: ELSSESSID=k6ood2su2fbgrh805vs74fvmk5
Pragma: no-cache
Content-Length: 5

T.E.S

Пример кода на Delphi

pSession := InternetOpen('MYUSERAGENT', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
pConnection := InternetConnect(pSession, PChar('127.0.0.1'), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
pRequest := HTTPOpenRequest(pConnection, PChar('POST'), PChar('/upload.php'), 'HTTP/1.0', nil, nil, INTERNET_SERVICE_HTTP, 0);
HTTPSendRequest(pRequest, nil, 0, PChar('TESTR'), Length('TESTR'));

Понимание проблемы

Проблема заключается в том, что начиная с Delphi 2009, строки в Delphi представляют собой UTF-16 кодирование, в отличие от ANSI. Функция HTTPSendRequest работает с байтами, а не с символами, поэтому при передаче строки 'TESTR' в 5 символов, фактически передается 10 байтов, где каждый второй байт — это нулевой символ, что является результатом UTF-16 кодирования ASCII-символов.

Решение проблемы

Для решения проблемы необходимо использовать ANSI-строку вместо Unicode. Это позволит корректно передать данные в байтовом представлении, которое ожидает функция HTTPSendRequest.

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S));

Подтвержденный ответ

Использование ANSI-строки для передачи данных в HTTPSendRequest решит проблему с невидимыми символами, так как функция работает с байтами, а не с символами Unicode.

Альтернативный ответ

Если вы используете Delphi 2009 или более позднюю версию, убедитесь, что для строк, передаваемых в HTTPSendRequest, используется ANSI-кодирование, а не Unicode.

Заключение

При работе с веб-запросами в Delphi через прокси-серверы с NTLM-аутентификацией важно понимать различия между кодировками символов и байтов. Использование ANSI-строк для данных, отправляемых в HTTPSendRequest, позволит избежать появления невидимых символов в запросе и обеспечит корректную работу PHP-скрипта, получающего данные.

Создано по материалам из источника по ссылке.

Разработчик сталкивается с проблемой невидимых символов в запросах на PHP через прокси с NTLM-аутентификацией в Delphi, связанной с использованием UTF-16 кодирования вместо ANSI, и находит решение в использовании ANSI-строк для корректной перед


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-27 01:52:54/0.0032088756561279/0