Hello!
2012/10/11 sailorf:
> 看lua-resty-upload的示例,是在content阶段处理。
事实上也可以在 access 阶段或者 rewrite 阶段处理 ;)
>
> 但我发现,在lua-resty-upload中,慢慢读取字节的过程会读到header,再读body,我就有点搞不懂了。
>
lua-resty-upload 读的总是 requesty body,即请求体。其 API 返回的header 和 body 是
multipart 格式中定义的第一个 part 所对应的 header 或者 body. 细节可以参见定义 multipart 格式的
RFC 1341:
http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
> 一个http请求,nginx是完全收完了之后,再进行rewrite->access->content的阶段吗?
nginx 在读取完请求头后执行各个请求处理阶段,即 post_read -> rewrite -> post_rewrite ->
access -> post_access -> try_files -> content -> log 等等。
请求体的读取是由 Nginx 模块自己来决定何时读取的,可以发生在 rewrite, access, 或者 content 中的任何一个阶段。
> 如果是这样的话,lua-resty-upload应该没什么用,因为包都收完了。
lua-resty-upload 基于 ngx_lua 的 ngx.req.socket() API,只有这个 API
支持大请求体的流式读取。而 Nginx 核心提供的标准请求体读取 API 总是会一次性全缓冲整个请求体,无论是在内存中还是在文件系统上。
> 如果不是,那么有可能在content还没读到header的时候(网络卡),access就能对header进行判断吗?
>
lua-resty-upload 中的 header 是 multipart 格式中每一个 part 所对应的
header,而不是整个请求的 header. 整个请求的 header 总是由 nginx 预读好的。
Best regards,
-agentzh