檢視原始碼 mod_esi 行為 (inets v9.3.1)
Erlang 伺服器介面
此模組定義了 Erlang 伺服器介面 (ESI) API。它是一種比將 Erlang 腳本編寫為常見 CGI 腳本,更有效率的為您的 Inets
網頁伺服器編寫 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 連線,這將是以 Erlang 二進制形式表示的 ASN.1 DER 編碼 X509 憑證。如果未使用用戶端憑證,則該值將為no_peercert
;如果未使用 TLS (HTTP 或連線因網路故障而遺失),則該值將為undefined
。{script_name, string()}
- 請求 URI{http_LowerCaseHTTPHeaderName, string()}
- 範例:{http_content_type, "text/html"}
摘要
回呼:ESI 回呼函式
Module
必須在程式碼路徑中找到,並匯出 arity 為 3 的 Function
。還必須在網頁伺服器的組態檔中設定 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
必須在程式碼路徑中找到,並匯出 arity 為 3 的 Function
。還必須在網頁伺服器的組態檔中設定 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 回呼函式所給定的輸入值。