<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> 
This specification defines <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">manakai</anchor>'s extensions to the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> specification.</p><section><h1>Transport integration</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> To construct the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environment</anchor>, the rules to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">prepare metavariables</anchor>
<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> be used with <var>scheme key name</var> <code>psgi.url_scheme</code>.</p></section><section><h1>Server state API</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MAY</MAY> set a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">value<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">hash value</title></anchor> for the 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">key<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">hash key</title></anchor> <dfn><code>manakai.server.state</code></dfn> in the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environment</anchor>.
If the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">key<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">hash key</title></anchor> <code>exists</code> and its <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">value<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">hash value</title></anchor> is <code>defined</code>,
the value <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server state object</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> A <dfn>server state object</dfn> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> dependent <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> Every invocation of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI application</anchor> within the same 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server session</anchor> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> have the same <code>manakai.server.state</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">value<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">hash value</title></anchor> in their <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environments<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">environment</title></anchor>.
How to determine the <dfn>server session</dfn> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> dependent.</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> Typically, all the invocations of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI application</anchor> in a single worker process
of a preforking <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> implementation live in the same <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server session</anchor>.</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MAY</MAY> provide a way for the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application</anchor> to specify
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server state object</anchor> for a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server session</anchor>.
It <SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHOULD</SHOULD> also define a way to cleanly discard the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server state object</anchor>.</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> For example, the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI server</anchor> can invoke the <code>destroy</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method</anchor> of the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server state object</anchor> just before the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server session</anchor>
is discarded.</p></example><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 
It is intended that the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application</anchor> can use the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server state object</anchor>
to keep references to objects which live longer than a single <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI application</anchor>
invocation, such as database connection client objects,
and can discard them safely when the server is shutdown.</comment-p></section><section><h1>Terminology</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 
This specification depends on the <cite>Infra Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> 
The terms
<dfn>hash key</dfn>,
<dfn>hash value</dfn>,
<dfn><code>exists</code></dfn>,
<dfn><code>defined</code></dfn>,
and
<dfn>object</dfn>
are <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> terms.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> The terms
<dfn>PSGI server</dfn>,
<dfn>PSGI application</dfn>,
<dfn>environment</dfn>,
and
<dfn><code>psgi.url_scheme</code></dfn>
are defined by the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> specification.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> The term
<dfn>prepare metavariables</dfn>
is defined by the <cite>Web Transport Processing</cite> specification.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 
For the purpose of this specification, an <dfn>application</dfn> is an
application server program which has a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI application</anchor>.</p></section><section><h1>License</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> 
Per CC0 <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://creativecommons.org/publicdomain/zero/1.0/">https://creativecommons.org/publicdomain/zero/1.0/</anchor-external>, 
to the extent possible under law, the author of this specification 
has waived all copyright and related or neighboring rights to this specification.</p></section><section><h1>Notes</h1></section></body></html>