块输入API¶
已在uWSGI 1.9.13中添加了一个用于管理HTTP块输入请求的API。
这个API是非常低层次的,允许与标准的应用进行集成。
只公开了两个函数:
chunked_read([timeout])
chunked_read_nb()
(从uWSGI 1.9.20起) 在CPython, PyPy和Perl上都支持这个API
读取块¶
要读取一个块(阻塞),只需运行
my $msg = uwsgi::chunked_read
如果未指定超时时间,则会使用默认值。如果你没有及时获得一个块,那么这个函数将会嚷嚷 (或者在Python下,引发一个异常)。
在非阻塞/异步引擎下,你或许想要使用
my $msg = uwsgi::chunked_read_nb
如果没有可用的块(并且错误时抛出了异常),那么该函数将会立即返回 undef
(或者在Python上是 None
)。
一个完整的PSGI流回显例子:
# simple PSGI echo app reading chunked input
sub streamer {
$responder = shift;
# generate the headers and start streaming the response
my $writer = $responder->( [200, ['Content-Type' => 'text/plain']]);
while(1) {
my $msg = uwsgi::chunked_read;
last unless $msg;
$writer->write($msg);
}
$writer->close;
}
my $app = sub {
return \&streamer;
};
调整块缓冲¶
在开始读取块之前,uWSGI会分配一个固定的缓冲来存储块。
所有的消息总是会存储在相同的缓冲中。如果接收到了比缓冲大的消息,那么会引发一个异常。
默认情况下,缓冲限制为1MB。你可以用 --chunked-input-limit
选项来调整它 (单位是字节)。
与代理集成¶
如果你计划把uWSGI放在代理/路由器之后,那么确保它支持块输入请求 (或者一般原始HTTP请求)。
当使用uWSGI HTTP路由器时,只需添加–http-raw-body来支持块输入。
HAProxy属于开箱即用。
Nginx >= 1.4支持块输入。
选项¶
--chunked-input-limit
: 一个块消息的限制 (以字节为单位,默认是1MB)--chunked-input-timeout
: 阻塞chunked_read的默认超时时间 (以秒为单位,默认与–socket-timeout值相同,4秒)
小抄¶
- 在消耗了请求体哪怕是一字节之后调用块API函数是错误的 (这包含
--post-buffering
)。 - 块API函数可以被”Transfer-Encoding: chunked” 头的存在独立调用。