2013-10-31 26 views
0

这篇文章是关于LWP GET large file download的相关工作。这篇文章是关于尝试在头中错误地传递参数时LWP的错误。现在我发布了我所做的更改以及我如何尝试调试该方法。这个讨论应该对那些对POST和GET头信息感兴趣的人以及服务器在使用CGI包的时候收到的信息很有帮助。这不是网上很容易找到的信息。LWP获取大文件下载头部丢失

这里是我的客户端代码剪断:

my $bytes_received = 0; # vars used below are set prior to this point 
my $filename = $opt{t}."/$srcfile"; 
open (FH, ">", "$filename") or $logger->error("Couldn't open $filename for writing: $!"); 
my $ua = LWP::UserAgent->new(); 
my $target = $srcfile; 
my $res = $ua->get(
    $url, 
    ':content_cb' => \&callback, 
    'api' => 'olfs', # Note attempted use of different types of quotes had no impact 
    "cmd" => 'rfile', 
    "target" => $target, 
    "bs" => $bs 
    ); 

    print $logger->info("$bytes_received bytes received"); 

sub callback{ 
    my($chunk, $res) = @_; 
    $bytes_received += length($chunk); 
    print FH $chunk; 
} 

这里是服务器剪断(CGI脚本):

my $query = new CGI; 
my $rcvd_data = Dumper($query); 
print $rcvd_data; 

这里是一个GET输出:

$VAR1 = bless({ 
       '.parameters' => [], 
       'use_tempfile' => 1, 
       '.charset' => 'ISO-8859-1', 
       '.fieldnames' => {}, 
       'param' => {}, 
       '.header_printed' => 1, 
       'escape' => 1 
       }, 'CGI'); 

这里是一个POST请求的客户端:

my $ua = new LWP::UserAgent(); 
local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1; 

    my $req = 
    POST 
    $url, 
    'Content_Type' => 'form-data', 
    'Content' => { 
     "api" => 'olfs', 
     "cmd" => 'wfile', 
     "target" => $target, 
     "tsize" => $file_size, 
     "bs" => $bs, 
     "filename" => [ $file ] }; 

# HTTP::Message calls set_content, which appears to set the subroutine for content 
# LWP::UserAgent 
# LWP::Protocol::file::request sends content in chunks 
# 

    $req->content($req->content()); 
    $logger->info("Uploading: $file"); 
    my $resp = $ua->request($req); 

这里是服务器上的输出,就像从POST之前,但现在:

  '.parameters' => [ 
          'cmd', 
          'bs', 
          'api', 
          'target', 
          'filename', 
          'tsize' 
          ], 
     'use_tempfile' => 1, 
     '.tmpfiles' => { 
          '*Fh::fh00001random23' => { 
                 'info' => { 
                    'Content-Type' => 'text/plain', 
                    'Content-Disposition' => 'form-data; name="filename"; filename="random23"' 
                   }, 
                 'name' => bless(do{\(my $o = '/usr/tmp/CGItemp33113')}, 'CGITempFile'), 
                 'hndl' => bless(\*Fh::fh00001random23, 'Fh') 
                } 
         }, 
     '.charset' => 'ISO-8859-1', 
     '.fieldnames' => {}, 
     'param' => { 
         'cmd' => [ 
           'wfile' 
           ], 
         'bs' => [ 
           'buffer1' 
           ], 
         'api' => [ 
           'olfs' 
           ], 
         'target' => [ 
            'random23' 
            ], 
         'tsize' => [ 
            '1073741824' 
           ], 
         'filename' => [ 
             $VAR1->{'.tmpfiles'}{'*Fh::fh00001random23'}{'hndl'} 
        }, 
     'escape' => 1, 
     '.header_printed' => 1 
     }, 'CGI'); 

总之,你可以在POST看到倾倒的“钥匙” /“值”对,即“target => random23”。在GET转储中,我没有发现我在客户端提交的任何键或值。可以解释一下,或者我需要做些什么来提取CGI脚本中的键/值对?

回答

1

您将表单变量作为HTTP标头传递。

就像我之前提到的,如果你想建立一个url,你可以使用URI

$url = URI->new($url); 
$url->query_form(
    api => 'olfs', 
    cmd => 'rfile', 
    target => $target, 
    bs  => $bs, 
); 
+0

是的,这有效。谢谢。使用POST可以将参数添加到“内容”,而由于GET没有“内容”,您必须构建一个URI。所有的URI类正在做的是将通常为浏览器URI所做的&key = value结构放在一起。 – tradetree