本当にただのメモ

なるべく Qiita に投稿しよう

Perl で標準モジュールだけで http request したいとき

  • なんと LWP::UserAgent は非 core module
  • HTTP::Tiny が core module なんだけど、SSL 通信をするには IO::Socket::SSL (非 core module )が必要なので、実質使えない
  • 仕方ないので Perl のスクリプト内で curl を呼んだ ...
use IPC::Cmd qw(run can_run);

sub exec_curl {
    my ($curl_cmd) = @_;

    unless (can_run('curl')) {
        croak 'curl is not installed';
    }
    my $cmd = qq|$curl_cmd -w "%{http_code}"|;

    my ($success, $error, $buffers) = run(command => $cmd, verbose => 0);
    my $buffer = join '', @$buffers;

    unless ($success) {
        croak "failed to exec curl. error: $error, buffer: $buffer";
    }

    $buffer =~ s/([0-9]+)$//;
    my $status_code = $1;
    if ($status_code !~ /^2/) {
        croak "failed to fetch. status code: $status_code, buffer: $buffer";
    }

    return $buffer;
}