2

Django 1.2.3、PyISAPIe v1.1.0-rc4、およびIIS 7.5を使用しているときに、大きなPOSTデータ(> 16384バイト)で問題が発生しています。

たとえば、約を提出する場合。POSTを使用した60kBのフォームデータでは、次のようになります。

  • POSTデータの最初の16kBブロックは正しい
  • 次の16kBブロックは、最初のブロックの繰り返しです
  • 次の16kBは、最初のブロックの別の繰り返しです
  • 残り(<16kB)は再び正しい

興味深いのは、を使用するcontent-type="multipart/form-data"と正常に動作することです。

この情報を使用して、バグの可能性のある場所をdjango \ core \ handlers \ wsgi.pyのWSGIRequest._get_raw_post_dataまで追跡しました。これはcontent-type="multipart/form-data"、デフォルト(コンテンツタイプなし)の場合とは別に処理します。

どちらの場合もself.environ['wsgi.input']、PyISAPIeオブジェクトに設定されているから読み取ります。違いは、デフォルトの場合は16kBのチャンクで読み取るように見えるのに対し、マルチパートハンドラーは2GB弱のチャンクで読み取るように見えることです。

CとCがさらに掘り下げるためのPythonインターフェースについては十分に知りませんが、バグはReadWrite.cppのReadClient関数のPyISAPIeのどこかにあると思います。

私の現在の回避策はcontent-type="multipart/form-data"、16kBを超えるデータを生成する可能性のあるフォームに追加することです。

誰かがこれにも遭遇したことがありますか、またはバグが実際にPyISAPIeにあるかどうかを判断する方法を知っている人はいますか?

ありがとうございました!

4

2 に答える 2

3

PyISAPIeの作者はこちら。

これは、リポジトリのリビジョン184で修正されましたが、メーリングリストで説明されているように、ダウンロード可能なリリースでは修正されていません。

多くのユーザーがパッケージをダウンロードするのではなくソースをチェックアウトしているため、明らかにあまり注目されていない、以前に文書化されたバグに対処しました。または、とにかくそれが私の最善の推測です。とにかく、私は固定コードのダウンロード可能なバージョンを提供する予定です。

このプロジェクトのリリースを機能している状態に保つことを思い出させることができるように、これに注意を向けてくれてありがとう。

于 2012-03-28T05:39:09.547 に答える
1

もう少し深く掘り下げてみたところ、問題が見つかったと思います。

PyISAPIe \ Readwrite.cpp:

PyISAPIe_Func(DWORD) ReadClient( Context &Ctx, DWORD Length, void *const Data )
{
  if ( !Length )
    Length = Ctx.ECB->cbTotalBytes;

  if ( !Data )
    // Return the size of the the data that would be read
    return min(Length, Ctx.ECB->cbTotalBytes);

  DWORD Ret, Total = 0;

  if ( Length > Ctx.ECB->cbAvailable )
  {
    [...snip...]
  }
  else
  {
    memcpy(Data, Ctx.ECB->lpbData, Length);
    Ctx.ECB->cbTotalBytes -= Length;
    Ctx.ECB->cbAvailable -= Length;
    return Length;
  }

メソッドがLength<=Ctx.ECB-> cbAvailableで繰り返し呼び出された場合、常にCtx.ECB-> lpbDataバッファーの先頭をDataにコピーし、そのデータをバッファーから削除したり、ポインターを進めたりしないようです。データが使い果たされた場合(cbAvailable == 0)にのみ、新しいデータがコードの後半でデータに正しく読み込まれます。

それを修正する方法はまだわかりませんが、少なくとも、1つのチャンクがすべてを読み取ることができるように、十分な大きさのデータのチャンクを読み取ることで回避できます。

于 2012-03-27T15:41:14.837 に答える