Debugging PayPal API中的CURLE_RECV_错误
我已经开发了一个应用程序,它通过libcurl连接到PayPal API,我通过Debian服务器上运行的进程的OCurl绑定来使用它。当在Paypal沙箱中时,代码始终有效(端点Debugging PayPal API中的CURLE_RECV_错误,debugging,curl,ocaml,paypal,ssl,Debugging,Curl,Ocaml,Paypal,Ssl,我已经开发了一个应用程序,它通过libcurl连接到PayPal API,我通过Debian服务器上运行的进程的OCurl绑定来使用它。当在Paypal沙箱中时,代码始终有效(端点https://api-3t.sandbox.paypal.com/nvp),但在连接到实际的Paypal服务器(端点https://api-3t.paypal.com/nvp) Libcurl始终返回CURLE\u RECV\u ERROR。一般的共识是,这种错误发生在网络出现问题时,所以我对此进行了调查 我从完全相
https://api-3t.sandbox.paypal.com/nvp
),但在连接到实际的Paypal服务器(端点https://api-3t.paypal.com/nvp
)
Libcurl始终返回CURLE\u RECV\u ERROR
。一般的共识是,这种错误发生在网络出现问题时,所以我对此进行了调查
我从完全相同的服务器上使用命令行curl
工具运行了完全相同的请求,使用了完全相同的进程uid/gid,并且始终有效。使用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
EDIT:通过增加libcurl的详细程度,我确定潜在错误如下:
GnuTLS recv error (-9): A TLS packet with unexpected length was received.
这一错误的原因可能是什么?我如何调查才能找到答案
编辑2:命令行和库使用之间的区别在于命令行版本链接到OpenSSL,库链接到GnuTLS
如何将两者链接到OpenSSL?我总是调用curl\set\u postfieldsize
来指定传递给curl\set\u postfields
的数据长度。那么,我的代码是:
let make_get url =
let curl = new Curl.handle in
curl#set_writefunction String.length; (* ignore result *)
curl#set_tcpnodelay true;
curl#set_verbose false;
curl#set_post false;
curl#set_url url;
curl
let make_post url =
let curl = make_get url in
curl#set_post true;
curl#set_httpheader [
"Content-Type: text/xml; charset=\"UTF-8\"";
"SOAPAction: \"\"";
];
curl#set_postfields xml;
curl#set_postfieldsize (String.length xml);
curl
我希望这会有所帮助。首先,进一步调试这些问题的关键是使用curl的调试工具,即VERBOSE设置(也可能是按您的方式打印数据的DEBUGFUNCTION设置) 这将错误确定为GnuTLS的一个问题,我们也讨论了这个问题,通过将SSLVERSION设置为3来强制使用SSLv3来解决这个问题
c # set_sslversion 3 ;
针对您安装的libcurl的OCurl链接。在我看来,libcurl和curl本身在版本号、配置和/或来源上有所不同。您是否尝试过刷新/重新编译libcurl?
c # set_sslversion 3 ;