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 { ... }
正しく動いているように見えても、いちどリファレンスを読み直すことは大事だと改めて実感した。