Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Perl: API client processing responses
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Portage & Programming
View previous topic :: View next topic  
Author Message
Vieri
l33t
l33t


Joined: 18 Dec 2005
Posts: 898

PostPosted: Mon Oct 28, 2024 7:50 pm    Post subject: Perl: API client processing responses Reply with quote

Hi,

I need to write a Perl script that gets data from a server and processes all of it.

The following PoC code works OK when run without the sleep() call that simulates a call to a function that processes the data chunks received.


Code:
my $app_ua_request = HTTP::Request->new('POST' => $app_url);
$app_ua_request->header(
  'Content-Type' => 'application/x-www-form-urlencoded',
);
$app_ua_request->content($app_data);

my $app_ua_response = $app_ua->request($app_ua_request, sub {
 my ($chunk, $app_ua_response, $protocol) = @_;
 my $fromjson = from_json($chunk);
 my $app_response = $fromjson->{'response'};
 # process $app_response (simulate by sleeping)
 # sleep(10);
});

if ($app_ua_response->is_success) {
 print("replied all");
} else {
 print("reply error: ".$app_ua_response->status_line);
}


In a sample run, the "sub routine" is called exactly as many times as server replies are received.

However, if I enable the call to sleep() or the actual blocking function that processes the chunk data the "sub routine" is called just for the first 2 data chunks. The code execution then jumps to "is_success" and prints "replied all".
The Perl script is obviously receiving all of the server replies before each "sub routine" has a chance to finish.
Or maybe something's timing out in the meantime.

I'm using this to call the API service:

Code:
my $app_ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 });
$app_ua->agent($UA_string);
$app_ua->env_proxy;
$app_ua->conn_cache(LWP::ConnCache->new());
$app_ua->timeout(120);


The server takes more than 20 seconds but less than 120 to stop sending data.

What can I try?
If the code execution reaches "is_success", can I wait for all the "sub routines" to finish before exiting? How?

Regards,

Vieri
Back to top
View user's profile Send private message
turtles
Veteran
Veteran


Joined: 31 Dec 2004
Posts: 1687

PostPosted: Mon Oct 28, 2024 10:02 pm    Post subject: Reply with quote

Are you trying to process data as its being read/received from the server?

Seems like you need to have one function that makes the client request,
another that listens for response data from the server and stores it in a data structure.

and then a final function that does any processing to the stored data structure.
_________________
Donate to Gentoo
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Portage & Programming All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum