2011-08-26 111 views
3

我开发了一个应用程序,它通过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?

+0

OCurl与您安装的任何libcurl链接。在我看来,你的libcurl和curl在版本号,配置和/或来源方面有所不同。你有刷新/重新编译libcurl吗? – 2011-08-27 11:30:36

回答

1

首先,进一步调试这些问题的关键是使用curl的调试工具,即VERBOSE设置(也可能是用于按照您的方式打印数据的DEBUGFUNCTION设置)。

C# set_verbose true ; 

此识别的误差为与该的GnuTLS还讨论here一个问题,这是由设置SSLVERSION至3来强制使用的SSLv3的解决。

C# set_sslversion 3 ; 
0

我总是打电话给curl#set_postfieldsize去传递给curl#set_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 

我希望这可以帮助。

+0

感谢您的建议,恐怕这不会改变任何内容...... –