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
相关产品推荐
相关产品推荐

