Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django/PyISAPIe/IIS时,大型POST数据已损坏_Python_C_Django_Python C Api_Pyisapie - Fatal编程技术网

Python 使用Django/PyISAPIe/IIS时,大型POST数据已损坏

Python 使用Django/PyISAPIe/IIS时,大型POST数据已损坏,python,c,django,python-c-api,pyisapie,Python,C,Django,Python C Api,Pyisapie,在使用Django 1.2.3、PyISAPIe v1.1.0-rc4和IIS 7.5时,我遇到了一个关于大POST数据(>16384字节)的问题 例如,使用POST提交约60kB的表单数据时,会发生以下情况: POST数据的前16kB块是正确的 下一个16kB的块是第一个块的重复 接下来的16kB是第一个块的另一个重复 剩下的(我挖得更深一点,我想我找到了问题所在 在PyISAPIe\Readwrite.cpp中: PyISAPIe_Func(DWORD) ReadClient( Conte

在使用Django 1.2.3、PyISAPIe v1.1.0-rc4和IIS 7.5时,我遇到了一个关于大POST数据(>16384字节)的问题

例如,使用POST提交约60kB的表单数据时,会发生以下情况:

  • POST数据的前16kB块是正确的
  • 下一个16kB的块是第一个块的重复
  • 接下来的16kB是第一个块的另一个重复

  • 剩下的(我挖得更深一点,我想我找到了问题所在

    在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;
      }
    
    如果使用长度cbAvailable重复调用该方法,它似乎总是将Ctx.ECB->lpbData缓冲区的开头复制到数据中,而不是从缓冲区中删除该数据或前进指针。只有当数据耗尽(cbAvailable==0)时,新数据才会正确读入代码后面的数据中


    仍然不知道如何修复它,但至少我可以通过读取足够大的数据块来解决它,这样一个数据块就可以读取所有数据。

    我深入挖掘了一点,我认为我发现了问题所在

    在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;
      }
    
    如果使用长度cbAvailable重复调用该方法,它似乎总是将Ctx.ECB->lpbData缓冲区的开头复制到数据中,而不是从缓冲区中删除该数据或前进指针。只有当数据耗尽(cbAvailable==0)时,新数据才会正确读入代码后面的数据中

    仍然不知道如何修复它,但至少我可以通过读取足够大的数据块来解决它,这样一个数据块就可以读取所有数据。

    pyisapi作者在这里

    这已在存储库中修复,但在可下载版本中未修复,如上所述

    它解决了一个显然没有受到太多关注的bug,因为许多用户都在查看源代码而不是下载包。或者,这是我最好的猜测;不管怎样,我计划提供一个可下载的固定代码版本

    感谢您提醒我注意这一点,以便提醒我保持此项目的版本处于正常运行状态。

    PyISAPIe作者在这里

    这已在存储库中修复,但在可下载版本中未修复,如上所述

    它解决了一个显然没有受到太多关注的bug,因为许多用户都在查看源代码而不是下载包。或者,这是我最好的猜测;不管怎样,我计划提供一个可下载的固定代码版本


    感谢您提醒我注意此问题,以便提醒我保持此项目的版本处于正常运行状态。

    感谢您的回答!我将尝试从源代码处重新编译它。感谢您的回答!我将尝试从源代码处重新编译它。