mod_esi
mod_esi
模块
mod_esi
模块摘要
Erlang 服务器接口
描述
该模块定义了 Erlang 服务器接口(ESI)API。这是为您的Inets
Web 服务器编写 Erlang 脚本比将其作为常用 CGI 脚本编写更有效的方式。
数据类型
以下数据类型用于 mod_esi 的函数中:
env() =
{EnvKey()::atom(), Value::term()}
目前支持的键值对
{server_software, string()}
指示 INTS 版本。
{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 连接,这将是一个作为 Erlang 二进制文件的 ASN.1 DER 编码的X509证书。如果未使用客户端证书,则值将为no_peercert
,并且如果未使用 TLS(由于网络故障导致HTTP或连接丢失),则值将为undefined
。
{script_name, string()}
请求 URI
{http_LowerCaseHTTPHeaderName, string()}
例如:{http_content_type,“text / html”}
出口
deliver(SessionID, Data) -> ok | {error, Reason}
类型
此功能仅
用于 Erl Scheme 界面调用的功能,以将部分内容传送给用户。
将来自 Erl Scheme 脚本的数据发送回客户端。
注意
如果脚本添加了任何 HTTP 头字段,则它们必须在第一次调用中deliver/2
,并且调用中的数据必须是字符串。标题完成后的调用可以包含二进制数据以减少复制开销。不要假设任何有关数据类型的信息SessionID
。SessionID
必须是作为您实现的ESI回调函数的输入给出的值。
ESI 回调函数
出口
Module:Function(SessionID, Env, Input)-> {continue, State} | _
类型
Module
必须在代码路径中找到并Function
以三个元素导出。还erlScriptAlias
必须在Web服务器的配置文件中进行设置。
mod_esi:deliver/2
应用于生成对客户端的响应,并且SessionID
是在调用此函数时应使用的标识符,不要假定有关数据类型的任何内容。这个函数可能会被调用几次来分块响应数据。请注意,发送到客户端的第一个数据块必须至少包含响应将生成的所有HTTP头字段。如果第一个块不包含 HTTP 头
的结尾
,即"\r\n\r\n",
服务器假定不会生成HTTP头字段。
Env
请求的环境数据见上面的描述。
Input
是 GET 请求的查询数据或 PUT 或 POST 请求的主体。传递正文的默认行为(遗留原因)是整个身体被收集并转换为字符串。但是,如果设置了httpd配置参数max_client_body_chunk
,则主体将以二进制块的形式提供。max_client_body_chunk
如果使用HTTP分块编码发送主体,那么块的最大大小是由客户端决定的或由客户端决定的。当使用分块机制时,该回调必须返回{continue,State :: term()},其中的所有调用Input
都是{first, Data::binary()}
或{continue, Data::binary(), State::term()}
。当Input
被{last, Data::binary(), State::term()}
返回值将被忽略。
注意
请注意,如果主体很小,则所有数据可能只在一个块中传递,然后将使用{last,Data :: binary(),undefined}调用回调,而不用调用{first, Data::binary()}
。
输入State
是最后返回的State
,其中回调可以包括处理块时需要跟踪的任何数据。
Module:Function(Env, Input)-> Response
类型
此回调格式消耗大量内存,因为整个响应必须在发送给用户之前生成。此回调格式已弃用。为了新的开发,使用Module:Function/3
。