查看源码 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 回调函数
-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
,回调可以在其中包含处理块时需要跟踪的任何数据。
函数
-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 回调函数的值。