查看源码 mod_esi 行为 (inets v9.3.1)

Erlang 服务器接口

此模块定义了 Erlang 服务器接口 (ESI) API。相比于编写普通的 CGI 脚本,它是为您的 Inets Web 服务器编写 Erlang 脚本的更有效方法。

数据类型

以下数据类型用于 mod_esi 的函数中

  • env() = - {EnvKey()::atom(), Value::term()}当前支持的键值对
    • {server_software, string()} - 表示 inets 版本。

    • {server_name, string()} - 本地主机名。

    • {gateway_interface, string()} - CGI 中使用的遗留字符串,直接忽略。

    • {server_protocol, string()} - HTTP 版本,当前为 "HTTP/1.1"

    • {server_port, integer()} - 服务器端口号。

    • {request_method, "GET" | "PUT" | "DELETE" | "POST" | "PATCH"} - HTTP 请求方法。

    • {remote_adress, inet:ip_address()} - 客户端的 IP 地址。

    • {peer_cert, undefined | no_peercert | DER:binary()} - 对于使用客户端证书的 TLS 连接,这将是一个 ASN.1 DER 编码的 X509 证书,形式为 Erlang 二进制数据。如果未使用客户端证书,则该值为 no_peercert,如果未使用 TLS(HTTP 或连接因网络故障而丢失),则该值为 undefined

    • {script_name, string()} - 请求 URI

    • {http_LowerCaseHTTPHeaderName, string()} - 例如:{http_content_type, "text/html"}

摘要

回调:ESI 回调函数

Module 必须在代码路径中找到,并且导出具有三个参数的 Function。还必须在 Web 服务器的配置文件中设置 erlScriptAlias

函数

此函数旨在从 Erl Scheme 接口调用的函数中使用,以向用户传递部分内容。

类型

-type env() ::
          {server_software, string()} |
          {server_name, string()} |
          {gateway_interface, string()} |
          {server_protocol, string()} |
          {server_port, integer()} |
          {request_method, string()} |
          {remote_adress, inet:ip_address()} |
          {peer_cert, undefined | no_peercert | public_key:der_encoded()} |
          {script_name, string()} |
          {http_LowerCaseHTTPHeaderName, string()}.

回调:ESI 回调函数

链接到此回调

'Function'(SessionID, Env, Input)

查看源码 (可选)
-callback 'Function'(SessionID, Env, Input) -> {continue, State} | _
                        when
                            SessionID :: term(),
                            Env :: [env()],
                            Input :: string() | ChunkedData,
                            ChunkedData ::
                                {first, Data :: binary()} |
                                {continue, Data :: binary(), State :: term()} |
                                {last, Data :: binary(), State :: term()},
                            State :: term().

Module 必须在代码路径中找到,并且导出具有三个参数的 Function。还必须在 Web 服务器的配置文件中设置 erlScriptAlias

mod_esi:deliver/2 应用于生成对客户端的响应,并且 SessionID 是在调用此函数时使用的标识符,请不要假设其数据类型。可以多次调用此函数来分块响应数据。请注意,发送给客户端的第一个数据块必须至少包含响应将生成的所有 HTTP 标头字段。如果第一个数据块不包含 *HTTP 标头结尾*,即 "\r\n\r\n",,则服务器会认为不会生成任何 HTTP 标头字段。

要设置响应状态码,可以发送特殊的 status 响应头。例如,要确认资源的创建并使用 JSON 注释响应内容类型,可以响应以下标头

"status: 201 Created\r\n content-type: application/json\r\n\r\n"

Env 请求的环境数据,请参见上面的描述。

Input 是 GET 请求的查询数据,或 PUT 或 POST 请求的主体。传递主体的默认行为(出于遗留原因)是将整个主体收集并转换为字符串。但是,如果设置了 httpd 配置参数 max_client_body_chunk,则主体将以二进制块的形式传递。块的最大大小要么是 max_client_body_chunk,要么由客户端决定(如果客户端使用 HTTP 分块编码发送主体)。当使用分块机制时,此回调必须为所有 Input{first, Data::binary()}{continue, Data::binary(), State::term()} 的调用返回 {continue, State::term()}。当 Input{last, Data::binary(), State::term()} 时,返回值将被忽略。

注意

请注意,如果主体很小,则所有数据可能只在一个块中传递,然后将使用 {last, Data::binary(), undefined} 调用回调,而不会使用 {first, Data::binary()} 调用。

输入 State 是最后返回的 State,回调可以在其中包含处理块时需要跟踪的任何数据。

函数

链接到此函数

deliver(SessionID, Data)

查看源码
-spec deliver(SessionID, Data) -> ok | {error, Reason}
                 when SessionID :: term(), Data :: iolist(), Reason :: bad_sessionID.

此函数旨在从 Erl Scheme 接口调用的函数中使用,以向用户传递部分内容。

将来自 Erl Scheme 脚本的数据发送回客户端。

注意

如果脚本添加了任何 HTTP 标头字段,则它们必须在首次调用 deliver/2 中,并且调用中的数据必须是字符串。完成标头后的调用可以包含二进制数据,以减少复制开销。不要假设 SessionID 的数据类型。 SessionID 必须是作为输入提供给您实现的 ESI 回调函数的值。