0

この記事は、 LWP GET の大きなファイルのダウンロードに関する作業の続きです。その投稿は、ヘッダーで引数を誤って渡そうとしたときの LWP からのエラーに関するものでした。今、私が行った変更と、アプローチをデバッグしようとしている方法を投稿しています。この議論は、POST と GET ヘッダーの形成、および CGI パッケージの使用中にサーバーが受け取るものに関心のある人にとって非常に有益です。ネットで簡単に見つけられる情報ではありません。

これが私のクライアントコードスニップです:

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 ダンプで「キー」/「値」のペア、つまり「ターゲット => random23」を確認できます。GET ダンプでは、クライアント側で送信したキーや値が見つかりません。それを説明できますか、または CGI スクリプトでキーと値のペアを抽出するために何をする必要がありますか?

4

1 に答える 1

1

フォーム変数を HTTP ヘッダーとして渡しています。

前述したように、URL を作成する場合はURIを使用できます。

$url = URI->new($url);
$url->query_form(
   api    => 'olfs',
   cmd    => 'rfile',
   target => $target,
   bs     => $bs,
);
于 2013-10-31T20:58:08.583 に答える