File 0291-inets-Polish-mod_esi-documentation.patch of Package erlang

From a24ed8e5af765840ea6c5b3be0100b4fb1970642 Mon Sep 17 00:00:00 2001
From: Johannes Christ <jc@jchri.st>
Date: Sun, 23 Feb 2025 12:30:20 +0100
Subject: [PATCH] inets: Polish `mod_esi` documentation

This commit:

- Moves the data type documentation for `env()` directly to the data
  type itself
- Introduces the opaque `session_id()` data type
- Adds a summary header for the callback and `deliver` functions
- Removed the redundant "ESI Callback Functions" part of the "Callbacks"
  header
- Groups and reword the callback docs to be more readable.
---
 lib/inets/src/http_server/mod_esi.erl | 166 +++++++++++++++-----------
 1 file changed, 95 insertions(+), 71 deletions(-)

diff --git a/lib/inets/src/http_server/mod_esi.erl b/lib/inets/src/http_server/mod_esi.erl
index 76f9420bbc..54fe8e59e2 100644
--- a/lib/inets/src/http_server/mod_esi.erl
+++ b/lib/inets/src/http_server/mod_esi.erl
@@ -25,43 +25,7 @@ Erlang Server Interface
 This module defines the Erlang Server Interface (ESI) API. It is a more
 efficient way of writing Erlang scripts for your `Inets` web server than writing
 them as common CGI scripts.
-
-### Data types
-
-The following data types are used in the functions for mod_esi:
-
-- **`env() =`** - `{EnvKey()::atom(), Value::term()}`
-
-  Currently supported key value pairs
-
-  - **`{server_software, string()}`** - Indicates the inets version.
-
-  - **`{server_name, string()}`** - The local hostname.
-
-  - **`{gateway_interface, string()}`** - Legacy string used in CGI, just
-    ignore.
-
-  - **`{server_protocol, string()}`** - HTTP version, currently "HTTP/1.1"
-
-  - **`{server_port, integer()}`** - Servers port number.
-
-  - **`{request_method, "GET" | "PUT" | "DELETE" | "POST" | "PATCH"}`** - HTTP
-    request method.
-
-  - **`{remote_adress, inet:ip_address()}`** - The clients ip address.
-
-  - **`{peer_cert, undefined | no_peercert | DER:binary()}`** - For TLS
-    connections where client certificates are used this will be an ASN.1
-    DER-encoded X509-certificate as an Erlang binary. If client certificates are
-    not used the value will be `no_peercert`, and if TLS is not used (HTTP or
-    connection is lost due to network failure) the value will be `undefined`.
-
-  - **`{script_name, string()}`** - Request URI
-
-  - **`{http_LowerCaseHTTPHeaderName, string()}`** - example:
-    \{http_content_type, "text/html"\}
 """.
--moduledoc(#{titles => [{callback,<<"ESI Callback Functions">>}]}).
 
 %% API
 %% Functions provided to help erl scheme alias programmer to 
@@ -72,6 +36,8 @@ The following data types are used in the functions for mod_esi:
 %% Callback API
 -export([do/1, store/2]).
 
+-export_type([session_id/0]).
+
 -include("httpd.hrl").
 -include("httpd_internal.hrl").
 -include_lib("kernel/include/logger.hrl").
@@ -85,6 +51,38 @@ The following data types are used in the functions for mod_esi:
 %%%=========================================================================
 %%%  Types
 %%%=========================================================================
+-doc """
+Environment data associated with a request.
+
+## Possible values
+
+- **`{server_software, string()}`** - Indicates the inets version.
+
+- **`{server_name, string()}`** - The local hostname.
+
+- **`{gateway_interface, string()}`** - Legacy string used in CGI, just
+ignore.
+
+- **`{server_protocol, string()}`** - HTTP version, currently "HTTP/1.1"
+
+- **`{server_port, integer()}`** - Servers port number.
+
+- **`{request_method, "GET" | "PUT" | "DELETE" | "POST" | "PATCH"}`** - HTTP
+request method.
+
+- **`{remote_adress, inet:ip_address()}`** - The clients ip address.
+
+- **`{peer_cert, undefined | no_peercert | DER:binary()}`** - For TLS
+connections where client certificates are used this will be an ASN.1
+DER-encoded X509-certificate as an Erlang binary. If client certificates are
+not used the value will be `no_peercert`, and if TLS is not used (HTTP or
+connection is lost due to network failure) the value will be `undefined`.
+
+- **`{script_name, string()}`** - Request URI
+
+- **`{http_LowerCaseHTTPHeaderName, string()}`** - example:
+`{http_content_type, "text/html"}`
+""".
 -type env() :: {server_software, string()} |
                {server_name, string()} |
                {gateway_interface, string()} |
@@ -96,57 +94,83 @@ The following data types are used in the functions for mod_esi:
                {script_name, string()} |
                {http_LowerCaseHTTPHeaderName, string()}.
 
+
+-doc """
+Identifies the requesting client.
+""".
+-doc #{since => ~"OTP 28.0"}.
+-opaque session_id() :: term().
+
 %%%=========================================================================
 %%%  Callbacks
 %%%=========================================================================
 -doc """
+Called by `mod_esi` in response to requests.
+
 `Module` must be found in the code path and export `Function` with an arity of
-three. An `erlScriptAlias` must also be set up in the configuration file for the
-web server.
+three. An `erl_script_alias` must also be set up in the configuration file for
+the web server, see [the ESI properties documentation](`m:httpd#prop_esi_alias`).
 
