Search code examples
perllwp

Kill current LWP request with CTRL + C


I have a script based on Term::ReadLine and LWP::UserAgent

The logic is like this,

while (defined ($_ = $term->readline('console> ')))
{
    next unless $_; chomp;

    if ($_ eq 'exit')
    {
        last;
    }
    &run ($_);
}

sub run {
    my $ua   = LWP::UserAgent->new;
    my $resp = $ua->get (...);

    say $resp->content;
}

In run it will do a LWP request. Now If I press CTRL + C, not only the LWP is terminated, the whole perl script is terminated as well.

I wanted to kill the LWP request only. Any ideas?

I can add a SIGINT handler, but I don't know what the handler should do


Solution

  • Convert the signal into an exception.

    local $SIG{INT} = sub { die "SIGINT\n" };
    

    Generally, one would then wrap the code in an eval BLOCK, but LWP::UserAgent catches these exceptions and returns an error response.

    For example,

    use LWP::UserAgent;
    my $ua = LWP::UserAgent->new();
    my $response = do {
       local $SIG{INT} = sub { die "SIGINT\n" };
       $ua->get("http://localhost/zzz.crx")
    };
    say $response->is_success ? "Successful" : "Unsuccessful";
    say $response->code;
    say $response->status_line;
    

    Output if no SIGINT received:

    Successful
    200
    200 OK
    

    Output if SIGINT received:

    Unsuccessful
    500
    500 SIGINT