POSTリクエストの正しいContent-Lengthを取得する方法
-
09-06-2019 - |
質問
Perl スクリプトを使用して Google Appengine アプリケーションに POST しています。-F オプションを使用して、XML を含むテキスト ファイルを投稿します。
http://www.cpan.org/authors/id/E/EL/ELIJAH/bget-1.1
バージョン 1.2 があり、すでにテストされていますが、同じ問題が発生します。投稿はこんな感じです。
Host: foo.appspot.com
User-Agent: lwp-request/1.38
Content-Type: text/plain
Content-Length: 202
<XML>
<BLAH>Hello World</BLAH>
</XML>
202 が正しくないように例を変更しましたが、心配しないでください。問題に移ります。Content-Length はファイルのバイト数と一致しますが、Content-Length を手動で大きくしない限り、ファイル全体が送信されるわけではなく、数バイトが切り捨てられます。切り捨てられるバイト数は、ファイルのサイズが異なると同じではありません。スクリプトで -r オプションを使用したところ、送信内容がわかり、すべてのファイルが送信されていますが、Google Appengine self.request.body を見ると、すべてが受信されているわけではないことがわかります。解決策は Content-Length の正しい数値を取得することだと思いますが、明らかに、ファイルのバイト数や Perl スクリプトが何らかの理由でそれを破壊しているほど単純ではありません。
アップデート:正しい答えをくれたエリクソンに感謝します。printf を使用してファイルの末尾に文字を追加しましたが、ファイル内の行数が常に正確に切り捨てられました。サーバー側ですべての文字を反復処理することで、何が追加されているかを把握できると思いますが、それだけの価値はありません。この問題は、アプリ エンジン用に設定された Google グループでも回答されませんでした。
解決
必要な追加バイト数はファイルの行数と同じですか?おそらくどういうわけかキャリッジリターンが導入されているにもかかわらずカウントされていない可能性があるため、質問しました。
他のヒント
以前にも同様の問題に遭遇したことがあります。
ファイルのサイズを決定するために length() 関数を使用していると思いますか?その場合、投稿しているデータは ASCII ではなく UTF-8 でエンコードされている可能性があります。
正しいカウントを取得するには、「バイトを使用する」を追加する必要があります。スクリプトの上部へのプラグマ、またはブロックで長さの呼び出しを包みます。
my $size;
do {use bytes; $size = length($file_data)}
perlfunc のマニュアルページから:
「文字に注意してください:EXPR が Unicode の場合は、バイト数ではなく文字数が取得されます。」
どうやってバイト数を取得しているのでしょうか?..ファイルシステム上のファイルのサイズを調べてみてはどうでしょうか?
「-s」を使用すると、ファイルのサイズを取得できます。
または、さらに多くのことを実行したい場合は、次を使用できます。 ファイル::統計