evennia/docs/5.x/_modules/twisted/web/http_headers.html
2025-07-01 10:01:48 +02:00

411 lines
No EOL
36 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>twisted.web.http_headers &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../../../_static/nature.css?v=245aff17" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/documentation_options.js?v=c6e86fd7"></script>
<script src="../../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">twisted.web.http_headers</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for twisted.web.http_headers</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- test-case-name: twisted.web.test.test_http_headers -*-</span>
<span class="c1"># Copyright (c) Twisted Matrix Laboratories.</span>
<span class="c1"># See LICENSE for details.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">An API for storing HTTP header names and values.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">AnyStr</span><span class="p">,</span>
<span class="n">ClassVar</span><span class="p">,</span>
<span class="n">Dict</span><span class="p">,</span>
<span class="n">Iterator</span><span class="p">,</span>
<span class="n">List</span><span class="p">,</span>
<span class="n">Mapping</span><span class="p">,</span>
<span class="n">Optional</span><span class="p">,</span>
<span class="n">Sequence</span><span class="p">,</span>
<span class="n">Tuple</span><span class="p">,</span>
<span class="n">TypeVar</span><span class="p">,</span>
<span class="n">Union</span><span class="p">,</span>
<span class="n">overload</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">twisted.python.compat</span><span class="w"> </span><span class="kn">import</span> <span class="n">cmp</span><span class="p">,</span> <span class="n">comparable</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">twisted.web._abnf</span><span class="w"> </span><span class="kn">import</span> <span class="n">_istoken</span>
<span class="k">class</span><span class="w"> </span><span class="nc">InvalidHeaderName</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP header names must be tokens, per RFC 9110 section 5.1.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s2">&quot;_T&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_sanitizeLinearWhitespace</span><span class="p">(</span><span class="n">headerComponent</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
<span class="w"> </span><span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Replace linear whitespace (C{\n}, C{\r\n}, C{\r}) in a header</span>
<span class="sd"> value with a single space.</span>
<span class="sd"> @param headerComponent: The header value to sanitize.</span>
<span class="sd"> @return: The sanitized header value.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">headerComponent</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
<div class="viewcode-block" id="Headers">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers">[docs]</a>
<span class="nd">@comparable</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Headers</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Stores HTTP headers in a key and multiple value format.</span>
<span class="sd"> When passed L{str}, header names (e.g. &#39;Content-Type&#39;)</span>
<span class="sd"> are encoded using ISO-8859-1 and header values (e.g.</span>
<span class="sd"> &#39;text/html;charset=utf-8&#39;) are encoded using UTF-8. Some methods that return</span>
<span class="sd"> values will return them in the same type as the name given.</span>
<span class="sd"> If the header keys or values cannot be encoded or decoded using the rules</span>
<span class="sd"> above, using just L{bytes} arguments to the methods of this class will</span>
<span class="sd"> ensure no decoding or encoding is done, and L{Headers} will treat the keys</span>
<span class="sd"> and values as opaque byte strings.</span>
<span class="sd"> @ivar _rawHeaders: A L{dict} mapping header names as L{bytes} to L{list}s of</span>
<span class="sd"> header values as L{bytes}.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="vm">__slots__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;_rawHeaders&quot;</span><span class="p">]</span>
<div class="viewcode-block" id="Headers.__init__">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.__init__">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">rawHeaders</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Mapping</span><span class="p">[</span><span class="n">AnyStr</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">AnyStr</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="nb">bytes</span><span class="p">]]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">rawHeaders</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">rawHeaders</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">setRawHeaders</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a string fully describing the headers set on this object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{!r}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__cmp__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Define L{Headers} instances as being equal to each other if they have</span>
<span class="sd"> the same raw headers.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Headers</span><span class="p">):</span>
<span class="k">return</span> <span class="n">cmp</span><span class="p">(</span>
<span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">items</span><span class="p">()),</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<div class="viewcode-block" id="Headers.copy">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.copy">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a copy of itself with the same headers set.</span>
<span class="sd"> @return: A new L{Headers}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="p">)</span></div>
<div class="viewcode-block" id="Headers.hasHeader">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.hasHeader">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">hasHeader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check for the existence of a given header.</span>
<span class="sd"> @param name: The name of the HTTP header to check for.</span>
<span class="sd"> @return: C{True} if the header exists, otherwise C{False}.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_nameEncoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span></div>
<div class="viewcode-block" id="Headers.removeHeader">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.removeHeader">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">removeHeader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove the named header from this header object.</span>
<span class="sd"> @param name: The name of the HTTP header to remove.</span>
<span class="sd"> @return: L{None}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">_nameEncoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span></div>
<div class="viewcode-block" id="Headers.setRawHeaders">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.setRawHeaders">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">setRawHeaders</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">],</span> <span class="n">values</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]]</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the raw representation of the given header.</span>
<span class="sd"> @param name: The name of the HTTP header to set the values for.</span>
<span class="sd"> @param values: A list of strings each one being a header value of</span>
<span class="sd"> the given name.</span>
<span class="sd"> @raise TypeError: Raised if C{values} is not a sequence of L{bytes}</span>
<span class="sd"> or L{str}, or if C{name} is not L{bytes} or L{str}.</span>
<span class="sd"> @return: L{None}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_name</span> <span class="o">=</span> <span class="n">_nameEncoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">encodedValues</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">bytes</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">_v</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf8&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_v</span> <span class="o">=</span> <span class="n">v</span>
<span class="n">encodedValues</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_sanitizeLinearWhitespace</span><span class="p">(</span><span class="n">_v</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="p">[</span><span class="n">_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">encodedValues</span></div>
<div class="viewcode-block" id="Headers.addRawHeader">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.addRawHeader">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">addRawHeader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add a new raw value for the given header.</span>
<span class="sd"> @param name: The name of the header for which to set the value.</span>
<span class="sd"> @param value: The value to set for the named header.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">_nameEncoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">_sanitizeLinearWhitespace</span><span class="p">(</span>
<span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf8&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">value</span>
<span class="p">)</span>
<span class="p">)</span></div>
<span class="nd">@overload</span>
<span class="k">def</span><span class="w"> </span><span class="nf">getRawHeaders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Sequence</span><span class="p">[</span><span class="n">AnyStr</span><span class="p">]]:</span>
<span class="o">...</span>
<span class="nd">@overload</span>
<span class="k">def</span><span class="w"> </span><span class="nf">getRawHeaders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">_T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="n">Sequence</span><span class="p">[</span><span class="n">AnyStr</span><span class="p">],</span> <span class="n">_T</span><span class="p">]:</span>
<span class="o">...</span>
<div class="viewcode-block" id="Headers.getRawHeaders">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.getRawHeaders">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">getRawHeaders</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">_T</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="n">Sequence</span><span class="p">[</span><span class="n">AnyStr</span><span class="p">],</span> <span class="n">Optional</span><span class="p">[</span><span class="n">_T</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a sequence of headers matching the given name as the raw string</span>
<span class="sd"> given.</span>
<span class="sd"> @param name: The name of the HTTP header to get the values of.</span>
<span class="sd"> @param default: The value to return if no header with the given C{name}</span>
<span class="sd"> exists.</span>
<span class="sd"> @return: If the named header is present, a sequence of its</span>
<span class="sd"> values. Otherwise, C{default}.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">encodedName</span> <span class="o">=</span> <span class="n">_nameEncoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">values</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">encodedName</span><span class="p">,</span> <span class="p">[])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">values</span><span class="p">:</span>
<span class="k">return</span> <span class="n">default</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">v</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf8&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">]</span>
<span class="k">return</span> <span class="n">values</span></div>
<div class="viewcode-block" id="Headers.getAllRawHeaders">
<a class="viewcode-back" href="../../../api/evennia.server.portal.discord.html#evennia.contrib.rpg.llm.llm_client.Headers.getAllRawHeaders">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">getAllRawHeaders</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">bytes</span><span class="p">]]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return an iterator of key, value pairs of all headers contained in this</span>
<span class="sd"> object, as L{bytes}. The keys are capitalized in canonical</span>
<span class="sd"> capitalization.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rawHeaders</span><span class="o">.</span><span class="n">items</span><span class="p">())</span></div>
</div>
<span class="k">class</span><span class="w"> </span><span class="nc">_NameEncoder</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> C{_NameEncoder} converts HTTP header names to L{bytes} and canonicalizies</span>
<span class="sd"> their capitalization.</span>
<span class="sd"> @cvar _caseMappings: A L{dict} that maps conventionally-capitalized</span>
<span class="sd"> header names to their canonicalized representation, for headers with</span>
<span class="sd"> unconventional capitalization.</span>
<span class="sd"> @cvar _canonicalHeaderCache: A L{dict} that maps header names to their</span>
<span class="sd"> canonicalized representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;_canonicalHeaderCache&quot;</span><span class="p">,)</span>
<span class="n">_canonicalHeaderCache</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">str</span><span class="p">],</span> <span class="nb">bytes</span><span class="p">]</span>
<span class="n">_caseMappings</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]]</span> <span class="o">=</span> <span class="p">{</span>
<span class="sa">b</span><span class="s2">&quot;Content-Md5&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;Content-MD5&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;Dnt&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;DNT&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;Etag&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;ETag&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;P3p&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;P3P&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;Te&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;TE&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;Www-Authenticate&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;WWW-Authenticate&quot;</span><span class="p">,</span>
<span class="sa">b</span><span class="s2">&quot;X-Xss-Protection&quot;</span><span class="p">:</span> <span class="sa">b</span><span class="s2">&quot;X-XSS-Protection&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">_MAX_CACHED_HEADERS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10_000</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_canonicalHeaderCache</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">encode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bytes</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Encode the name of a header (eg &#39;Content-Type&#39;) to an ISO-8859-1</span>
<span class="sd"> bytestring if required. It will be canonicalized to Http-Header-Case.</span>
<span class="sd"> @raises InvalidHeaderName:</span>
<span class="sd"> If the header name contains invalid characters like whitespace</span>
<span class="sd"> or NUL.</span>
<span class="sd"> @param name: An HTTP header name</span>
<span class="sd"> @return: C{name}, encoded if required, in Header-Case</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">canonicalName</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_canonicalHeaderCache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="n">canonicalName</span>
<span class="n">bytes_name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;iso-8859-1&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">name</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_istoken</span><span class="p">(</span><span class="n">bytes_name</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">InvalidHeaderName</span><span class="p">(</span><span class="n">bytes_name</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;-&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">bytes_name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;-&quot;</span><span class="p">)])</span>
<span class="c1"># Some headers have special capitalization:</span>
<span class="k">if</span> <span class="n">result</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_caseMappings</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_caseMappings</span><span class="p">[</span><span class="n">result</span><span class="p">]</span>
<span class="c1"># In general, we should only see a very small number of header</span>
<span class="c1"># variations in the real world, so caching them is fine. However, an</span>
<span class="c1"># attacker could generate infinite header variations to fill up RAM, so</span>
<span class="c1"># we cap how many we cache. The performance degradation from lack of</span>
<span class="c1"># caching won&#39;t be that bad, and legit traffic won&#39;t hit it.</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_canonicalHeaderCache</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_MAX_CACHED_HEADERS</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_canonicalHeaderCache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
<span class="k">return</span> <span class="n">result</span>
<span class="n">_nameEncoder</span> <span class="o">=</span> <span class="n">_NameEncoder</span><span class="p">()</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">The global name encoder.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Headers&quot;</span><span class="p">]</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">twisted.web.http_headers</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>