我在CURL和PHP之间有问题。我试图通过EWS连接到Exchange 2010服务器。与服务器的连接可以在命令行中使用CURL正常运行,但不能与PHP Curl扩展名兼容。
我在映像上附加了调试信息。在左侧,您可以看到命令行输出,在右侧是PHP的详细输出。当PHP Curl Extension引发错误“协商身份验证时关闭连接(HTTP 1.0?)”时,命令行将继续第三个HTTP请求,并在HTTP / 1.1 302中找到结果:
一些其他信息:
有人知道为什么PHP Curl Extension在第三个请求之前关闭连接吗?这是扩展程序的错误吗?我可以使用PHP Curl的常量来避免这种情况吗?还是有其他解决方法?
感谢您的帮助。
连接已关闭,因为服务器这样说。请查看您的屏幕截图,在“问题出在哪里?”上方的一行上。点。
HTTP/1.1 401 Unauthorized [...] Connection: close Content-Type: application/x-asmx
然后服务器可能会关闭连接。
所以这不是一个动作,而是结果。该消息在Curl_http_readwrite_headers
中发出:
Curl_http_readwrite_headers
大概是从第一个块(NTLM)开始,但是这是两次出现,而且它们彼此相邻。
有趣的事实:只有相同的函数#if defined(USE_NTLM)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_ntlm_state == NTLMSTATE_TYPE2)) ||
((data->req.httpcode == 407) &&
(conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
#endif
#if defined(USE_SPNEGO)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_negotiate_state == GSS_AUTHRECV)) ||
((data->req.httpcode == 407) &&
(conn->proxy_negotiate_state == GSS_AUTHRECV)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
会检查a lot later标头的存在,因此设置神秘标志Connection: close
可能意味着服务器已断开连接,并且已在套接字级别检测到该连接。
旁注:比较的两个方面显示出非常不同的相互作用。在左侧,实际上是一个空的conn->bits.close
请求(提供了GET
,Host
,Authorization
和User-Agent
标头),而在右侧,则存在许多更复杂的Accept
请求(相同标头加POST
,Method
,带有SOAPAction
的空内容,以继续)。