2014-02-07 52 views
0

我使用的1and1的Windows基本主機包,我試圖運行一些Perl時掛起:的Perl的1and1服務器上運行使用LWP

#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

至少,使用[CGI.pm](http://perldoc.perl.org/CGI.html),所以你不必自己解析查詢字符串。另外,你從來沒有聲明'%in',所以你要麼從你的代碼片段中省略,要麼不用'use strict;使用警告;'。 – ThisSuitIsBlackNot

+1

至於調試,你有權訪問你的Web服務器的錯誤日誌嗎?這永遠是第一個看的地方。你也可以'使用CGI :: Carp qw(fatalsToBrowser);'直接向瀏覽器輸出錯誤信息(儘管如此,不要在生產環境中執行此操作)。 – ThisSuitIsBlackNot

+2

可能您的主機不允許傳出連接。這些共享託管公司通常對他們的帶寬非常認真。閱讀他們的條款和支持頁面,他們可能會有一個常見問題或有關這個。如果是這種情況,您應該嘗試使用客戶端解決方案,如AJAX。 – foibs

回答

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來生成您的響應標頭(或者更好,像CatalystDancerMojolicious這樣的現代web框架)。下面是如何使用CGI做到這一點:

use CGI; 

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

這有parsing the query string對你的好處。

+0

我會接受這種解決方案,因爲如果我能夠讓所有其他解決方案工作,這可能會成爲一個問題。 – nondefault

相關問題