No, the UA here is part of the controller object that doesn't go out of 
scope. You're doing something else wrong but we can't see it from here.

In terminal 1, example.pl:
#!/usr/bin/env perl
use Mojolicious::Lite;

post '/' => sub {
  my $c = shift;
  $c->render(json => {message => "worked"});
};

app->start;

$ ./example.pl daemon -l "http://*:3000";

In terminal 2, caller.pl:
#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub {
    my $c = shift;
    $c->ua->post(
        'http://localhost:3000',
        sub {
            my ($ua, $tx) = @_;
            $c->app->log->debug($c->app->dumper($tx->res->json));
        }
    );

    $c->render(status => 200, data => "thanks");
};

app->start;

$ ./caller.pl daemon -l "http://localhost:3001";

In a 3rd terminal:

$ curl http://localhost:3001/
thanks

Logs for example:
$ ./example daemon -l "http://*:3000";
[Tue Apr 26 20:58:33 2016] [info] Listening at "http://*:3000";
Server available at http://127.0.0.1:3000
[Tue Apr 26 20:58:36 2016] [debug] POST "/"
[Tue Apr 26 20:58:36 2016] [debug] Routing to a callback
[Tue Apr 26 20:58:36 2016] [debug] 200 OK (0.000603s, 1658.375/s)

Logs for caller.pl:

$ ./caller daemon -l "http://localhost:3001";
[Tue Apr 26 20:56:44 2016] [info] Listening at "http://localhost:3001";
Server available at http://localhost:3001
[Tue Apr 26 20:58:36 2016] [debug] GET "/"
[Tue Apr 26 20:58:36 2016] [debug] Routing to a callback
[Tue Apr 26 20:58:36 2016] [debug] 200 OK (0.000994s, 1006.036/s)
[Tue Apr 26 20:58:36 2016] [debug] {
  "message" => "worked"
}

Working as advertised.

Scott

On Tuesday, April 26, 2016 at 6:29:48 PM UTC-6, Iván Aponte wrote:
>
> Hello,
>
> I just tried the way you suggest but got the same error. Seems to me that 
> UA goes out of scope and dies. Is there a way to prevent this
>
> Regards, 
>
> IA
>
> On Tuesday, April 26, 2016 at 7:39:19 PM UTC-4:30, Scott Wiersdorf wrote:
>>
>> Is there a reason you can't do something like this?:
>>
>> sub res1{
>>   my $c=shift;
>>   $c->ua->post('http://www.example.com', sub {
>>     my ($uax, $txx) = @_;
>>      $c->app->log->debug(Dumper($txx));
>>   });
>>
>>   $c->render(status=>200,data=>'');
>> }
>>
>> The way you're doing it, the transaction goes out of scope which is 
>> probably why you get the premature connection close. In the above example, 
>> the post() will return immediately, allowing the render() to execute next. 
>> The post() response will be handled asynchronously whenever it comes back. 
>>
>> Scott
>>
>> On Tuesday, April 26, 2016 at 5:57:17 PM UTC-6, Iván Aponte wrote:
>>>
>>>  Hello, 
>>>
>>> I have the following problem. I have a service which gets call, it must 
>>> answer with 200, close the connection and post to another web service. If I 
>>> do it in a non-blocking way premature closing occurs. 
>>>
>>> E.g. : 
>>>
>>> sub res1{
>>>   my $c=shift;
>>>    $c->render(status=>200,data=>'');
>>>    my $ua = Mojo::UserAgent->new;
>>>    my $tx = $ua->build_tx(POST => 'http//www.example.com');
>>>    $ua->start($tx=> sub{
>>>     my ($uax, $txx) = @_;
>>>      $c->app->log->debug(Dumper($txx));
>>>    });
>>> }
>>>
>>>
>>>
>>> Is there a way to make a post after rendering without blocking ?
>>>
>>>
>>> Thanks, 
>>>
>>> IA
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to