Как сказал Реми Лебо, кажется, что нет способа указать пользовательский заголовок Host
. Поэтому я решил немного изменить коды IdHTTP
.
Сначала я скопировал IdHTTP.pas
(C:\Program Files (x86)\Embarcadero\Studio\XX.0\source\Indy10\Protocols\IdHTTP.pas
) в мой каталог проектов и добавил его в свой проект. Тогда в TIdCustomHTTP.PrepareRequest
методе (линия 1792) Я изменил код так:
if (TextIsSame(FURI.Protocol, 'http') and (FURI.Port = IntToStr(IdPORT_HTTP))) or {do not localize}
(TextIsSame(FURI.Protocol, 'https') and (FURI.Port = IntToStr(IdPORT_https))) then {do not localize}
begin
if FURI.Host = 'stackoverflow.com' then
ARequest.Host := 'example.com'
else
ARequest.Host := FURI.Host;
end else begin
if FURI.Host = 'stackoverflow.com' then
ARequest.Host := 'example.com' + ':' + FURI.Port {do not localize}
else
ARequest.Host := FURI.Host + ':' + FURI.Port; {do not localize}
end;
Я знаю, что это не самый лучший способ и модификации библиотеки не является хорошей идеей, но он работал на меня.
Так что, если я меняю примеры выше, stackoverflow.com
к myblog.wordpress.com
и example.com
к anotherblog.wordpress.com
, К IdHTTP1.Get('http://myblog.wordpress.com')
мы получим anotherblog.wordpress.com
содержание.
Это поле заполняется методом 'TIdCustomHTTP.PrepareRequest'. Во всяком случае, почему вы хотите идти против стандарта RFC 2616, говорящего о поле хоста * «Поле заголовка запроса хоста указывает номер хоста и номера интернет-ресурса запрашиваемого ресурса, полученные из исходного URI, предоставленного пользователем, или ссылки ресурс "* (это именно то, что делает Indy при подготовке запроса)? – TLama
@TLama Итак, есть anyways, чтобы остановить 'TIdCustomHTTP.PrepareRequest' от изменения поля' Host'? Я хочу получить доступ к общему IP-адресу. Поэтому мне нужно указать 'Host'. Мне нужен пользовательский хост, потому что хост не зарегистрирован. – Sky
Если хост не зарегистрирован DNS, вы можете напрямую использовать IP-адрес: 'http: // w.x.y.z /' ... – mjn