块输入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” 头的存在独立调用。