强制Http 1.0 idHttpServer和TIME_WAIT

时间:2011-02-22 18:55:04

标签: delphi sockets winsock indy

Delphi 2010,来自Svn的Last Indy源代码。

有谁知道如何强制TIDHttpServer发送http 1.0响应,而不是发送http 1.1? 我想摆脱持久连接(保持活动),我也希望客户端与我的服务器断开连接而不是我的服务器与客户端断开连接(以避免我的服务器中的TIME_WAIT)。

一些数据:

客户端发出的请求(在本例中为Internet Explorer):

GET / HTTP / 1.0
接受: /
接受语言: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)
主持人:localhost:114
联系:保持活力

来自我的Indy服务器的回复:

HTTP / 1.1 200 OK
连接:关闭
内容类型:text / html;字符集= ISO-8859-1
内容长度:2717

如您所见,客户端明确告诉服务器使用http 1.0,但indy服务器响应是http 1.1。

修改

我发现最好的解决方案是在OnCommandGet事件中设置:

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

AResponseInfo.CloseConnection:= False使服务器不与客户端断开连接并且Connection:='close'使客户端与服务器断开连接,从而避免服务器TIME_WAIT。

1 个答案:

答案 0 :(得分:1)

在IdCustomHTTPServer.pas

版本字符串'HTTP / 1.1'在TIdHTTPResponseInfo.WriteHeader方法中进行了硬编码。

此类没有可以覆盖的工厂,因此您可以使用后代版本更改其行为。它是在TIdCustomHTTPServer.DoExecute

中明确创建的

但是,由于您确实拥有源代码,因此您可以将硬编码字符串更改为“HTTP / 1.0”或更改其行为以根据属性设置进行响应。

同样设置IdHttpServer.KeepLive := False;会停止持久会话,但确实会导致服务器在请求结束时断开客户端。