• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LWPのPOSTでバイナリが壊れる)

LWPのPOSTでバイナリが壊れる

taknak08の回答

  • ベストアンサー
  • taknak08
  • ベストアンサー率50% (8/16)
回答No.4

何度もすみません、そして誤ったことを書いてしまいました。 No.3で用いた「CGI」は、他テスト用のもので、tasekiさん作成のcheck.cgiではありませんでした。 (なぜ「Internal Server Error」を返したのかはまだ調べていませんが・・・) tasekiさん作成のcheck.cgiに向けて、HTTP/HTTPS および use utf-8あり/なし でPOSTしてみたところ、CGI、POSTスクリプトともすべてOKとなりました。 そして「HTTPS で use utf-8あり」の場合のみ、request_body.datのMD5値が異なりました。 (なおrequest_body.datのサイズはいずれのケースでも同じでした) 以上訂正いたします。

taseki
質問者

お礼

taknak08さん、本当にありがとうございます。 おかげ様で(根本的な解決ではありませんが)バグの所在など分かり疑問も晴れました。 Internal Server Errorそのものは問題ありません。壊れたデータをバイナリエディタなどで見れば解るのですが、boundaryも壊れるので、POSTデータの解析&復元自体が失敗します。その場合にInternal Server Errorを返すかどうかはそのスクリプト次第ですから、お使いになったテストスクリプトがそうだっただけで、私が書いたcheck.cgiは解析&復元をせずにそのままファイルに書き込むだけなので、つまり壊れていようが何だろうが内容には一切関知しないので常にOKを返します。 そんなわけで、結果として、やはりutf8フラグのついたデータをSSLエンコードするときに壊れた、という推測がビンゴ!だったようですね。 そしてさらに判ったことは、taknak08さんの環境でも発生したということは、すなわち少なくともCrypt::SSLeayは無関係だった可能性が高い、という点です。 おそらく、前にも書いたようにwgetなどは問題ないので、これはLWP周りだと思います。 ハンドラの受け渡しLWP::Protocol::httpsあたりでフラグを落としていないのが原因なのかな、と推測していますが、もうそのあたりはメンテナさんに任せるとして、暫定策としてPOSTする前に呼ぶ側でフラグを落とせば良さそうです。 この問題が起きる可能性の盲点として、多く使われているであろうWWW::MechanizeとかでHTML::Formにて日本語などのページを解析する際で、HTMLフォームをutf8つきで取得、そのままPOST、なんてやると、この問題が起きますね。 しかも、そんなのに遭遇した人は、原因にたどり着くまで長そうです…。 本当に助かりました。ありがとうございます。 一応もう少し情報を待ってみてから、このスレッドは閉じたいと思います。 (ちなみに、CPANにレポートしたのは…以下略)

