You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Indy通过NTLM代理发起POST请求时触发EAbort异常

Delphi 11.3 Indy通过NTLM代理POST请求触发EAbort异常的问题解决

问题场景

  • 使用Delphi 11.3自带的Indy库,通过WinGate NTLM代理访问Web服务器
  • GET请求能正常执行,但POST请求会触发EAbort异常
  • 绕过代理时POST请求完全正常,用CURL测试GET/POST请求也没有问题

排查结论

异常触发在IdAuthenticationSSPI单元的TIdSSPINTLMAuthentication.Authentication方法第1250行,核心原因:

  • POST请求时该认证方法会被调用两次,第二次调用时FNTLMInfo为空,直接触发异常
  • 代理返回的连接头存在差异:GET请求返回Connection: Keep-Alive,POST请求返回Proxy-Connection: Keep-Alive,而Indy对这两个头的处理逻辑不一致,导致认证会话的上下文被错误清空

解决方案

方案1:修改Indy源码适配代理头

找到Indy中处理代理响应头的代码,让Proxy-Connection: Keep-Alive的处理逻辑和Connection: Keep-Alive保持一致,确保NTLM认证的上下文(FNTLMInfo)在Keep-Alive连接中不会被清空。

方案2:应用层临时补丁

在代码中手动处理头信息,强制统一连接头的处理:

// 发送POST请求前,主动设置标准Connection头
IdHTTP1.Request.Connection := 'Keep-Alive';

// 或者拦截响应头,将Proxy-Connection替换为标准Connection头
procedure TYourForm.IdHTTP1ResponseHeadersAvailable(Sender: TObject; AHeaders: TIdHeaderList);
var
  ProxyConnIdx: Integer;
begin
  ProxyConnIdx := AHeaders.IndexOfName('Proxy-Connection');
  if ProxyConnIdx <> -1 then
  begin
    // 添加标准Connection头
    AHeaders.Add('Connection: ' + AHeaders.ValueFromIndex[ProxyConnIdx]);
    // 删除Proxy-Connection头
    AHeaders.Delete(ProxyConnIdx);
  end;
end;

内容的提问来源于stack exchange,提问作者Paul G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:04