При работе с HTTP-запросами в среде WinInet может возникнуть необходимость получения сырых байтов заголовков, что особенно актуально при обработке перенаправлений, где поле заголовка Location содержит URL с некодированными символами Unicode. В данном случае, стандартная функция HttpQueryInfo возвращает строку, что может быть неудобно при работе с нестандартными символами.
Проблема
Функция HttpQueryInfo предназначена для получения информации о HTTP-запросе, включая заголовки. Однако, она возвращает строковые данные, а не сырые байты. В большинстве случаев это не вызывает проблем, но при работе с перенаправлениями, содержащими некодированные символы Unicode, может потребоваться доступ к сырым байтам для корректной обработки URL.
Пример кода
var
vContent_Wide: WideString;
begin
vBufferSize := 4096;
GetMem(vBufferPtr, vBufferSize);
while True do
begin
TmpFakeCardinal := 0;
vErrorNone := HttpQueryInfo(
hHttpOpen_Request,
HTTP_QUERY_RAW_HEADERS_CRLF,
vBufferPtr,
vBufferSize,
TmpFakeCardinal
);
if (vErrorNone = False) then
begin
vErrorID := GetLastError;
if (vErrorID = ERROR_INSUFFICIENT_BUFFER) then
begin
FreeMem(vBufferPtr);
GetMem(vBufferPtr, vBufferSize);
end
else Break;
end
else
begin
vContent_Wide := PWideChar(vBufferPtr);
Result := vContent_Wide;
Break;
end;
end;
FreeMem(vBufferPtr, vBufferSize);
end;
Альтернативные методы
Если стандартная функция HttpQueryInfo не позволяет получить сырые байты, можно рассмотреть альтернативные подходы, такие как использование специализированных прокси-серверов, tcp-дumpers, например, WireShark, или же использование других HTTP-библиотек, таких как Synapse или Indy.
Подтвержденный ответ
URIs (Uniform Resource Identifiers) должны соответствовать определенным стандартам, в частности RFC 2616 и RFC 3986, которые требуют использования процентного кодирования для не-ASCII символов. Если сервер отправляет некодированные Unicode-символы в заголовке Location, это является нарушением стандартов. В таком случае, возможно, сервер отправляет IRI (Internationalized Resource Identifier), которые должны быть преобразованы в URI перед использованием. В случае, если HttpQueryInfo не может быть настроен на возврат сырых байтов с помощью параметра dwInfoLevel, альтернативой может стать использование других HTTP-библиотек, поддерживающих необходимые функции.
Рекомендации
Проверьте возможность использования параметра HTTP_QUERY_CUSTOM для HttpQueryInfo, чтобы получить сырые байты заголовков. Если это не помогает, рассмотрите использование других библиотек, таких как Indy, и настройте их на использование кодировки UTF-8 для корректной обработки заголовков.
Заключение
При работе с HTTP-заголовками важно учитывать стандарты кодирования символов и правильно их обрабатывать. В случае возникновения проблем с некодированными Unicode-символами, следует искать решения, которые позволят корректно интерпретировать полученные данные.
При работе с HTTP-запросами в WinInet нужно обработать перенаправление, используя сырые байты заголовка Location для корректной работы с Unicode-символами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS