Using Perl PayPal API on Debian wheezy
Bradley M. Kuhn's Blog ( bkuhn ) 2013-10-08
Summary:
I recently upgraded to Debian wheezy. On, Debian squeeze, I had no problem using the stock Perl module Business::PayPal::API
to import PayPal transactions for Software Freedom Conservancy, via the Debian package libbusiness-paypal-api-perl
.
After the wheezy upgrade, something goes wrong and it doesn't work. I reviewed some similar complaints, that seem to relate to this resolved bug, but that wasn't my problem, I don't think.
I ran strace to dig around and see what was going on. The working squeeeze install did this:
select(8, [3], [3], NULL, {0, 0}) = 1 (out [3], left {0, 0})write(3, "SOMEDATA"..., 1365) = 1365rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0rt_sigaction(SIGALRM, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0rt_sigaction(SIGALRM, {0xxxxxx, [], 0}, {SIG_DFL, [], 0}, 8) = 0rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0alarm(60) = 0read(3, "SOMEDATA", 5) = 5
But the same script on wheezy did this at the same point:
select(8, [3], [3], NULL, {0, 0}) = 1 (out [3], left {0, 0})write(3, "SOMEDATA"..., 1373) = 1373read(3, 0xxxxxxxx, 5) = -1 EAGAIN (Resource temporarily unavailable)select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)read(3, 0xxxxxxxx, 5) = -1 EAGAIN (Resource temporarily unavailable)select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)read(3, 0xxxxxxxx, 5) = -1 EAGAIN (Resource temporarily unavailable)select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)read(3, 0xxxxxxxx, 5) = -1 EAGAIN (Resource temporarily unavailable)
I was pretty confused, and basically I still am, but then I noticed this in the documentation for Business::PayPal::API
, regarding SOAP::Lite
:
if you have already loaded Net::SSLeay (or IO::Socket::SSL), then Net::HTTPSwill prefer to use IO::Socket::SSL. I don't know how to get SOAP::Lite towork with IO::Socket::SSL (e.g., Crypt::SSLeay uses HTTPS_* environmentvariables), so until then, you can use this hack: local $IO::Socket::SSL::VERSION = undef;
That hack didn't work, but I did confirm via strace that on wheezy, IO::Socket::SSL
was getting loaded instead of Net::SSL
. So, I did this, which was a complete and much worse hack:
use Net::SSL;use Net::SSLeay;$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;# Then:use Business::PayPal::API qw(GetTransactionDetails TransactionSearch);
… And this incantation worked. This isn't the right fix, but I figured I should publish this, as this ate up three hours, and it's worth the 15 minutes to write this post, just in case someone else tries to use Business::PayPal::API on wheezy.
I used to be a Perl expert once upon a time. This situation convinced me that I'm not. In the old days, I would've actually figured out what was wrong.
