【问题标题】:Indy HTTP server do not allow upload large filesIndy HTTP 服务器不允许上传大文件
【发布时间】:2016-01-07 19:38:19
【问题描述】:

我想知道如果它想向我的http服务器发送大量数据(如大二进制文件),是否可以停止连接?如果可能,那么如何。

【问题讨论】:

  • 这个重复? stackoverflow.com/questions/280684/size-of-uploaded-file。请参阅1st answer there 以获取答案。 (可以查看Content-length
  • @Rik:假设客户端发送了一个Content-Length。它可以改用chunked 传输编码,也可以改用MIME multipart/form-data 帖子,两者都是自终止的,不使用Content-Length
  • @RemyLebeau 是的,我知道Content-Length 不是必需的(它也在那个答案中)。这就是我链接到它的原因。在这种情况下,您可以在文件变得太大时开始读取并中止。但是您发送411 的解决方案也是(一个不错的)解决方案(除非您正在处理执行分块传输编码或 MIME 多部分/表单数据发布的客户端应用程序并且无法更改它们的方式发送文件)。
  • TIdHTTPServer 完成所有读取操作,因此为了实现读取和中止方法,您需要创建一个自定义 TStream 类来覆盖 Write()(或使用 @987654333 @ 带有OnWrite 事件处理程序)在达到限制时引发异常,然后在上传期间使用TIdHTTPServer.OnCreatePostStream 事件提供该流类的实例。
  • 好吧,这实际上是一个非常酷的想法。我会检查 Content-Length 值并实现我的自定义流女巫将阻止所有尝试上传超过我允许的数据的尝试

标签: indy


【解决方案1】:

是的,有时可能,但可能一直都不可能。

TIdHTTPServer 有一个OnHeadersAvailable 事件,在读取客户端的请求标头之后和读取请求正文之前触发。该事件使您可以访问标题。您可以检查Content-Length 标头的值,如果它不适合您的需要,则可以将事件的VContinueProcessing 参数设置为False 以拒绝请求。如果您想自定义发送回客户端的错误消息,请使用OnHeadersBlocked 事件根据需要提供您自己的ResponseNoResponseTextContentText 值。

请注意,这仅在客户端发送 Content-Length 标头时有效。这不是严格要求的,具体取决于上传的性质。客户端可以使用chunked 传输编码或MIME multipart/form-data 帖子,这两者都是不依赖Content-Length 标头的自终止格式。如果您想坚持客户端发送Content-Length 标头,如果标头丢失,您可以使用411(需要长度)响应代码拒绝请求。

【讨论】:

  • 谢谢这正是我想知道的
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2016-01-07
相关资源
最近更新 更多