Debugging PayPal API中的CURLE_RECV_错误

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。一般的共识是,这种错误发生在网络出现问题时,所以我对此进行了调查 我从完全相

我已经开发了一个应用程序,它通过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
。一般的共识是,这种错误发生在网络出现问题时,所以我对此进行了调查

我从完全相同的服务器上使用命令行
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 ;