BIGLOBEなんでも相談室こんにちはゲストさん。>>解決済みの質問LWPのPOSTでバイナリが壊れるLWPを使って、multipart/form-dataでバイナリデータを含むリクエストをSSL経由でPOSTすると、そのバイナリデータの部分が壊れてしまいます。これはバグなのでしょうか?いろいろ探してみても情報が見つかりません。Proxy周りに似たようなバグがあるなどという情報は見つけたのですが、どなたか何か御存じないでしょうか。具体的には、たとえば簡単な例をあげます。チェック用のCGIスクリプトを用意します。text/plain\n\nOK";exit;---------------------------------------これをcheck.cgiというような名前で、非SSLとSSLの2つのサイトに設置しておきます。「:raw」などほとんど意味がないかもしれませんが、ようは受け取ったリクエストボディをそのままファイルに保存するだけのものです。次に以下のようなバイナリデータ(GIFファイル)をPOSTするスクリプトを作って実行します。"OK\n";exit;---------------------------------------まったく同じであるはずの、非SSLとSSLの2つのrequest_body.datファイルをバイナリエディタで比較すると、bin_dataの部分が異なります。法則性もよく判らず、かなり大きく違うようです。ダメモトでlibwww-perlの最新版5.822を、Crypt::SSLeayも0.57をインストールしてみましたが状況は変わらず。リクエストヘッダは特に問題なく、ようするにリクエストボディにバイナリデータが含まれるとエンコードに失敗するのかなと推測しています。バイナリではない部分や通常のPOSTは問題ないのでOpenSSLのバグとは考えられないと思います。それに、バイナリをPOSTなんてレアケースとも思えないんですが、情報が見つからないのも不思議で...。何か情報を、あるいは代替案をご存知でしたら、御教授お願いいたします。この手のものはLWPに依存しすぎていたため、他のHTTPでPOSTするようなものをよく知らないもので...。何度もすみません、そして誤ったことを書いてしまいました。No.3で用いた「CGI」は、他テスト用のもので、tasekiさん作成のcheck.cgiではありませんでした。POSTしてみたところ、CGI、POSTスクリプトともすべてOKとなりました。utf-8あり」の場合のみ、request_body.datのMD5値が異なりました。(なおrequest_body.datのサイズはいずれのケースでも同じでした)以上訂正いたします。20:06:13お礼taknak08さん、本当にありがとうございます。おかげ様で(根本的な解決ではありませんが)バグの所在など分かり疑問も晴れました。Errorそのものは問題ありません。壊れたデータをバイナリエディタなどで見れば解るのですが、boundaryも壊れるので、POSTデータの解析&復元自体が失敗します。Errorを返すかどうかはそのスクリプト次第ですから、お使いになったテストスクリプトがそうだっただけで、私が書いたcheck.cgiは解析&復元をせずにそのままファイルに書き込むだけなので、つまり壊れていようが何だろうが内容には一切関知しないので常にOKを返します。そんなわけで、結果として、やはりutf8フラグのついたデータをSSLエンコードするときに壊れた、という推測がビンゴ!だったようですね。判ったことは、taknak08さんの環境でも発生したということは、すなわち少なくともCrypt::SSLeayは無関係だった可能性が高い、という点です。前にも書いたようにwgetなどは問題ないので、これはLWP周りだと思います。ハンドラの受け渡しLWP::Protocol::httpsあたりでフラグを落としていないのが原因なのかな、と推測していますが、もうそのあたりはメンテナさんに任せるとして、暫定策としてPOSTする前に呼ぶ側でフラグを落とせば良さそうです。この問題が起きる可能性の盲点として、多く使われているであろうWWW::MechanizeとかでHTML::Formにて日本語などのページを解析する際で、HTMLフォームをutf8つきで取得、そのままPOST、なんてやると、この問題が起きますね。そんなのに遭遇した人は、原因にたどり着くまで長そうです...。ありがとうございます。一応もう少し情報を待ってみてから、このスレッドは閉じたいと思います。回答(4)ANo.3taknak08こんにちは。新しいスクリプトでPOSTしてみたところ、おもしろい結果になりました。test.gifもHTTPSサイトへPOSTされていないようです。その他の場合はすべて大丈夫でした。utf8;」をコメントアウトして実行すると、HTTPSでもtest.gifが正常にPOSTできます。utf8;」があっても無くても問題なくPOSTできました。utf8;」は鬼門ですね、本当に・・・Perlファンとしては、UTF-8処理ごとき(?!)で変にコケられてしまうのは悲しいかぎりです。解答が分かってしまったところでググってみれば、やはりお仲間がいるようですね。POST」でググってみました)http://markmail.org/message/varrwabxflwsh4vo#query:Perl%20LWP%3A%3AUserAgent%20HTTPS%20utf8%20POST+page:1+mid:tzotme5w5h5tz5yy+state:resultsそれでは、世のPerlファンのためにバグ報告を!っと思ったら、早速CPANにレポートされているご様子。すばらしい!私も勉強になりました。ありがとうございました。(0)通報するANo.2taknak08最初の者です。以下、POSTスクリプトを動かした環境をお伝えします。$IO::Socket::SSL::VERSION'1.01tasekiさんの現象ですが、私にも原因はよく分かりません。うーん、何なんでしょうねぇ。ちなみに私の環境では、上記のとおりCrypt::SSLeayというパッケージは用いられていないようです。このあたり何かヒントがあるかもしれません。ご検討をお祈りしています。何度もありがとうございます。libwwwの過去バージョンはCrypt::SSLeayが見つからない場合は代替モジュールを探す仕様だったので、おっしゃるとおりtaknak08さんの環境ではCrypt::SSLeayが用いられていないようですね。それも含めていろいろ検証を続け、おかげ様で、だいぶ判ってきました。POSTについて詳しくはLWPを見てください」と、どういうわけかわざわざPOSTだけ特別扱い(?)しているのは、何か懸念事項があるから、という気もするような、しないような...。条件が絞り込まれていくうち、UTF-8が浮かび上がってきました。バイナリデータの中身によって問題が起きたり起きなかったりするのが、どうしても不思議だったんですが、ついに見つけ出しました...、ほぼ確実に問題が起きる条件を。taknak08さんには何度も申し訳ないのですが、本当にもしお時間があったらで良いので、以下を試していただけないでしょうか。POSTスクリプトの改訂版です。"OK\n";exit;---------------------------------------2行追加しただけです。変化が無いようでしたら、test.gifを別のファイルにしてみていただければと思います。これで問題が起きる、つまりやはりUTF-8が絡んでいたのなら、少し解るところもあります。LWP::UserAgentのソースを読んでみたんですが、requestメソッドの中で、受け取ったRequestオブジェクトに対して追加のヘッダがあれば、内部で処理して追加しているんですね。それが上記では「Head1」ですが、ここにutf8フラグが立っていると、SSLの処理で問題が起きる、と言うことかもしれません。「SSLの処理」というのは、上記スクリプトでtaknak08さんの環境では問題が起きないなら、Crypt::SSLeayだけの問題かもしれません。いっても、そもそもASCIIしか使っていないのでUTF-8なんて関係ない気もするんですけどね...。上記の場合ですが、とりあえずの解決策も判りました。判りましたというか...、単にutf8フラグを落とせば良いだけで、試してみたら正常にPOSTできました。推測が当たっていて、かつ上記のような条件でPOSTする場合、とケースが限られますが。生成されたファイル(request_body.dat)には差異はありませんでした。POSTスクリプトを動かした環境は以下のとおりです。結果:openssl-0.9.8b-10.el5openssl-devel-0.9.8b-10.el5perl-IO-Socket-SSL-1.01-1.fc6perl-Net-SSLeay-1.30-4.fc6なおチェック用CGIはレンタルサーバで動かしたため、パッケージなどの詳しい情報はわかりませんでした。(=レンタルサーバへのHTTPSと差異はありませんでした)回答にはなっていませんが、ご参考まで・・・。有用な情報ありがとうございます。POST側の問題なのでしょうね。ひとつ判ったのが、極端に小さいデータ、たとえば数ピクセルの画像などの場合は問題ないことと、私のほうでもレンタルサーバーやレンタルブログへの画像投稿など試してみましたが、相手サーバー=POST先に関係なく問題が起きる、あるいはデータによってはPOST先に関係なく起きないので、やはりPOSTする側の問題だと思います。POSTする側を複数で試していますが、wgetなどは正常なので、やはりOpenSSLなどではなくLWPまわりの何かだと推測しています。よろしければ、libwww-perl、Crypt::SSLeayなどのバージョンもお教えいただけますでしょうか。他に何か情報ありましたら、引き続きお待ちいたします。・会社で利用しているサービスの請求情報を取得したく。サーバーAに、バイナリデータがあります。テキストと画像を回答するHTMLで書かれたアンケートがあります。$_SERVER["REQUEST_METHOD"]に変な値が返ってきて困っています。perlでCSV形式ファイルのアップロード方法を教えてさい。Reserved.掲載情報の著作権は提供元企業等に帰属します。