使用LWP时,在1and1服务器上运行的Perl会挂起

时间:2014-02-07 22:31:30

标签: perl

我正在使用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;

我已将问题隔离到请求调用,因此它必须是服务器配置。

1 个答案:

答案 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框架,如CatalystDancerMojolicious)。以下是使用CGI的方法:

use CGI;

my $q = CGI->new;
print $q->header('audio/mpeg');
# Do stuff
print $content;

这为您提供了parsing the query string的额外好处。