檢視原始碼 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 回呼函式

連結到此回呼

'函式'(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 必須在程式碼路徑中找到,並匯出 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,回呼可以在其中包含它在處理區塊時需要追蹤的任何資料。

函式

連結到此函式

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 回呼函式所給定的輸入值。