从Indy 9到Indy 10

时间:2015-05-07 21:55:51

标签: delphi indy10 indy-9

我需要你的帮助:

一个。 Indy 9。

AThread.OutboundClient.Write(AddHeader(athread.netdata,'Connection: Keep-Alive'));  

AThread.OutboundClient.Write(stringreplace(athread.netdata,#13#10#13#10,#13#10 + 'Connection: Keep-Alive' + #13#10 + #13#10,[rfreplaceall]));

B中。 Indy 10.

根据上面的indy 9代码,有人可以告诉我什么是正确的indy 10代码。我尝试使用它,但根本不起作用:

....
var Netdata:String;
....

TIdMappedPortContext(AContext).OutboundClient.IOHandler.Write(AddHeader(netbyte(netdata,'Connection: Keep-Alive')));

TIdMappedPortContext(AContext).OutboundClient.IOHandler.Write(netbyte(netdata,StringReplace(netstring(AContext,#13#10#13#10,#13#10 + 'Connection: Keep-Alive' + #13#10 + #13#10,[rfreplaceall])); )

1 个答案:

答案 0 :(得分:1)

NetDataTIdMappedPortContext的属性,例如:

TIdMappedPortContext(AContext).OutboundClient.IOHandler.Write(AddHeader(BytesToString(TIdMappedPortContext(AContext).NetData), 'Connection: Keep-Alive'));  

TIdMappedPortContext(AContext).OutboundClient.IOHandler.Write(StringReplace(BytesToString(TIdMappedPortContext(AContext).NetData), #13#10#13#10, #13#10 + 'Connection: Keep-Alive' + #13#10 + #13#10, [rfReplaceAll]));

在您展示的代码中,您对netbyte()netstring()的使用确实让您觉得NetData现在是一个字节数组而不是String。但不管怎样,你一般都没有很好地处理这种情况。在Indy 9和10中,这种类型的代码不是修改通过TIdMappedPortTCP的HTTP标头的可靠方法。 TIdMappedPortTCP是原始数据的直接传递,它没有HTTP协议的概念。存储在NetData中的数据是任意的,它可以包含恰好恰好在特定时刻位于套接字上的HTTP消息(或多个消息)的任何部分的字节。因此,您不能依赖每个NetData中有效的完整HTTP消息。

如果要以这种方式使用TIdMappedPortTCP,则需要维护从客户端接收的所有数据的缓冲区,然后在每次向其添加新数据时解析该缓冲区。您需要知道每条HTTP消息的结束位置以及下一条HTTP消息的开始位置,以及HTTP标头的结束位置以及HTTP正文在每条HTTP消息中的开头。只有这样,您才能安全地将自定义HTTP标头注入对话中。这是比你在这里展示的更先进的逻辑。

据说,Indy有一个TIdHTTPProxyServer组件,您应该使用它而不是TIdMappedPortTCP,例如:

Indy 9:

// OnHTTPHeaders event handler...
procedure TForm1.IdHTTPProxyServer1HTTPHeaders(ASender: TIdHTTPProxyServerThread; const ASource: TIdHTTPSource; const ADocument: string; AHeaders: TIdHeaderList);
begin
  if ASource = httpBrowser then
    AHeaders.Values['Connection'] := 'Keep-Alive';
end;

Indy 10:

// OnHTTPBeforeCommand event handler...
procedure TForm1.IdHTTPProxyServer1HTTPBeforeCommand(AContext: TIdHTTPProxyServerContext);
begin
  if AContext.TransferSource = tsClient then
    AContext.Headers.Values['Connection'] := 'Keep-Alive';
end;

然后,您可以将HTTP客户端配置为连接到TIdHTTPProxyServer作为HTTP代理,而不是连接到TIdMappedPortTCP,就好像它是实际的HTTP服务器一样。