-`mod_esi:deliver/2` shall be used to generate the response to the client and
-`SessionID` is an identifier that shall by used when calling this function, do
-not assume anything about the datatype. This function may be called several
-times to chunk the response data. Notice that the first chunk of data sent to
-the client must at least contain all HTTP header fields that the response will
-generate. If the first chunk does not contain the _end of HTTP header_, that is,
-`"\r\n\r\n",` the server assumes that no HTTP header fields will be generated.
+The `Module` and `Function` that are called depend on the URL. See [the ESI
+introductory documentation](http_server.md#esi) for more details.
 
-To set the response status code, the special `status` response header can be
-sent. For instance, to acknowledge creation of a resource and annotate the
-response content type with JSON, one could respond with the following headers:
+`mod_esi:deliver/2` shall be used to generate the response to the client, and
+`SessionID` shall be passed as the first argument.
 
-```erlang
-"status: 201 Created\r\n content-type: application/json\r\n\r\n"
-```
+## Chunking
 
-`Env` environment data of the request, see description above.
+This function may be called several times to chunk the response data. Notice
+that the first chunk of data sent to the client must at least contain all HTTP
+header fields that the response will generate. If the first chunk does not
+contain the _end of HTTP header_, that is, `"\r\n\r\n"`, the server assumes
+that no HTTP header fields will be generated. This behaviour depends on the
+`httpd` configuration, see below.
 
-`Input` is query data of a GET request or the body of a PUT or POST request. The
-default behavior (legacy reasons) for delivering the body, is that the whole
-body is gathered and converted to a string. But if the httpd config parameter
-[max_client_body_chunk](`m:httpd#max_client_body_chunk`) is set, the body will
-be delivered as binary chunks instead. The maximum size of the chunks is either
-[max_client_body_chunk](`m:httpd#max_client_body_chunk`) or decide by the client
-if it uses HTTP chunked encoding to send the body. When using the chunking
-mechanism this callback must return \{continue, State::term()\} for all calls
-where `Input` is `{first, Data::binary()}` or
-`{continue, Data::binary(), State::term()}`. When `Input` is
-`{last, Data::binary(), State::term()}` the return value will be ignored.
+## Parameters
+
+- `SessionID`: request identifier.
+
+  Pass this to `mod_esi:deliver/2` when generating a response.
+
+- `Env`: environment data of the request, see `t:env/0`.
+
+- `Input`: query data of a GET request or the body of a PUT or POST request.
+
+  The default behavior (legacy reasons) for delivering the body, is that the
+  whole body is gathered and converted to a string. But if the httpd config
+  parameter [`max_client_body_chunk`](`m:httpd#max_client_body_chunk`) is set,
+  the body will be delivered as binary chunks instead. The maximum size of the
+  chunks is either [`max_client_body_chunk`](`m:httpd#max_client_body_chunk`) or
+  decided by the client if it uses HTTP chunked encoding to send the body.
+
+  When using the chunking mechanism, this callback must return `{continue,
+  State::term()}` for all calls where `Input` is `{first, Data::binary()}` or
+  `{continue, Data::binary(), State::term()}`. When `Input` is `{last,
+  Data::binary(), State::term()}` the return value will be ignored.
+
+  The input `State` is the last returned `State`, in it the callback can include
+  any data that it needs to keep track of when handling the chunks.
 
 > #### Note {: .info }
 >
 > Note that if the body is small all data may be delivered in only one chunk and
-> then the callback will be called with \{last, Data::binary(), undefined\}
+> then the callback will be called with `{last, Data::binary(), undefined}`
 > without getting called with `{first, Data::binary()}`.
 
-The input `State` is the last returned `State`, in it the callback can include
-any data that it needs to keep track of when handling the chunks.
+## Setting a response status
+
+To set the response status code, the special `status` response header can be
+sent. For instance, to acknowledge creation of a resource and send an empty
+JSON response body, one could pass the following:
+
+```erlang
+"status: 201 Created\r\ncontent-type: application/json\r\n\r\n{}"
+```
 """.
 -doc(#{title => <<"ESI Callback Functions">>}).
 -callback 'Function'(SessionID, Env, Input) -> {continue, State} | _
                         when
-                            SessionID :: term(),
+                            SessionID :: session_id(),
                             Env :: [env()],
                             Input :: string() | ChunkedData,
                             ChunkedData ::
@@ -176,10 +200,10 @@ any data that it needs to keep track of when handling the chunks.
 %% request handling process so it can forward it to the client.
 %%-------------------------------------------------------------------------
 -doc """
-This function is _only_ intended to be used from functions called by the Erl
-Scheme interface to deliver parts of the content to the user.
+Sends data from an ESI script back to the client.
 
-Sends data from an Erl Scheme script back to the client.
+This function is _only_ intended to be used from functions called by the ESI
+interface to deliver parts of the content to the user.
 
 > #### Note {: .info }
 >
@@ -191,7 +215,7 @@ Sends data from an Erl Scheme script back to the client.
 > you implemented.
 """.
 -spec deliver(SessionID, Data) -> ok | {error, Reason} when
-      SessionID :: term(),
+      SessionID :: session_id(),
       Data :: iolist(),
       Reason :: bad_sessionID.
 
-- 
2.43.0

openSUSE Build Service is sponsored by