Using Perl PayPal API on Debian wheezy

Bradley M. Kuhn's Blog ( bkuhn ) 2015-10-13

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) = 1365        rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0        rt_sigaction(SIGALRM, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0        rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0        rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0        rt_sigaction(SIGALRM, {0xxxxxx, [], 0}, {SIG_DFL, [], 0}, 8) = 0        rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0        alarm(60)                               = 0        read(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) = 1373        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)        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::HTTPS will prefer to use IO::Socket::SSL. I don't know how to get SOAP::Lite to work with IO::Socket::SSL (e.g., Crypt::SSLeay uses HTTPS_* environment variables), 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.

Link:

http://ebb.org/bkuhn/blog/2013/10/07/paypal-perl.html

From feeds:

Gudgeon and gist » Bradley M. Kuhn's Blog ( bkuhn )

Tags:

Authors:

bkuhn@ebb.org (Bradley M. Kuhn)

Date tagged:

10/13/2015, 18:12

Date published:

10/07/2013, 22:00