CURLE_RECV_ERROR с PayPal API - PullRequest
       14

CURLE_RECV_ERROR с PayPal API

3 голосов
/ 26 августа 2011

Я разработал приложение, которое подключается к API PayPal с помощью libcurl, которое я использую через привязки OCurl для OCaml из процесса, запущенного на сервере Debian. Код всегда работает внутри песочницы Paypal (конечная точка https://api-3t.sandbox.paypal.com/nvp), но никогда не работает при подключении к реальным серверам Paypal (конечная точка https://api-3t.paypal.com/nvp).

Libcurl всегда возвращает CURLE_RECV_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

РЕДАКТИРОВАТЬ: Увеличив многословность libcurl, я определил, что основная ошибка заключается в следующем:

GnuTLS recv error (-9): A TLS packet with unexpected length was received.

Что может быть причиной этой ошибки? Как я могу провести расследование, чтобы выяснить это?

РЕДАКТИРОВАТЬ 2: Похоже, что разница между использованием командной строки и библиотеки заключается в том, что версия командной строки связана с OpenSSL, а библиотека связана с GnuTLS.

Как мне связать оба с OpenSSL?

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Во-первых, ключом к дальнейшей отладке этих проблем является использование средств отладки curl, а именно настройки VERBOSE (а также, возможно, настройки DEBUGFUNCTION для печати данных на вашем пути).

c # set_verbose true ;

Это идентифицировало ошибку как проблему с GnuTLS, которая также обсуждается здесь , и которая решается установкой SSLVERSION на 3 для принудительного использования SSLv3.

c # set_sslversion 3 ;
0 голосов
/ 27 августа 2011

Я всегда называю 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

Надеюсь, это поможет.

...