我正在使用1and1 Windows基本主机软件包,我正在尝试运行一些perl:
#generate header
my $h = HTTP::Headers->new(
Content_type => 'audio/mpeg'
);
print $h->as_string;
#parse querystring
if (length ($ENV{'QUERY_STRING'}) > 0){
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs){
($name, $value) = split(/=/, $pair);
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
}
#generate url to GET
$url = 'http://translate.google.com/translate_tts?tl=en&q=' . $in{'q'};
use LWP::UserAgent;
#get file
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36');
my $req = new HTTP::Request GET => "$url";
#$req->header('Accept' => 'text/html');
my $res = $ua->request($req);
my $content = $res->content;
print $content;
基本上只是尝试检索音频文件并打印出来。
当我在本地运行它时,我没有问题。但是,当我在我的共享服务器(我没有命令行访问权限)上运行它时,它只是挂起而页面将无法加载。
是否有人处理过此问题,或者我可以做些什么来调试它?还有其他方法我可以做到这一点吗?
编辑:更新代码:
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $q = CGI->new;
print $q->header('audio/mpeg');
#generate url to GET
#my $val = $q->param('q');
my $val = "test";
my $url = 'http://translate.google.com/translate_tts?tl=en&q=' . $val;
use LWP::UserAgent;
#get file
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36');
my $req = new HTTP::Request GET => "$url";
my $res = $ua->request($req); #hangs here
my $content = $res->content;
print $content;
我已将问题隔离到请求调用,因此它必须是服务器配置。
答案 0 :(得分:1)
HTTP spec规定响应标题和正文之间必须有一个空行。当你跑:
my $h = HTTP::Headers->new(Content_type => 'text/html');
print $h->as_string;
print "foo";
你得到:
Content-Type: text/html
foo
当你需要的是:
Content-Type: text/html
foo
您可以通过在命令行上运行脚本来验证这一点。我建议您使用CGI.pm生成回复标题(甚至更好,一个现代的Web框架,如Catalyst,Dancer或Mojolicious)。以下是使用CGI的方法:
use CGI;
my $q = CGI->new;
print $q->header('audio/mpeg');
# Do stuff
print $content;
这为您提供了parsing the query string的额外好处。