Perl代码报错Too many header lines,疑Cookie格式问题求排查
解决LWP请求中"Too many header lines (limit is 128)"的问题
问题根源
你猜的没错——这个错误确实是Cookie的传递格式不对导致的。
在你的原代码里,你把一长串用分号分隔的Cookie直接传给了get方法的Cookie参数,但LWP::UserAgent对这种写法的处理逻辑有问题:它会把每个分号分隔的键值对当成单独的HTTP请求头行来发送。你数一下你的Cookie有多少个键值对?十几二十个肯定有,再加上其他默认的请求头,很容易就超过Net::HTTP默认的128行限制,于是就触发了这个报错。
两种修复方案
方案1:用Cookie Jar管理(推荐)
LWP自带了HTTP::Cookies模块,专门用来管理Cookie,能自动处理格式问题,还能帮你维护Cookie的有效期、域名等属性,比手动拼接靠谱多了:
use HTTP::Request::Common qw(POST); use strict; use warnings; use LWP; use HTTP::Cookies; # 创建一个Cookie Jar对象 my $cookie_jar = HTTP::Cookies->new(); # 逐个添加Cookie键值对,参数依次是:版本、键、值、路径、域名等 $cookie_jar->set_cookie(0, 'incomerr_refid', '0', '/', '60606.com', undef, 0, 0, 86400, 0); $cookie_jar->set_cookie(0, 'ff_language_id', '3', '/', '60606.com', undef, 0, 0, 86400, 0); $cookie_jar->set_cookie(0, '_t_', '1', '/', '60606.com', undef, 0, 0, 86400, 0); $cookie_jar->set_cookie(0, 'fcode2', '4139', '/', '60606.com', undef, 0, 0, 86400, 0); # 把剩下的Cookie都按这个格式加进去... $cookie_jar->set_cookie(0, 'ping_last', '1527663675.939', '/', '60606.com', undef, 0, 0, 86400, 0); # 初始化UserAgent时绑定Cookie Jar my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5', cookie_jar => $cookie_jar ); my $res = $ua->get('http://60606.com/members/search'); print $res->content;
方案2:手动构造HTTP请求头
如果你不想用Cookie Jar,也可以直接构造HTTP::Request对象,把整个Cookie字符串作为单个请求头传递,这样LWP就不会拆分它了:
use HTTP::Request::Common qw(POST); use strict; use warnings; use LWP; my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5' ); # 直接创建GET请求,手动设置Cookie头 my $req = HTTP::Request->new(GET => 'http://60606.com/members/search'); $req->header( 'Cookie' => 'incomerr_refid=0; ff_language_id=3; _t_=1; fcode2=4139; ss_time=1527663671; PHPSESSID=otfmog35f0iva0uld1rgld2kj7; _webpush_key_=none; dinged_id=1412807; _language_id=3; _gnum_=950212; refid=1; first_key=TOCz19ls8HfkFW6LoBrIj35p4xSyYPVE; last_valid_url=https%3A//60606.com/login; ping_last=1527663675.939' ); my $res = $ua->request($req); print $res->content;
总结一下
原代码的问题在于:当你在$ua->get()的参数列表里写Cookie => 'xxx; yyy'时,LWP会错误地把这个字符串按分号拆分成多个请求头,导致行数超限。用Cookie Jar或者手动构造请求头的方式,就能让Cookie作为单个合法的HTTP头被发送,解决这个问题。
内容的提问来源于stack exchange,提问作者elizabeth williams
相关产品推荐
相关产品推荐

