[英]«HTTP::Message content must be bytes» error when trying to post
我有以下代码:
...
sub setImage {
my $self=shift;
my $filename=shift;
unless(-r $filename) {
warn "File $filename not found";
return;
}
my $imgn=shift;
my $operation=&URI::Escape::uri_escape_utf8(
(shift) ? "Удалить! (Delete)" : "Сохранить! (Store)");
my $FH=&::File::open($filename, 0, 0);
my $image;
# &utf8::downgrade($image);
sysread($FH, $image, 102400, 0);
close $FH;
my $imginfo=eval{&Image::Info::image_info(\$image)};
if($@ or $imginfo->{"error"}) {
warn "Invalid image: ".($@ || $imginfo->{"error"});
return undef;
}
my $fields=[
DIR => $self->url("fl"),
OPERATION => $operation,
FILE_NAME => ".photo$imgn",
# FILE => [$filename],
FILE => [undef, "image.".$imginfo->{"file_ext"},
# Content_Type => $imginfo->{"file_media_type"},
# Content_Type => 'application/octet-stream',
Content => $image,
],
];
my $response=&ZLR::UA::post(
&ZLR::UA::absURL("/cgi-bin/file_manager")."",
$fields,
Content_Type => "form-data",
);
print $response->decoded_content;
}
...
当我尝试使用setImage函数时,它失败并出现错误HTTP::Message content must be bytes at /usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Request/Common.pm line 91
。 更糟糕的是,如果不使用所有代码就无法重现此错误,并且升级libwww-perl不会执行任何操作。 是什么原因造成的?
libww-perl的版本:dev-perl / libwww-perl-5.836。 HTTP :: Request和HTTP :: Request :: Common来自libwww-perl软件包,版本:5.827和5.824。
跟踪:
HTTP::Message content must be bytes at /usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Request/Common.pm line 91
at Carp::croak(unknown source)
at HTTP::Message::__ANON__(/usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Message.pm:16)
at HTTP::Message::_set_content(/usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Message.pm:136)
at HTTP::Message::content(/usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Message.pm:125)
at HTTP::Request::Common::POST(/usr/lib64/perl5/vendor_perl/5.8.8/HTTP/Request/Common.pm:91)
at LWP::UserAgent::post(/usr/lib64/perl5/vendor_perl/5.8.8/LWP/UserAgent.pm:397)
at ZLR::UA::post(./zlrchecker.pl:71)
at ZLR::Info::setImage(./zlrchecker.pl:1754)
at main::main(./zlrchecker.pl:3893)
at main::(./zlrchecker.pl:4148)
使用Devel :: SimpleTrace并粘贴跟踪。 使用cpan安装模块。 然后使用-MDevel::SimpleTrace
像perl -MDevel::SimpleTrace ./myapp_run.pl
一样运行程序perl -MDevel::SimpleTrace ./myapp_run.pl
并粘贴HTTP::Request:Common
, HTTP::Message
和LWP
。
我的猜测是您会在堆栈跟踪中看到以下内容:
这似乎是可能导致错误的代码 :
*_utf8_downgrade = defined(&utf8::downgrade) ?
sub {
utf8::downgrade($_[0], 1) or
Carp::croak("HTTP::Message content must be bytes")
}
:
sub {
};
utf8中的文档这样说:
如果原始UTF-X序列无法以本机8位编码表示,则失败。 失败时终止,或者如果FAIL_OK的值为true,则返回false。
您应该可以通过运行utf8::downgrade($http_message_content)
我发现此问题的一种有效解决方案是在HTTP请求期间,通过Text::Unidecode
unidecode()
解析我们放入HTTP :: Message的任何文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.