Jos*_*ost 25 php libcurl php-curl
在我们的PHP应用程序中,我们需要以某种方式构建的PHP curl-extension,它支持以下功能:
我试图以一种实现这个目的的方式构建curl:
我是用命令行完成的
nmake /f Makefile.vc mode=dll VC=15 ENABLE_WINSSL=yes DEBUG=no MACHINE=x64 ENABLE_SSPI=no WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static WITH_DEVEL=C:\curl\deps-x64
Run Code Online (Sandbox Code Playgroud)
在卷发winbuild/子文件夹中.然后我根据结果编译了php curl扩展.
结果,在针对提供Basic,Digest,NTLM和Negotiate身份验证(Exchange Web服务)的Web服务执行HTTP请求时,我有以下不正确的行为:
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);使用,一切正常curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);使用,一切都很好curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM | CURLAUTH_BASIC);使用,则身份验证失败.失败的请求包含一个太短的NTLM令牌(似乎在某些时候被切断).一些谷歌搜索指出,这可能是由于卷曲被编译为使用SSPI.但是,我无法禁用SSPI,因为WinSSL需要它.
有谁知道解决这个问题?获得满足所有上述要求的php-curl扩展?
小智 1
我相信这里的 LibCurl 满足了所有这些:
使用该文件:
#include <curl/curl.h>
#include <stdio.h>
int main() {
curl_version_info_data *o = curl_version_info(CURLVERSION_NOW);
printf("SSL: %s\n", o->ssl_version);
printf("NTLM: %d\n", o->features & CURL_VERSION_NTLM);
printf("HTTP/2: %d\n", o->features & CURL_VERSION_HTTP2);
printf("SSH2: %s\n", o->libssh_version);
printf("IPv6: %d\n", o->features & CURL_VERSION_IPV6);
}
Run Code Online (Sandbox Code Playgroud)
建造:
cc https.c `
'-Icurl-7.70.0-win64-mingw\include' `
'-Lcurl-7.70.0-win64-mingw\lib' `
-lcrypt32 `
-lcurl `
-lwldap32 `
-lws2_32
Run Code Online (Sandbox Code Playgroud)
结果:
SSL: OpenSSL/1.1.1g (Schannel)
NTLM: 16
HTTP/2: 65536
SSH2: libssh2/1.9.0
IPv6: 1
Run Code Online (Sandbox Code Playgroud)
我没有使用 Visual Studio 构建,而是使用 Clang 构建:
https://github.com/mstorsjo/llvm-mingw
另外我不确定到底是什么OpenSSL/1.1.1g (Schannel),我猜这意味着 OpenSSL 和 WinSSL 两者?如果不是这种情况,您可以使用以下命令自行构建 LibCurl CFG=-winssl:
https://github.com/nu8/gulf/blob/master/c-https/1-curl.ps1