Python 使用Django/PyISAPIe/IIS时,大型POST数据已损坏
在使用Django 1.2.3、PyISAPIe v1.1.0-rc4和IIS 7.5时,我遇到了一个关于大POST数据(>16384字节)的问题 例如,使用POST提交约60kB的表单数据时,会发生以下情况: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
- POST数据的前16kB块是正确的
- 下一个16kB的块是第一个块的重复
- 接下来的16kB是第一个块的另一个重复
- 剩下的(我挖得更深一点,我想我找到了问题所在
在PyISAPIe\Readwrite.cpp中:
如果使用长度cbAvailable重复调用该方法,它似乎总是将Ctx.ECB->lpbData缓冲区的开头复制到数据中,而不是从缓冲区中删除该数据或前进指针。只有当数据耗尽(cbAvailable==0)时,新数据才会正确读入代码后面的数据中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; }
仍然不知道如何修复它,但至少我可以通过读取足够大的数据块来解决它,这样一个数据块就可以读取所有数据。我深入挖掘了一点,我认为我发现了问题所在 在PyISAPIe\Readwrite.cpp中:
如果使用长度cbAvailable重复调用该方法,它似乎总是将Ctx.ECB->lpbData缓冲区的开头复制到数据中,而不是从缓冲区中删除该数据或前进指针。只有当数据耗尽(cbAvailable==0)时,新数据才会正确读入代码后面的数据中 仍然不知道如何修复它,但至少我可以通过读取足够大的数据块来解决它,这样一个数据块就可以读取所有数据。pyisapi作者在这里 这已在存储库中修复,但在可下载版本中未修复,如上所述 它解决了一个显然没有受到太多关注的bug,因为许多用户都在查看源代码而不是下载包。或者,这是我最好的猜测;不管怎样,我计划提供一个可下载的固定代码版本 感谢您提醒我注意这一点,以便提醒我保持此项目的版本处于正常运行状态。PyISAPIe作者在这里 这已在存储库中修复,但在可下载版本中未修复,如上所述 它解决了一个显然没有受到太多关注的bug,因为许多用户都在查看源代码而不是下载包。或者,这是我最好的猜测;不管怎样,我计划提供一个可下载的固定代码版本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; }
感谢您提醒我注意此问题,以便提醒我保持此项目的版本处于正常运行状态。感谢您的回答!我将尝试从源代码处重新编译它。感谢您的回答!我将尝试从源代码处重新编译它。