「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@785) [中] [未処理]
@785■ (#2471) なでしこCGIで大ファイルを受信するとデータが途切れる - NON (2015-11-10 22:26) /中 未処理
【症状】
cnakoのCGIモードにおいて、FormのPOSTで大き目のデータを受け取ると、128KB弱でデータが途切れてしまいます。
正確に言うと、データはサイズ通り受信されるのですが、上記のサイズを超えた部分がすべてNULLになってしまいます。


【再現方法】サンプルソース、再現手順など

標準添付サンプルの「sendfile」で確認できます。


【要望】どのような解決が望ましいか?

サイズの制限をなくす。


【バージョン】
なでしこ:1.5332, 1.553
Web鯖:04WebServer
OS:Windows 7 SP1 64bit / Windows Server 2008 SP2 32bit


【その他】

ひょっとすると04WebServerの問題?という可能性もないとは言えないのですが・・・。

(#2519) Perlでは問題なし - NON (2015-12-29 14:37) /中 未処理
ActivePerlと04WebServerでテストしたところ、正常に受信できたことから、おそらくなでしこCGI特有の問題かと思います。

対応頂けると有難いです。

(#2678) IISでも再現 - こころ (2016-10-07 22:32) /中 未処理
IIS 10.0,なでしこ1.562,Windows 10 Pro
では524288バイト(524KB,512Kib)で途切れました.
何度か試しましたがこの上限は変わらず.
maxrequestlengthは設定していません.

(#2682) Re: なでしこCGIで大ファイルを受信するとデータが途切れる - うぇいく (2016-10-19 21:23) /中 未処理
まだ確認できてないのですが、どうも、指定サイズを標準入力から読み込む命令にて、1命令での処理分は1度に読み込もうとしていて、これに失敗した場合に、中途半端に読めている状態のまま進んでしまうようです。
その際、サイズだけは、予定サイズになっているために、ゴミが残っているようです。

POST内容の受信サイズの確認と受信については、cgi.nakoで行っているので、おお担ファイルを受信する場合には、cgi.nakoを改造したほうがよさそうです。
(今は、POSTされた内容をすべてオンメモリで変数に入れて処理しようとしています。結果、32bitsアプリなのに、数メガとか数ギガのメモリを確保しに行く可能性があります)
なお、POSTによるファイルの添付がある場合、大抵のライブラリでは、添付されたファイルは、変数には持たず、いったん一時ファイルに書き出してしまう方法が一般的かと思いますが、一時ファイルの管理・処理が必要となるので、汎用的なライブラリにするのは難しいです。必要に応じて、各々でカスタマイズ(受信してほしい場所と名前で保存するようにする)がよさそうです。

とりあえず、標準入力からの読み取り失敗については、エラーとする方向で考えています。(メモリが足りている限りは)受信可能にできるかどうかは、思い当るふしはあるのですが、試してみないとわかりません。

(#2707) どう改造すればよいのでしょうか - NON (2016-12-01 19:09) /中 未処理
おお、しばらく見ないうちに返信が!

最新版(なでしこ1.562、04WebServer、Win7)では、変わらず128KBが上限のようでした。こころさんとの違いは、サーバソフトなのか、OSなのか…。


> おお担ファイルを受信する場合には、cgi.nakoを改造したほうがよさそうです。

どのように改造すればよいのでしょうか?
以前に確認した時は「標準入力取得」で途切れてしまっているようでしたので、そもそも取得できていない以上、外部ファイルに書き出すも何もできないと思うのですが…。

(#2900) 今更ですが - NON (2019-10-05 21:25) /中 未処理
今更ですが後の方のために。

改造の方針は以下の通り。

cgi.nako を書き換え、読み込みサイズが一定サイズ以上であれば少しずつ「標準入力取得」して一時ファイルに書き出すor変数に代入する。元々のフォーム取得命令で別プログラムに転送すると壊れることがある(特にバイナリ)ので、書き出した一時ファイルあるいは変数を、別プログラムから直接読み書きするようにする。
↑改造で指定した一時ファイルor変数を呼び出し元のプログラムで使用する、すなわち通常のなでしこCGIの機能・命令を使わずに直接制御することになるので、専用の「cgi.nako」が出来上がる。したがって「汎用的なライブラリにするのは難しい」


なお、既存のcgi.nakoだと、バイナリファイルを読むと、小さいファイルであっても末尾にゴミ(マルチパートフォームのフッタ)が付くようです。
これはマルチパートフォームの中身を分割する処理で、フッタを認識できずデータの末尾までまとめて処理してしまうためで、結果としてバイナリを複数添付すると、1つ目のデータにすべて合成された状態で出てきます。

(#2915) 追記2 - NON (2020-04-09 21:15) /中 未処理
なでしこの「標準入力取得」には実装上の欠陥があるので、自分で書いておいてなんですが上記の方法だけでは上手くいきません。

まともに使うためには上記手法に加え、cgi.nako 相当のロジック内において「標準入力取得」を相当するWindows APIに置き換え、データを取得する必要があります。

(#2471)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能