Я разработал приложение, которое подключается к 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?