我开发了一个应用程序,它通过libcurl连接到PayPal API,我通过运行在Debian服务器上的进程通过OCurl绑定OCaml来使用它。该代码在Paypal沙箱内(端点https://api-3t.sandbox.paypal.com/nvp
)内始终有效,但在连接到实际的Paypal服务器(端点https://api-3t.paypal.com/nvp
)时从不运行。CURLE_RECV_ERROR with PayPal API
Libcurl始终返回CURLE_RECV_ERROR
。普遍的共识是,这个错误发生在有网络问题时,所以我调查了这一点。
我使用完全相同的进程uid/gid运行完全相同的服务器上的命令行curl
工具的完全相同的请求,并且它始终如一地运行。使用tcpdump
跟踪传输不会显示任何重要的由工作命令行curl
和非工作应用程序所做的事务结构的差异,所以看起来好像在两种情况下都成功执行HTTP请求。再次,它是HTTPS,所以我不能确定。
这里是执行请求OCaml的代码:
let c = new Curl.handle in
let buffer = Buffer.create 1763 in
C# set_url "https://api-3t.paypal.com/nvp" ;
C# set_post true ;
C# set_postfields "SOMEDATA" ;
C# set_postfieldsize (String.length "SOMEDATA") ;
C# set_writefunction (fun x -> Buffer.add_string buffer x ; String.length x) ;
C# perform ;
C# cleanup ;
Buffer.contents buffer
这里是等效curl
命令行:
curl -X POST https://api-3t.paypal.com/nvp -d SOMEDATA
编辑:通过增加的libcurl冗长,我判断为潜在的错误是这样的:
GnuTLS recv error (-9): A TLS packet with unexpected length was received.
这个错误的原因是什么?我如何进行调查以找出答案?
编辑2:看起来,命令行和库使用的区别在于,命令行版本链接到OpenSSL并且库链接到GnuTLS。
我该如何链接到OpenSSL?
OCurl与您安装的任何libcurl链接。在我看来,你的libcurl和curl在版本号,配置和/或来源方面有所不同。你有刷新/重新编译libcurl吗? – 2011-08-27 11:30:36