LWP::UserAgent の POST メソッドと 414 Request-URI Too Large コード

LWP::UserAgent の POST メソッドの間違った使い方

LWP::UserAgent の POST メソッドの間違った使い方をしていたため、レスポンスに「414 Request-URI Too Large」が返ってくる原因に気が付かなかった。

問題だったコード

#!/user/bin/env perl
use strict;
use warnings;
use URI;
use LWP::UserAgent;
use utf8;

my $base_url = 'http://www.example.com/post.cgi';
my $uri = URI->new($base_url);
$uri->query_form(
    name    => 'John Doe',
    mail    => 'john_doe@example.com';
    comment => 'ABCD....', # すごく長い文字列
);

my $ua = LWP::UserAgent->new;
my $response = $ua->post($uri);
if ($response->is_success) {
    ...
} else {
    # ここで 414 Request-URI Too Large が返ってきていた
    print $response->code, "\n";
    die $response->status_line;
}

上記のコードはリクエストパラメーターの「comment」が小さいサイズならば、問題なく動いてしまう(当然といえば、当然)ので、問題の切り分けに手間取った。
たまたま LWP::UserAgent のコードをよく読んでみようと思い調べてみたら、自分のコードが間違っていることに気が付いた。

あるべき正しいコード

#!/user/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;
use utf8;

my $base_url = 'http://www.example.com/post.cgi';

my $ua = LWP::UserAgent->new;
my $response = $ua->post($base_url, {
    name    => 'John Doe',
    mail    => 'john_doe@example.com';
    comment => 'ABCD....', # すごく長い文字列
});

if ($response->is_success) {
    # comment に長い文字列を入れても正しく動くようになった
    do_something;
    ...
} else {
    ...
}

正しく動いているように見えても、いちどリファレンスを読み直すことは大事だと改めて実感した。