Принудительно Http 1.0 idHttpServer и TIME_WAIT

Delphi 2010, исходный код Last Indy от Svn.

Кто-нибудь знает, как заставить TIDHttpServer отправлять ответ http 1.0 вместо отправки http 1.1? Я хочу избавиться от постоянных подключений (поддерживать активность), а также хочу, чтобы клиент отключался от моего сервера, а не мой сервер отключался от клиента (чтобы избежать TIME_WAIT на моем сервере).

Некоторые данные:

Запрос, сделанный клиентом (в данном случае Internet Explorer):

GET / HTTP/1.0
Accept: /
Accept-Language: pt-BR
User-Agent: Mozilla/4.0 (совместимый; MSIE 8.0; Windows NT 6.1 ; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)< br> Хост: localhost:114
Соединение: Keep-Alive

Ответ моего сервера Indy:

HTTP/1.1 200 ОК
Соединение: закрыть
Content-Type: text/html; charset=ISO-8859-1
Длина содержимого: 2717

Как вы можете видеть, клиент явно сказал серверу использовать http 1.0, но ответ индийного сервера был http 1.1.

ИЗМЕНИТЬ:

Я понял, что лучшее решение — установить в событии OnCommandGet:

AResponseInfo.CloseConnection := False;
AResponseInfo.Connection := 'close';

AResponseInfo.CloseConnection := False заставляет сервер не отключаться от клиента, а Connection := 'close' заставляет клиента отключаться от сервера, избегая серверов TIME_WAIT.


person Rafael Colucci    schedule 22.02.2011    source источник


Ответы (1)


В IdCustomHTTPServer.pas

Строка версии «HTTP/1.1» жестко запрограммирована в методе TIdHTTPResponseInfo.WriteHeader.

У этого класса нет фабрики, которую вы можете переопределить, поэтому вы можете изменить ее поведение с помощью версии-потомка. Он явно создан в TIdCustomHTTPServer.DoExecute

Однако, поскольку у вас есть источник, вы можете изменить жестко закодированную строку на «HTTP/1.0» или изменить ее поведение, чтобы оно отвечало на основе настройки свойства.

Также установка IdHttpServer.KeepLive := False; остановит постоянные сеансы, но это приведет к тому, что сервер отключит клиента в конце запроса.

person Robert Love    schedule 22.02.2011
comment
Конечно, просто изменить строку недостаточно. Вы также должны убедиться, что класс ведет себя так, как должен вести себя сервер HTTP 1.0. - person Rob Kennedy; 23.02.2011
comment
OK.. Я понял, что лучшим решением будет установить: AResponseInfo.CloseConnection := False; AResponseInfo.Connection := 'закрыть'; CloseConnection заставляет сервер не отключаться от клиента, а Connection := 'close' заставляет клиента отключиться от сервера. Но я приму ваш ответ, потому что это было то, что я спросил. Спасибо. - person Rafael Colucci; 23.02.2011