関連するQ&A

  • LWPモジュールでログインしHTML取得

    use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $url = 'https://toto.netbk.co.jp/main/smm0100'; my %formdata = ('userName' => 'ID', 'loginPwdSet' => 'Pass'); my $request = POST($url,[%formdata]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); $ua->ssl_opts(verify_hostname => 0); my $res = $ua->request($request); print $res->as_string; サポートされないブラウザーで弾かれます 解決策、教えてください

  • LWPでPOST送信した後に送信先に移動したい

    LWPで別サーバーのtest.cgiに以下のようなコードで POST送信しています。 use HTTP::Request::Common; use LWP::UserAgent; $query="param1=dummy"; $ua = LWP::UserAgent->new(); $req = HTTP::Request->new(POST => "http://xxx.xxx.xxx/test.cgi"); $req -> content_type('application/x-www-form-urlencoded'); $req -> content($query); $res = $ua->request($req); $success = $res -> is_success; if(!$success){ die("error"); } $con = $res -> content; この場合、$conにtest.cgiの出力が入るだけで、 URLのhttp://xxx.xxx.xxx/test.cgiに遷移することはできません。 HTMLのformタグでPOST送信したときのように、 POSTでデータを送信してかつ、その送信先に移動するということはできるのでしょうか。 LWPでなくてもいいです。 要するにHTMLのformタグでのPOST送信を手動ではなく、自動で行いたいわけですが、 <form action="http://xxx.xxx.xxx/test.cgi" method="post"> <input type="hidden" name="param1" value="dummy"> </form> このようなタグのあるHTMLを表示して、 JavaScriptでonLoadでsubmitすればできるのですが、 JavaScriptを使っているとSSLの場合にセキュリティのアラートがでる場合があるので、 できればPerlだけでできないかと思ったのです。

  • バイナリファイルのアップロードに関して

    今回質問させて頂くことに関連した問題を、現在MySQLのカテゴリで質問させていただいているのですが、 バイナリファイルをアップロードし、そのファイルのバイナリデータを変数($img)に格納し、それをDBに格納するという形を目指しています。しかし、DBにどうしても格納できません。もしやバイナリデータを変数に格納する時点で、既におかしいのかと思いまして、その部分についてこちらでご教授頂きたく書き込ませていただきました。 #!C:\Perl use CGI; use DBI; $PCMOJPATH='C:\パス名'; #ディレクトリ指定 my ($buffer); my $query = new CGI; $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; #ファイル名 print "Content-type: text/html\n\n"; print "<html><body>\n"; my $fH = $query->upload('filename'); my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; open (OUT, ">$PCMOJPATH/$newfile"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; $img .= $buffer;   #バイナリデータを$imgに格納 } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$PCMOJPATH/$newfile"); ------------------------- と書いているのですが、$imgにはバイナリデータがちゃんと入っていないのでしょうか?間違っているところがあれば、どのように直したらいいか教えてください。どうぞよろしくお願いします。

  • LWPで意図したhtmlがダウンロード出来ない

    LWPライブラリを使ってhtmlソースをダウンロードし たいのですが、指定したURLを、ブラウザを使って閲 覧できる内容と、異なるhtmlソースがLWPでは取得さ れてしまい、困っています。 具体的にはSGD(http://www.yeastgenome.org)内の (http://db.yeastgenome.org/cgi-bin/SGD/locus.pl? locus=ACE2)で表示される内容の、htmlソースが欲し いのですが、何故かlocus.plスクリプト自体がダウ ンロードされてしまいます。IEなどで[名前をつけて 保存]した場合には、希望のhtmlソースが得られるの ですが... ソースコードは以下の通りです。 use strict; use LWP::UserAgent; &get_entry("ACE2.html"); sub get_entry { my($outfile_name) = @_; my $ua = new LWP::UserAgent; $ua->agent("AgentName/0.1 " . $ua->agent); my $req = new HTTP::Request POST => 'http://db.yeastgenome.org/cgi-bin/SGD/locus.pl?locus=ACE2'; $req->content_type('application/x-www-form-urlencoded'); $req->content('started=1&match=www&errors=0&searchstring=CLN3'); my $res = $ua->request($req); unless($res->is_success) { die "Bad luck this time : "; } open(F, "> ".$outfile_name) || die "file open error :"; print F $res->content; close(F); $res->content; }

    • ベストアンサー
    • Perl
  • LWPでsubmitさせる方法

    http://xxxx.xxxx.jp/index.htmlにhttp://xxxx.xxxx.jp/submit.cgiからアクセスして subimitさせたいのですが、下記のcgiだとError: 405 Method Not Allowed と出てしまいます。 formの名前の指定とsubmitの指定方法が分かりません。何方か詳しい方ご教授お願いします。 **** http://xxxx.xxxx.jp/index.html *****  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <SCRIPT language="JavaScript"> <!-- function test(){ var test = document.Myform.ttt.value; alert(test); } //--> </SCRIPT><TITLE></TITLE> </HEAD> <BODY> <FORM name="Myform"><INPUT size="20" type="text" name="ttt"><INPUT type="button" value="送信" onclick="test()"></FORM> </BODY> </HTML> **** http://xxxx.xxxx.jp/submit.cgi ***** #!/usr/bin/perl use lib "lib"; use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $url = 'http://xxxx.xxxx.jp/index.html'; my %formdata = ('ttt' => 'hellow'); my $req = POST($url, [%formdata]); $req->header( 'Accept' => 'text/html', 'User_Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) ', 'Referer' => 'http://ranks1.apserver.net/share/regist.php?u=pinkpanty2', ); my $ua = LWP::UserAgent->new; my $res = $ua->request( $req ); print "Content-type: text/html;\n\n"; if ($res->is_success) { print $res->content; } else { print "Error: " . $res->status_line . "\n"; } exit();

    • ベストアンサー
    • Perl
  • LWPで応答データを取得できない

    お世話になります。 perl5でLWPを使用しているのですが、一部のサイトでデータを取得できず困っております。 具体的には my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); my $req = HTTP::Request->new(GET => "http://misshiki.blog7.fc2.com/?xml"); my $res = $ua->request($req); my $buf = $res->content; といった感じでRSSを取得したいのですが、$bufが空になってしまいます。 しかし、 $res->as_string とすると、レスポンスヘッダも含めてRSSが取得できていることが確認できます。 また、上記以外のURLでは正常に$res->contentでデータを取得することができています。 どうもFC2ブログのRSSのみの事象のようではあるのですが、対処方法がわからず困っております。 対策をご教授いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • LWPでヘッダー情報をあらかじめ取得したい

    例えば、下記のようなスクリプトの場合、一度画像が保存された後、ファイルサイズをを抜き出すようになります。 ダウンロード前に、ファイルサイズをあらかじめ知りたいのですがどのようにしたら良いでしょうか? use strict; my $url = "http://img.www.goo.ne.jp/img/gh_logo.png"; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request; use HTTP::Headers; my $req = HTTP::Request->new(GET => $url); my $ua = LWP::UserAgent->new; $ua->agent( 'Mozilla/5.0 (Windows NT 6.0; rv:12.0)' ); $ua->timeout('10'); $ua->max_redirect(); $ua->cookie_jar( HTTP::Cookies->new( file => '', autosave => 1, )); my $res = $ua->request($req, "save.png"); my $file_size = $res->header("content-length"); print $file_size;

    • ベストアンサー
    • Perl
  • [LWP?] 特定のCLASSの値だけ取得したい

    LWPを使って、特定のWebページを取得しました。 -- use LWP::UserAgent; $ua = LWP::UserAgent->new; $ua->agent("$0/0.1 " . $ua->agent); $req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/'); $req->header('Accept' => 'text/html'); # リクエストの送信 $res = $ua->request($req); # 出力のチェック if ($res->is_success) { print $res->content; #←ここが取得したあいたいです。 } else { print "Error: " . $res->status_line . "\n"; } -- この中から指定したclassのinnerTextだけ取得したいのですがどのようにしたらよいのでしょうか? 要は$res->contentに -- <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> </BODY> -- のような値が入っていてclass=bbbの「yyy1」~「yyy3」だけ取得したいのですが。 よろしくお願い致します。 (参考)LWP http://homepage3.nifty.com/hippo2000/perltips/LWP.html

    • ベストアンサー
    • Perl
  • web文書を取得するプログラムのサイト内での不具合について

    perl初心者です。 自分のwebサイトのコードを取得するプログラムをつくろう と思っているのですが、下のコード -------------------------------------------------------- #!/usr/local/bin/perl use LWP::UserAgent; use HTTP::Request; use HTTP::Response; our $URL = 'http://www.google.co.jp/'; # アクセスする URL my $proxy = new LWP::UserAgent; my $req = HTTP::Request->new('POST' => $URL); # HTTP リクエストを作成 my $res = $proxy->request($req); # $res に HTTP レスポンスが返ってくる print $res->content; # HTML を表示 1; --------------------------------------------------------------- でターゲットのurlが上のgoogleだと取得できるんですが 自サイトのurl'http://○○.××.△△.com/'だと 500 Internal Server Errorとなってしまいます。 因みにレンタルサーバーを利用しています。 サーバーでは技術的な質問は受け付けてないとの事なので、 スクリプトの質問とは少しズレますが分る方がいましたら ご教えていただきたく質問いたしました。

  • LWPでtimeoutがうまくいかない

    LWPを使って外部と通信するプログラムを書きました。 通常時は希望通り動くのですが、相手のサーバが落ちている場合に エラーが戻るまで数分かかります。 ->timeoutの設定も入れたのですがききません。 URL先が落ちているときに、すばやくエラーが戻るようにしたいのですが、 どうしたらよいでしょうか? $server = "http://www.test.com"; $query{testid}="10"; $ua = new LWP::UserAgent; $ua->timeout(10); $request = POST($server, [%query]); $res = $ua->request($request); if (!$res->is_success) { print "Error\n"; exit 1; }