Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: HTTP::Tiny losing headers for Stripe

by hippo (Bishop)
on Jun 26, 2022 at 11:43 UTC ( [id://11145071]=note: print w/replies, xml ) Need Help??


in reply to HTTP::Tiny losing headers for Stripe

I would output the arguments to the second post_form call just before it occurs. It may be that something behind the scenes has messed with $headers for example, since it is a reference.

Without the first call, the second call to Stripe gives an error because I haven't got the parameters right. But it doesn't complain about there not not being an API key

I would also try to fix this first. This problem may be masking others and resulting in the odd response you currently see. Once you can make the second call in isolation without any error then you can be more sure of the rest of the script.


🦛

Replies are listed 'Best First'.
Re^2: HTTP::Tiny losing headers for Stripe
by Bod (Parson) on Jun 26, 2022 at 12:22 UTC
    I would output the arguments to the second post_form call just before it occurs.

    Bingo! - Thank you very much hippo

    That explains what is going wrong...the authorization parameter is missing...

    It doesn't explain why it is going wrong.

    Using this code:

    print "Content-type: text/plain\n\n"; my $headers = { 'headers' => { 'Authorization' => 'Bearer ' . $Site::Variables::stripe_secret +, }, 'agent' => 'Wayfinder/v3.0', }; my $sub_id = 'sub_xxxxxx'; print Dumper $headers; print "\n\n--------------\n\n"; # This line is the culprit... my $res = $http->post_form("https://api.stripe.com/v1/subscriptions/$s +ub_id", {}, $headers); print Dumper $headers; print "\n\n--------------\n\n";

    I get this output:

    $VAR1 = { 'headers' => { 'Authorization' => 'Bearer sk_test_abc123' }, 'agent' => 'Wayfinder/v3.0' }; -------------- $VAR1 = { 'agent' => 'Wayfinder/v3.0' }; --------------

    Somehow the $header is being changed during the first call. I see nothing in the documentation for HTTP::Tiny to explain this.

    In the short-term I can work around the problem by recreating $header between calls to Stripe. But it's not a very good solution.

    I would also try to fix this first

    Ordinarily, I would have fixed the API call first. However, the call requires data from the first call in order to work. Hence the need for two calls to the API.

      Nothing in the HTTP::Tiny docs but it is in the code:
      # line 239 sub post_form { my ($self, $url, $data, $args) = @_; # ... delete $args->{headers};

      The request() method doesn't seem to do this deletion.

        ...but it is in the code

        Well spotted tangent
        I'm sure there was a reason for this behaviour but it does seem very odd!

        All my calls to Stripe are in a dedicated module and this has now been modified to get around this issue. The headers are cloned to create a deep copy immediately before the API calls and therefore the original headers don't get clobbered. I've done this with all calls in case any future script makes multiple calls for any reason.

        use HTTP::Tiny; use Clone qw(clone); my $http = HTTP::Tiny->new; my $headers = { 'headers' => { 'Authorization' => 'Bearer ' . $Site::Variables::stripe_secret +, }, 'agent' => 'Wayfinder/v3.0', }; # for each API call my $head = clone($headers); my $response = $http->post_form($stripe_api_url, $payload, $head);

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11145071]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (1)
As of 2024-04-25 04:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found