Update docs.

This commit is contained in:
Boris Baldassari 2024-03-06 18:33:41 +01:00
parent 24a0ce0310
commit 59eec96236
14 changed files with 2522 additions and 653 deletions

View file

@ -19,18 +19,20 @@
<input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
<div> <h2>Available Modules</h2>
<ul>
<li><a href="tests.html">tests</a></li>
<li><a href="tests/test_file.html">tests.test_file</a></li>
<li><a href="tests/test_http_request.html">tests.test_http_request</a></li>
<li><a href="tests/test_log.html">tests.test_log</a></li>
<li><a href="tests/test_server.html">tests.test_server</a></li>
<li><a href="src.html">src</a></li>
<li><a href="src/myserver.html">src.myserver</a></li>
<li><a href="src/myserver/cli.html">src.myserver.cli</a></li>
<li><a href="src/myserver/date.html">src.myserver.date</a></li>
<li><a href="src/myserver/file.html">src.myserver.file</a></li>
<li><a href="src/myserver/http.html">src.myserver.http</a></li>
<li><a href="src/myserver/http_request.html">src.myserver.http_request</a></li>
<li><a href="src/myserver/log.html">src.myserver.log</a></li>
<li><a href="src/myserver/server.html">src.myserver.server</a></li>
<li><a href="tests.html">tests</a></li>
<li><a href="tests/test_http_request.html">tests.test_http_request</a></li>
<li><a href="tests/test_log.html">tests.test_log</a></li>
<li><a href="tests/test_server.html">tests.test_server</a></li>
</ul>
</div>
</nav>

File diff suppressed because one or more lines are too long

View file

@ -32,6 +32,7 @@
<li><a href="myserver/cli.html">cli</a></li>
<li><a href="myserver/date.html">date</a></li>
<li><a href="myserver/file.html">file</a></li>
<li><a href="myserver/http.html">http</a></li>
<li><a href="myserver/http_request.html">http_request</a></li>
<li><a href="myserver/log.html">log</a></li>
<li><a href="myserver/server.html">server</a></li>
@ -51,12 +52,30 @@
<h1 class="modulename">
<a href="./../src.html">src</a><wbr>.myserver </h1>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This module (file) defines the directory as a Python module.</p>
</div>
<input id="mod-myserver-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-myserver-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">1</span></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">This module (file) defines the directory as a Python module.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span></pre></div>

View file

@ -52,9 +52,9 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.cli </h1>
<div class="docstring"><p>A module for learning network programming in Python.</p>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This functions manage the command line interface to control the server.</p>
<p>This module (file) manages the command line interface to control the server.</p>
</div>
<input id="mod-cli-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -72,9 +72,9 @@
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">A module for learning network programming in Python.</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">This functions manage the command line interface to control the server.</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">This module (file) manages the command line interface to control the server.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">import</span> <span class="nn">argparse</span>

View file

@ -49,17 +49,37 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.date </h1>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This module (file) manages date related-utilities.</p>
</div>
<input id="mod-date-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-date-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">1</span></a><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">gmtime</span><span class="p">,</span> <span class="n">strftime</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos">2</span></a>
</span><span id="L-3"><a href="#L-3"><span class="linenos">3</span></a><span class="n">_RFC2616_DATE_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S GMT&#39;</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos">4</span></a>
</span><span id="L-5"><a href="#L-5"><span class="linenos">5</span></a><span class="k">def</span> <span class="nf">now_rfc2616</span><span class="p">():</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos">6</span></a> <span class="k">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">_RFC2616_DATE_FORMAT</span><span class="p">,</span> <span class="n">gmtime</span><span class="p">())</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">This module (file) manages date related-utilities.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">gmtime</span><span class="p">,</span> <span class="n">strftime</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="n">_RFC2616_DATE_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S GMT&#39;</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="k">def</span> <span class="nf">now_rfc2616</span><span class="p">():</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a> <span class="k">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">_RFC2616_DATE_FORMAT</span><span class="p">,</span> <span class="n">gmtime</span><span class="p">())</span>
</span></pre></div>
@ -75,8 +95,8 @@
</div>
<a class="headerlink" href="#now_rfc2616"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="now_rfc2616-6"><a href="#now_rfc2616-6"><span class="linenos">6</span></a><span class="k">def</span> <span class="nf">now_rfc2616</span><span class="p">():</span>
</span><span id="now_rfc2616-7"><a href="#now_rfc2616-7"><span class="linenos">7</span></a> <span class="k">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">_RFC2616_DATE_FORMAT</span><span class="p">,</span> <span class="n">gmtime</span><span class="p">())</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="now_rfc2616-22"><a href="#now_rfc2616-22"><span class="linenos">22</span></a><span class="k">def</span> <span class="nf">now_rfc2616</span><span class="p">():</span>
</span><span id="now_rfc2616-23"><a href="#now_rfc2616-23"><span class="linenos">23</span></a> <span class="k">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">_RFC2616_DATE_FORMAT</span><span class="p">,</span> <span class="n">gmtime</span><span class="p">())</span>
</span></pre></div>

View file

@ -31,10 +31,13 @@
<h2>API Documentation</h2>
<ul class="memberlist">
<li>
<a class="function" href="#get_resource">get_resource</a>
<a class="function" href="#resolve_location">resolve_location</a>
</li>
<li>
<a class="function" href="#resolve_location">resolve_location</a>
<a class="function" href="#resolve_path">resolve_path</a>
</li>
<li>
<a class="function" href="#get_resource">get_resource</a>
</li>
</ul>
@ -52,147 +55,131 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.file </h1>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This module (file) manages operations relative to the file system.</p>
</div>
<input id="mod-file-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-file-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="kn">import</span> <span class="nn">os.path</span> <span class="k">as</span> <span class="nn">path</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="n">_404_CONTENT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;&lt;html&gt;</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="s2">&lt;body&gt;</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="s2"> &lt;h1&gt;Erreur 404&lt;/h1&gt;</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="s2"> &lt;p&gt;Vous avez traversé les limites du Web. Où que vous soyez, ce n&#39;est sur aucune carte.&lt;/p&gt;</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="s2">&lt;/body&gt;</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="s2">&lt;/html&gt;</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="n">_500_CONTENT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;&lt;html&gt;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="s2">&lt;body&gt;</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="s2"> &lt;h1&gt;Erreur 500 : InTERNal SRveR ER0ooOR&lt;/h1&gt;</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="s2"> &lt;p&gt;Ça marche pas.&lt;/p&gt;</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="s2">&lt;/body&gt;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="s2">&lt;/html&gt;</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="k">def</span> <span class="nf">get_resource</span><span class="p">(</span><span class="n">res</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the resource requested by a GET request.</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd"> Parameters</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="sd"> ----------</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="sd"> - res: str</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="sd"> Requested resource string.</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a><span class="sd"> - root: str</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="sd"> Root directory of the server.</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a><span class="sd"> Returns</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="sd"> -------</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a><span class="sd"> int </span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a><span class="sd"> The response HTTP code.</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a><span class="sd"> bytes</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a><span class="sd"> The resource content.</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">code</span><span class="p">,</span> <span class="n">res_path</span> <span class="o">=</span> <span class="n">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="k">return</span> <span class="mi">404</span><span class="p">,</span> <span class="n">_404_CONTENT</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="k">elif</span> <span class="n">code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="k">return</span> <span class="mi">500</span><span class="p">,</span> <span class="n">_500_CONTENT</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Opening file </span><span class="si">{</span><span class="n">res_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">res_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="k">return</span> <span class="mi">200</span><span class="p">,</span> <span class="n">content</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a><span class="k">def</span> <span class="nf">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="c1"># Resolve the home directory if it is in the root </span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="n">root</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a> <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;index.html&quot;</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="n">res</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span> <span class="ow">and</span> <span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">res_path</span><span class="p">)):</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a> <span class="k">return</span> <span class="mi">404</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a> <span class="c1"># if path.isdir(res_path):</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a> <span class="c1"># if not path.exists(res_path):</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a> <span class="c1"># return 404, _404_CONTENT</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="k">return</span> <span class="mi">200</span><span class="p">,</span> <span class="n">res_path</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This module (file) manages operations relative to the file system.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">import</span> <span class="nn">os.path</span> <span class="k">as</span> <span class="nn">path</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="k">def</span> <span class="nf">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the path of a resource relative to the root and its extension.</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> Returns (&quot;&quot;, &quot;&quot;) if the concatenated path does not exist.</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> &quot;index.html&quot; is appended to directory paths.</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> Parameters</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="sd"> ----------</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="sd"> res: str </span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> The queried resource path.</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd"> root: str </span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="sd"> The root directory where to look into for res.</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd"> Returns</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="sd"> -------</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a><span class="sd"> str</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="sd"> The full disk path of the resource if it exists, or &quot;&quot;.</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a><span class="sd"> str</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a><span class="sd"> The extension of the resource if it exists, or &quot;&quot;.</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">resolve_path</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="c1"># Compute file extension</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="n">extension</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">res_path</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="c1"># Maybe remove leading &#39;.&#39;</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">extension</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">extension</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;.&#39;</span><span class="p">:</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">extension</span> <span class="o">=</span> <span class="n">extension</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="k">return</span> <span class="n">res_path</span><span class="p">,</span> <span class="n">extension</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a><span class="k">def</span> <span class="nf">resolve_path</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the full disk path of a resource relative to the root.</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a><span class="sd"> Returns &quot;&quot; if the concatenated path does not exist.</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="sd"> &quot;index.html&quot; is appended to directory paths.</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="sd"> Parameters</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> ----------</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> res: str </span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="sd"> The queried resource path.</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a><span class="sd"> root: str </span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a><span class="sd"> The root directory where to look into for res.</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a><span class="sd"> Returns</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a><span class="sd"> -------</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a><span class="sd"> str</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a><span class="sd"> The full disk path of the resource if it exists, or &quot;&quot;.</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="c1"># Resolve the home directory if it is in the root</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">root</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;index.html&quot;</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">while</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">res</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span> <span class="ow">and</span> <span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">res_path</span><span class="p">)):</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">return</span> <span class="n">res_path</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="k">def</span> <span class="nf">get_resource</span><span class="p">(</span><span class="n">res_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a resource at res_path, its content type and an HTTP code.</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="sd"> Parameters</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a><span class="sd"> ----------</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd"> - res_path: str</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd"> Requested resource string.</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="sd"> Returns</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="sd"> -------</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd"> bytes</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd"> The resource content if it exists (code == 200).</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="sd"> int </span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd"> A HTTP status code.</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Opening file </span><span class="si">{</span><span class="n">res_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">res_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="k">return</span> <span class="n">content</span><span class="p">,</span> <span class="mi">200</span>
</span></pre></div>
</section>
<section id="get_resource">
<input id="get_resource-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">get_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">res</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">root</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="get_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_resource-22"><a href="#get_resource-22"><span class="linenos">22</span></a><span class="k">def</span> <span class="nf">get_resource</span><span class="p">(</span><span class="n">res</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="get_resource-23"><a href="#get_resource-23"><span class="linenos">23</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the resource requested by a GET request.</span>
</span><span id="get_resource-24"><a href="#get_resource-24"><span class="linenos">24</span></a>
</span><span id="get_resource-25"><a href="#get_resource-25"><span class="linenos">25</span></a><span class="sd"> Parameters</span>
</span><span id="get_resource-26"><a href="#get_resource-26"><span class="linenos">26</span></a><span class="sd"> ----------</span>
</span><span id="get_resource-27"><a href="#get_resource-27"><span class="linenos">27</span></a><span class="sd"> - res: str</span>
</span><span id="get_resource-28"><a href="#get_resource-28"><span class="linenos">28</span></a><span class="sd"> Requested resource string.</span>
</span><span id="get_resource-29"><a href="#get_resource-29"><span class="linenos">29</span></a><span class="sd"> - root: str</span>
</span><span id="get_resource-30"><a href="#get_resource-30"><span class="linenos">30</span></a><span class="sd"> Root directory of the server.</span>
</span><span id="get_resource-31"><a href="#get_resource-31"><span class="linenos">31</span></a>
</span><span id="get_resource-32"><a href="#get_resource-32"><span class="linenos">32</span></a><span class="sd"> Returns</span>
</span><span id="get_resource-33"><a href="#get_resource-33"><span class="linenos">33</span></a><span class="sd"> -------</span>
</span><span id="get_resource-34"><a href="#get_resource-34"><span class="linenos">34</span></a><span class="sd"> int </span>
</span><span id="get_resource-35"><a href="#get_resource-35"><span class="linenos">35</span></a><span class="sd"> The response HTTP code.</span>
</span><span id="get_resource-36"><a href="#get_resource-36"><span class="linenos">36</span></a><span class="sd"> bytes</span>
</span><span id="get_resource-37"><a href="#get_resource-37"><span class="linenos">37</span></a><span class="sd"> The resource content.</span>
</span><span id="get_resource-38"><a href="#get_resource-38"><span class="linenos">38</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_resource-39"><a href="#get_resource-39"><span class="linenos">39</span></a>
</span><span id="get_resource-40"><a href="#get_resource-40"><span class="linenos">40</span></a> <span class="n">code</span><span class="p">,</span> <span class="n">res_path</span> <span class="o">=</span> <span class="n">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="get_resource-41"><a href="#get_resource-41"><span class="linenos">41</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="get_resource-42"><a href="#get_resource-42"><span class="linenos">42</span></a> <span class="k">return</span> <span class="mi">404</span><span class="p">,</span> <span class="n">_404_CONTENT</span>
</span><span id="get_resource-43"><a href="#get_resource-43"><span class="linenos">43</span></a> <span class="k">elif</span> <span class="n">code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="get_resource-44"><a href="#get_resource-44"><span class="linenos">44</span></a> <span class="k">return</span> <span class="mi">500</span><span class="p">,</span> <span class="n">_500_CONTENT</span>
</span><span id="get_resource-45"><a href="#get_resource-45"><span class="linenos">45</span></a>
</span><span id="get_resource-46"><a href="#get_resource-46"><span class="linenos">46</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Opening file </span><span class="si">{</span><span class="n">res_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
</span><span id="get_resource-47"><a href="#get_resource-47"><span class="linenos">47</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">res_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="get_resource-48"><a href="#get_resource-48"><span class="linenos">48</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="get_resource-49"><a href="#get_resource-49"><span class="linenos">49</span></a> <span class="k">return</span> <span class="mi">200</span><span class="p">,</span> <span class="n">content</span>
</span></pre></div>
<div class="docstring"><p>Returns the resource requested by a GET request.</p>
<h2 id="parameters">Parameters</h2>
<ul>
<li>res: str
Requested resource string.</li>
<li>root: str
Root directory of the server.</li>
</ul>
<h2 id="returns">Returns</h2>
<p>int
The response HTTP code.
bytes
The resource content.</p>
</div>
</section>
<section id="resolve_location">
<input id="resolve_location-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
@ -204,29 +191,187 @@ bytes
</div>
<a class="headerlink" href="#resolve_location"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="resolve_location-52"><a href="#resolve_location-52"><span class="linenos">52</span></a><span class="k">def</span> <span class="nf">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="resolve_location-53"><a href="#resolve_location-53"><span class="linenos">53</span></a> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span>
</span><span id="resolve_location-54"><a href="#resolve_location-54"><span class="linenos">54</span></a>
</span><span id="resolve_location-55"><a href="#resolve_location-55"><span class="linenos">55</span></a> <span class="c1"># Resolve the home directory if it is in the root </span>
</span><span id="resolve_location-56"><a href="#resolve_location-56"><span class="linenos">56</span></a> <span class="n">root</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
</span><span id="resolve_location-57"><a href="#resolve_location-57"><span class="linenos">57</span></a>
</span><span id="resolve_location-58"><a href="#resolve_location-58"><span class="linenos">58</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="resolve_location-59"><a href="#resolve_location-59"><span class="linenos">59</span></a> <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;index.html&quot;</span>
</span><span id="resolve_location-60"><a href="#resolve_location-60"><span class="linenos">60</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="resolve_location-61"><a href="#resolve_location-61"><span class="linenos">61</span></a> <span class="n">res</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="resolve_location-62"><a href="#resolve_location-62"><span class="linenos">62</span></a>
</span><span id="resolve_location-63"><a href="#resolve_location-63"><span class="linenos">63</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
</span><span id="resolve_location-64"><a href="#resolve_location-64"><span class="linenos">64</span></a>
</span><span id="resolve_location-65"><a href="#resolve_location-65"><span class="linenos">65</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span> <span class="ow">and</span> <span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">res_path</span><span class="p">)):</span>
</span><span id="resolve_location-66"><a href="#resolve_location-66"><span class="linenos">66</span></a> <span class="k">return</span> <span class="mi">404</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
</span><span id="resolve_location-67"><a href="#resolve_location-67"><span class="linenos">67</span></a> <span class="c1"># if path.isdir(res_path):</span>
</span><span id="resolve_location-68"><a href="#resolve_location-68"><span class="linenos">68</span></a> <span class="c1"># if not path.exists(res_path):</span>
</span><span id="resolve_location-69"><a href="#resolve_location-69"><span class="linenos">69</span></a> <span class="c1"># return 404, _404_CONTENT</span>
</span><span id="resolve_location-70"><a href="#resolve_location-70"><span class="linenos">70</span></a> <span class="k">return</span> <span class="mi">200</span><span class="p">,</span> <span class="n">res_path</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="resolve_location-21"><a href="#resolve_location-21"><span class="linenos">21</span></a><span class="k">def</span> <span class="nf">resolve_location</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="resolve_location-22"><a href="#resolve_location-22"><span class="linenos">22</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the path of a resource relative to the root and its extension.</span>
</span><span id="resolve_location-23"><a href="#resolve_location-23"><span class="linenos">23</span></a>
</span><span id="resolve_location-24"><a href="#resolve_location-24"><span class="linenos">24</span></a><span class="sd"> Returns (&quot;&quot;, &quot;&quot;) if the concatenated path does not exist.</span>
</span><span id="resolve_location-25"><a href="#resolve_location-25"><span class="linenos">25</span></a>
</span><span id="resolve_location-26"><a href="#resolve_location-26"><span class="linenos">26</span></a><span class="sd"> &quot;index.html&quot; is appended to directory paths.</span>
</span><span id="resolve_location-27"><a href="#resolve_location-27"><span class="linenos">27</span></a>
</span><span id="resolve_location-28"><a href="#resolve_location-28"><span class="linenos">28</span></a><span class="sd"> Parameters</span>
</span><span id="resolve_location-29"><a href="#resolve_location-29"><span class="linenos">29</span></a><span class="sd"> ----------</span>
</span><span id="resolve_location-30"><a href="#resolve_location-30"><span class="linenos">30</span></a><span class="sd"> res: str </span>
</span><span id="resolve_location-31"><a href="#resolve_location-31"><span class="linenos">31</span></a><span class="sd"> The queried resource path.</span>
</span><span id="resolve_location-32"><a href="#resolve_location-32"><span class="linenos">32</span></a><span class="sd"> root: str </span>
</span><span id="resolve_location-33"><a href="#resolve_location-33"><span class="linenos">33</span></a><span class="sd"> The root directory where to look into for res.</span>
</span><span id="resolve_location-34"><a href="#resolve_location-34"><span class="linenos">34</span></a>
</span><span id="resolve_location-35"><a href="#resolve_location-35"><span class="linenos">35</span></a><span class="sd"> Returns</span>
</span><span id="resolve_location-36"><a href="#resolve_location-36"><span class="linenos">36</span></a><span class="sd"> -------</span>
</span><span id="resolve_location-37"><a href="#resolve_location-37"><span class="linenos">37</span></a><span class="sd"> str</span>
</span><span id="resolve_location-38"><a href="#resolve_location-38"><span class="linenos">38</span></a><span class="sd"> The full disk path of the resource if it exists, or &quot;&quot;.</span>
</span><span id="resolve_location-39"><a href="#resolve_location-39"><span class="linenos">39</span></a><span class="sd"> str</span>
</span><span id="resolve_location-40"><a href="#resolve_location-40"><span class="linenos">40</span></a><span class="sd"> The extension of the resource if it exists, or &quot;&quot;.</span>
</span><span id="resolve_location-41"><a href="#resolve_location-41"><span class="linenos">41</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="resolve_location-42"><a href="#resolve_location-42"><span class="linenos">42</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="resolve_location-43"><a href="#resolve_location-43"><span class="linenos">43</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">resolve_path</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="resolve_location-44"><a href="#resolve_location-44"><span class="linenos">44</span></a>
</span><span id="resolve_location-45"><a href="#resolve_location-45"><span class="linenos">45</span></a> <span class="c1"># Compute file extension</span>
</span><span id="resolve_location-46"><a href="#resolve_location-46"><span class="linenos">46</span></a> <span class="n">extension</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">res_path</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="resolve_location-47"><a href="#resolve_location-47"><span class="linenos">47</span></a> <span class="c1"># Maybe remove leading &#39;.&#39;</span>
</span><span id="resolve_location-48"><a href="#resolve_location-48"><span class="linenos">48</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">extension</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">extension</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;.&#39;</span><span class="p">:</span>
</span><span id="resolve_location-49"><a href="#resolve_location-49"><span class="linenos">49</span></a> <span class="n">extension</span> <span class="o">=</span> <span class="n">extension</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="resolve_location-50"><a href="#resolve_location-50"><span class="linenos">50</span></a>
</span><span id="resolve_location-51"><a href="#resolve_location-51"><span class="linenos">51</span></a> <span class="k">return</span> <span class="n">res_path</span><span class="p">,</span> <span class="n">extension</span>
</span><span id="resolve_location-52"><a href="#resolve_location-52"><span class="linenos">52</span></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="resolve_location-53"><a href="#resolve_location-53"><span class="linenos">53</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
</span></pre></div>
<div class="docstring"><p>Returns the path of a resource relative to the root and its extension.</p>
<p>Returns ("", "") if the concatenated path does not exist.</p>
<p>"index.html" is appended to directory paths.</p>
<h2 id="parameters">Parameters</h2>
<p>res: str
The queried resource path.
root: str
The root directory where to look into for res.</p>
<h2 id="returns">Returns</h2>
<p>str
The full disk path of the resource if it exists, or "".
str
The extension of the resource if it exists, or "".</p>
</div>
</section>
<section id="resolve_path">
<input id="resolve_path-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">resolve_path</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">res</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">root</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="resolve_path-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#resolve_path"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="resolve_path-55"><a href="#resolve_path-55"><span class="linenos">55</span></a><span class="k">def</span> <span class="nf">resolve_path</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="resolve_path-56"><a href="#resolve_path-56"><span class="linenos">56</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the full disk path of a resource relative to the root.</span>
</span><span id="resolve_path-57"><a href="#resolve_path-57"><span class="linenos">57</span></a>
</span><span id="resolve_path-58"><a href="#resolve_path-58"><span class="linenos">58</span></a><span class="sd"> Returns &quot;&quot; if the concatenated path does not exist.</span>
</span><span id="resolve_path-59"><a href="#resolve_path-59"><span class="linenos">59</span></a>
</span><span id="resolve_path-60"><a href="#resolve_path-60"><span class="linenos">60</span></a><span class="sd"> &quot;index.html&quot; is appended to directory paths.</span>
</span><span id="resolve_path-61"><a href="#resolve_path-61"><span class="linenos">61</span></a>
</span><span id="resolve_path-62"><a href="#resolve_path-62"><span class="linenos">62</span></a><span class="sd"> Parameters</span>
</span><span id="resolve_path-63"><a href="#resolve_path-63"><span class="linenos">63</span></a><span class="sd"> ----------</span>
</span><span id="resolve_path-64"><a href="#resolve_path-64"><span class="linenos">64</span></a><span class="sd"> res: str </span>
</span><span id="resolve_path-65"><a href="#resolve_path-65"><span class="linenos">65</span></a><span class="sd"> The queried resource path.</span>
</span><span id="resolve_path-66"><a href="#resolve_path-66"><span class="linenos">66</span></a><span class="sd"> root: str </span>
</span><span id="resolve_path-67"><a href="#resolve_path-67"><span class="linenos">67</span></a><span class="sd"> The root directory where to look into for res.</span>
</span><span id="resolve_path-68"><a href="#resolve_path-68"><span class="linenos">68</span></a>
</span><span id="resolve_path-69"><a href="#resolve_path-69"><span class="linenos">69</span></a><span class="sd"> Returns</span>
</span><span id="resolve_path-70"><a href="#resolve_path-70"><span class="linenos">70</span></a><span class="sd"> -------</span>
</span><span id="resolve_path-71"><a href="#resolve_path-71"><span class="linenos">71</span></a><span class="sd"> str</span>
</span><span id="resolve_path-72"><a href="#resolve_path-72"><span class="linenos">72</span></a><span class="sd"> The full disk path of the resource if it exists, or &quot;&quot;.</span>
</span><span id="resolve_path-73"><a href="#resolve_path-73"><span class="linenos">73</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="resolve_path-74"><a href="#resolve_path-74"><span class="linenos">74</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="resolve_path-75"><a href="#resolve_path-75"><span class="linenos">75</span></a> <span class="c1"># Resolve the home directory if it is in the root</span>
</span><span id="resolve_path-76"><a href="#resolve_path-76"><span class="linenos">76</span></a> <span class="n">root</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
</span><span id="resolve_path-77"><a href="#resolve_path-77"><span class="linenos">77</span></a>
</span><span id="resolve_path-78"><a href="#resolve_path-78"><span class="linenos">78</span></a> <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="resolve_path-79"><a href="#resolve_path-79"><span class="linenos">79</span></a> <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;index.html&quot;</span>
</span><span id="resolve_path-80"><a href="#resolve_path-80"><span class="linenos">80</span></a> <span class="k">while</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
</span><span id="resolve_path-81"><a href="#resolve_path-81"><span class="linenos">81</span></a> <span class="n">res</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span id="resolve_path-82"><a href="#resolve_path-82"><span class="linenos">82</span></a>
</span><span id="resolve_path-83"><a href="#resolve_path-83"><span class="linenos">83</span></a> <span class="n">res_path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
</span><span id="resolve_path-84"><a href="#resolve_path-84"><span class="linenos">84</span></a>
</span><span id="resolve_path-85"><a href="#resolve_path-85"><span class="linenos">85</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span> <span class="ow">and</span> <span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">res_path</span><span class="p">)):</span>
</span><span id="resolve_path-86"><a href="#resolve_path-86"><span class="linenos">86</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
</span><span id="resolve_path-87"><a href="#resolve_path-87"><span class="linenos">87</span></a> <span class="k">return</span> <span class="n">res_path</span>
</span><span id="resolve_path-88"><a href="#resolve_path-88"><span class="linenos">88</span></a> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="resolve_path-89"><a href="#resolve_path-89"><span class="linenos">89</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span>
</span></pre></div>
<div class="docstring"><p>Returns the full disk path of a resource relative to the root.</p>
<p>Returns "" if the concatenated path does not exist.</p>
<p>"index.html" is appended to directory paths.</p>
<h2 id="parameters">Parameters</h2>
<p>res: str
The queried resource path.
root: str
The root directory where to look into for res.</p>
<h2 id="returns">Returns</h2>
<p>str
The full disk path of the resource if it exists, or "".</p>
</div>
</section>
<section id="get_resource">
<input id="get_resource-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">get_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">res_path</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="get_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#get_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="get_resource-93"><a href="#get_resource-93"><span class="linenos"> 93</span></a><span class="k">def</span> <span class="nf">get_resource</span><span class="p">(</span><span class="n">res_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="get_resource-94"><a href="#get_resource-94"><span class="linenos"> 94</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a resource at res_path, its content type and an HTTP code.</span>
</span><span id="get_resource-95"><a href="#get_resource-95"><span class="linenos"> 95</span></a>
</span><span id="get_resource-96"><a href="#get_resource-96"><span class="linenos"> 96</span></a><span class="sd"> Parameters</span>
</span><span id="get_resource-97"><a href="#get_resource-97"><span class="linenos"> 97</span></a><span class="sd"> ----------</span>
</span><span id="get_resource-98"><a href="#get_resource-98"><span class="linenos"> 98</span></a><span class="sd"> - res_path: str</span>
</span><span id="get_resource-99"><a href="#get_resource-99"><span class="linenos"> 99</span></a><span class="sd"> Requested resource string.</span>
</span><span id="get_resource-100"><a href="#get_resource-100"><span class="linenos">100</span></a>
</span><span id="get_resource-101"><a href="#get_resource-101"><span class="linenos">101</span></a><span class="sd"> Returns</span>
</span><span id="get_resource-102"><a href="#get_resource-102"><span class="linenos">102</span></a><span class="sd"> -------</span>
</span><span id="get_resource-103"><a href="#get_resource-103"><span class="linenos">103</span></a><span class="sd"> bytes</span>
</span><span id="get_resource-104"><a href="#get_resource-104"><span class="linenos">104</span></a><span class="sd"> The resource content if it exists (code == 200).</span>
</span><span id="get_resource-105"><a href="#get_resource-105"><span class="linenos">105</span></a><span class="sd"> int </span>
</span><span id="get_resource-106"><a href="#get_resource-106"><span class="linenos">106</span></a><span class="sd"> A HTTP status code.</span>
</span><span id="get_resource-107"><a href="#get_resource-107"><span class="linenos">107</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="get_resource-108"><a href="#get_resource-108"><span class="linenos">108</span></a>
</span><span id="get_resource-109"><a href="#get_resource-109"><span class="linenos">109</span></a>
</span><span id="get_resource-110"><a href="#get_resource-110"><span class="linenos">110</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Opening file </span><span class="si">{</span><span class="n">res_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
</span><span id="get_resource-111"><a href="#get_resource-111"><span class="linenos">111</span></a> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">res_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span id="get_resource-112"><a href="#get_resource-112"><span class="linenos">112</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span id="get_resource-113"><a href="#get_resource-113"><span class="linenos">113</span></a> <span class="k">return</span> <span class="n">content</span><span class="p">,</span> <span class="mi">200</span>
</span></pre></div>
<div class="docstring"><p>Returns a resource at res_path, its content type and an HTTP code.</p>
<h2 id="parameters">Parameters</h2>
<ul>
<li>res_path: str
Requested resource string.</li>
</ul>
<h2 id="returns">Returns</h2>
<p>bytes
The resource content if it exists (code == 200).
int
A HTTP status code.</p>
</div>
</section>
</main>

File diff suppressed because one or more lines are too long

View file

@ -55,9 +55,9 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.http_request </h1>
<div class="docstring"><p>A module for learning network programming in Python.</p>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This functions handle the http messages.</p>
<p>This module (file) manages the parsing of HTTP requests.</p>
</div>
<input id="mod-http_request-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -75,120 +75,122 @@
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A module for learning network programming in Python.</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This functions handle the http messages.</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This module (file) manages the parsing of HTTP requests.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="k">def</span> <span class="nf">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">]:</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a full HTTP request bytes buffer into a dict. </span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="sd"> - head: dict[str, str]</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="sd"> Information on the HTTP request header (i.e. the first request line);</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> output of `parse_request_head`.</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> - params: dict[str, str]</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> List of the HTTP parameters (i.e. the following lines); </span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> output of `parse_request_params`.</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="sd"> Parameters</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="sd"> ----------</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> - buf: bytes </span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd"> The HTTP request buffer.</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd"> Returns</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd"> -------</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a><span class="sd"> Raises</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a><span class="sd"> ------</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="sd"> ValueError</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">if</span> <span class="n">buf</span> <span class="o">==</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">:</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Received empty request&quot;</span><span class="p">)</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="n">lines</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">req_head</span> <span class="o">=</span> <span class="n">parse_request_head</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="n">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">head</span><span class="o">=</span><span class="n">req_head</span><span class="p">,</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a><span class="k">def</span> <span class="nf">parse_request_head</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a HTTP request header string (its first line) into a dict.</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="sd"> - verb: str</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> The _uppercase_ verb of the request, i.e. the first word of the line;</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="sd"> - resource: str</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a><span class="sd"> The requested resource, i.e. the second &quot;word&quot; of the line;</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a><span class="sd"> </span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a><span class="sd"> Parameters</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a><span class="sd"> ----------</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a><span class="sd"> - line: str</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="sd"> Returns</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a><span class="sd"> -------</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd"> </span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> Raises</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> ------</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="sd"> ValueError</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request header is invalid: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">verb</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">resource</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="p">)</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="k">def</span> <span class="nf">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses HTTP request parameters (a list of lines) into a dict.</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="sd"> The parsed request dict contains one key/value pair per line, with the </span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a><span class="sd"> dict key being the left part of the line (the parameter key), and the </span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="sd"> The function strips leading and trailing spaces: &quot; Host: a.org &quot; becomes</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="sd"> </span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd"> Parameters</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd"> ----------</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd"> HTTP parameters (one list item per line)</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd"> Returns</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd"> -------</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> </span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> Raises</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> ------</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> ValueError</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">kv</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;: &#39;</span><span class="p">)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request line is not a valid key/value pair: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">params</span><span class="p">[</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="k">return</span> <span class="n">params</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="c1"># TODO: Gestion de la casse des paramètres ? </span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="k">def</span> <span class="nf">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">]:</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a full HTTP request bytes buffer into a dict. </span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> - head: dict[str, str]</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> Information on the HTTP request header (i.e. the first request line);</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> output of `parse_request_head`.</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> - params: dict[str, str]</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> List of the HTTP parameters (i.e. the following lines); </span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="sd"> output of `parse_request_params`.</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> Parameters</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd"> ----------</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="sd"> - buf: bytes </span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd"> The HTTP request buffer.</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="sd"> Returns</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a><span class="sd"> -------</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="sd"> Raises</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a><span class="sd"> ------</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a><span class="sd"> ValueError</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="n">buf</span> <span class="o">==</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Received empty request&quot;</span><span class="p">)</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">lines</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="n">req_head</span> <span class="o">=</span> <span class="n">parse_request_head</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="n">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">head</span><span class="o">=</span><span class="n">req_head</span><span class="p">,</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="p">)</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="k">def</span> <span class="nf">parse_request_head</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a HTTP request header string (its first line) into a dict.</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> - verb: str</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="sd"> The _uppercase_ verb of the request, i.e. the first word of the line;</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a><span class="sd"> - resource: str</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a><span class="sd"> The requested resource, i.e. the second &quot;word&quot; of the line;</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a><span class="sd"> </span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a><span class="sd"> Parameters</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a><span class="sd"> ----------</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a><span class="sd"> - line: str</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="sd"> Returns</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a><span class="sd"> -------</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> </span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="sd"> Raises</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> ------</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> ValueError</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request header is invalid: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">verb</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">resource</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="k">def</span> <span class="nf">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses HTTP request parameters (a list of lines) into a dict.</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd"> The parsed request dict contains one key/value pair per line, with the </span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd"> dict key being the left part of the line (the parameter key), and the </span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="sd"> The function strips leading and trailing spaces: &quot; Host: a.org &quot; becomes</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd"> </span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="sd"> Parameters</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd"> ----------</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd"> HTTP parameters (one list item per line)</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> Returns</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="sd"> -------</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> </span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> Raises</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> ------</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> ValueError</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">kv</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;: &#39;</span><span class="p">)</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request line is not a valid key/value pair: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">params</span><span class="p">[</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">return</span> <span class="n">params</span>
</span></pre></div>
@ -204,45 +206,45 @@
</div>
<a class="headerlink" href="#parse_request"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request-18"><a href="#parse_request-18"><span class="linenos">18</span></a><span class="k">def</span> <span class="nf">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">]:</span>
</span><span id="parse_request-19"><a href="#parse_request-19"><span class="linenos">19</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a full HTTP request bytes buffer into a dict. </span>
</span><span id="parse_request-20"><a href="#parse_request-20"><span class="linenos">20</span></a>
</span><span id="parse_request-21"><a href="#parse_request-21"><span class="linenos">21</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="parse_request-22"><a href="#parse_request-22"><span class="linenos">22</span></a><span class="sd"> - head: dict[str, str]</span>
</span><span id="parse_request-23"><a href="#parse_request-23"><span class="linenos">23</span></a><span class="sd"> Information on the HTTP request header (i.e. the first request line);</span>
</span><span id="parse_request-24"><a href="#parse_request-24"><span class="linenos">24</span></a><span class="sd"> output of `parse_request_head`.</span>
</span><span id="parse_request-25"><a href="#parse_request-25"><span class="linenos">25</span></a><span class="sd"> - params: dict[str, str]</span>
</span><span id="parse_request-26"><a href="#parse_request-26"><span class="linenos">26</span></a><span class="sd"> List of the HTTP parameters (i.e. the following lines); </span>
</span><span id="parse_request-27"><a href="#parse_request-27"><span class="linenos">27</span></a><span class="sd"> output of `parse_request_params`.</span>
</span><span id="parse_request-28"><a href="#parse_request-28"><span class="linenos">28</span></a>
</span><span id="parse_request-29"><a href="#parse_request-29"><span class="linenos">29</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request-30"><a href="#parse_request-30"><span class="linenos">30</span></a><span class="sd"> ----------</span>
</span><span id="parse_request-31"><a href="#parse_request-31"><span class="linenos">31</span></a><span class="sd"> - buf: bytes </span>
</span><span id="parse_request-32"><a href="#parse_request-32"><span class="linenos">32</span></a><span class="sd"> The HTTP request buffer.</span>
</span><span id="parse_request-33"><a href="#parse_request-33"><span class="linenos">33</span></a>
</span><span id="parse_request-34"><a href="#parse_request-34"><span class="linenos">34</span></a><span class="sd"> Returns</span>
</span><span id="parse_request-35"><a href="#parse_request-35"><span class="linenos">35</span></a><span class="sd"> -------</span>
</span><span id="parse_request-36"><a href="#parse_request-36"><span class="linenos">36</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="parse_request-37"><a href="#parse_request-37"><span class="linenos">37</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="parse_request-38"><a href="#parse_request-38"><span class="linenos">38</span></a>
</span><span id="parse_request-39"><a href="#parse_request-39"><span class="linenos">39</span></a><span class="sd"> Raises</span>
</span><span id="parse_request-40"><a href="#parse_request-40"><span class="linenos">40</span></a><span class="sd"> ------</span>
</span><span id="parse_request-41"><a href="#parse_request-41"><span class="linenos">41</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request-42"><a href="#parse_request-42"><span class="linenos">42</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="parse_request-43"><a href="#parse_request-43"><span class="linenos">43</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request-44"><a href="#parse_request-44"><span class="linenos">44</span></a> <span class="k">if</span> <span class="n">buf</span> <span class="o">==</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">:</span>
</span><span id="parse_request-45"><a href="#parse_request-45"><span class="linenos">45</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Received empty request&quot;</span><span class="p">)</span>
</span><span id="parse_request-46"><a href="#parse_request-46"><span class="linenos">46</span></a> <span class="n">lines</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
</span><span id="parse_request-47"><a href="#parse_request-47"><span class="linenos">47</span></a>
</span><span id="parse_request-48"><a href="#parse_request-48"><span class="linenos">48</span></a> <span class="n">req_head</span> <span class="o">=</span> <span class="n">parse_request_head</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="parse_request-49"><a href="#parse_request-49"><span class="linenos">49</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="parse_request-50"><a href="#parse_request-50"><span class="linenos">50</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="parse_request-51"><a href="#parse_request-51"><span class="linenos">51</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="n">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="parse_request-52"><a href="#parse_request-52"><span class="linenos">52</span></a>
</span><span id="parse_request-53"><a href="#parse_request-53"><span class="linenos">53</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request-54"><a href="#parse_request-54"><span class="linenos">54</span></a> <span class="n">head</span><span class="o">=</span><span class="n">req_head</span><span class="p">,</span>
</span><span id="parse_request-55"><a href="#parse_request-55"><span class="linenos">55</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="parse_request-56"><a href="#parse_request-56"><span class="linenos">56</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request-20"><a href="#parse_request-20"><span class="linenos">20</span></a><span class="k">def</span> <span class="nf">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">]:</span>
</span><span id="parse_request-21"><a href="#parse_request-21"><span class="linenos">21</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a full HTTP request bytes buffer into a dict. </span>
</span><span id="parse_request-22"><a href="#parse_request-22"><span class="linenos">22</span></a>
</span><span id="parse_request-23"><a href="#parse_request-23"><span class="linenos">23</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="parse_request-24"><a href="#parse_request-24"><span class="linenos">24</span></a><span class="sd"> - head: dict[str, str]</span>
</span><span id="parse_request-25"><a href="#parse_request-25"><span class="linenos">25</span></a><span class="sd"> Information on the HTTP request header (i.e. the first request line);</span>
</span><span id="parse_request-26"><a href="#parse_request-26"><span class="linenos">26</span></a><span class="sd"> output of `parse_request_head`.</span>
</span><span id="parse_request-27"><a href="#parse_request-27"><span class="linenos">27</span></a><span class="sd"> - params: dict[str, str]</span>
</span><span id="parse_request-28"><a href="#parse_request-28"><span class="linenos">28</span></a><span class="sd"> List of the HTTP parameters (i.e. the following lines); </span>
</span><span id="parse_request-29"><a href="#parse_request-29"><span class="linenos">29</span></a><span class="sd"> output of `parse_request_params`.</span>
</span><span id="parse_request-30"><a href="#parse_request-30"><span class="linenos">30</span></a>
</span><span id="parse_request-31"><a href="#parse_request-31"><span class="linenos">31</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request-32"><a href="#parse_request-32"><span class="linenos">32</span></a><span class="sd"> ----------</span>
</span><span id="parse_request-33"><a href="#parse_request-33"><span class="linenos">33</span></a><span class="sd"> - buf: bytes </span>
</span><span id="parse_request-34"><a href="#parse_request-34"><span class="linenos">34</span></a><span class="sd"> The HTTP request buffer.</span>
</span><span id="parse_request-35"><a href="#parse_request-35"><span class="linenos">35</span></a>
</span><span id="parse_request-36"><a href="#parse_request-36"><span class="linenos">36</span></a><span class="sd"> Returns</span>
</span><span id="parse_request-37"><a href="#parse_request-37"><span class="linenos">37</span></a><span class="sd"> -------</span>
</span><span id="parse_request-38"><a href="#parse_request-38"><span class="linenos">38</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="parse_request-39"><a href="#parse_request-39"><span class="linenos">39</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="parse_request-40"><a href="#parse_request-40"><span class="linenos">40</span></a>
</span><span id="parse_request-41"><a href="#parse_request-41"><span class="linenos">41</span></a><span class="sd"> Raises</span>
</span><span id="parse_request-42"><a href="#parse_request-42"><span class="linenos">42</span></a><span class="sd"> ------</span>
</span><span id="parse_request-43"><a href="#parse_request-43"><span class="linenos">43</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request-44"><a href="#parse_request-44"><span class="linenos">44</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="parse_request-45"><a href="#parse_request-45"><span class="linenos">45</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request-46"><a href="#parse_request-46"><span class="linenos">46</span></a> <span class="k">if</span> <span class="n">buf</span> <span class="o">==</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">:</span>
</span><span id="parse_request-47"><a href="#parse_request-47"><span class="linenos">47</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Received empty request&quot;</span><span class="p">)</span>
</span><span id="parse_request-48"><a href="#parse_request-48"><span class="linenos">48</span></a> <span class="n">lines</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
</span><span id="parse_request-49"><a href="#parse_request-49"><span class="linenos">49</span></a>
</span><span id="parse_request-50"><a href="#parse_request-50"><span class="linenos">50</span></a> <span class="n">req_head</span> <span class="o">=</span> <span class="n">parse_request_head</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="parse_request-51"><a href="#parse_request-51"><span class="linenos">51</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="parse_request-52"><a href="#parse_request-52"><span class="linenos">52</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="parse_request-53"><a href="#parse_request-53"><span class="linenos">53</span></a> <span class="n">req_params</span> <span class="o">=</span> <span class="n">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="parse_request-54"><a href="#parse_request-54"><span class="linenos">54</span></a>
</span><span id="parse_request-55"><a href="#parse_request-55"><span class="linenos">55</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request-56"><a href="#parse_request-56"><span class="linenos">56</span></a> <span class="n">head</span><span class="o">=</span><span class="n">req_head</span><span class="p">,</span>
</span><span id="parse_request-57"><a href="#parse_request-57"><span class="linenos">57</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="parse_request-58"><a href="#parse_request-58"><span class="linenos">58</span></a> <span class="p">)</span>
</span></pre></div>
@ -290,40 +292,40 @@ The HTTP request buffer.</li>
</div>
<a class="headerlink" href="#parse_request_head"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_head-58"><a href="#parse_request_head-58"><span class="linenos">58</span></a><span class="k">def</span> <span class="nf">parse_request_head</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_request_head-59"><a href="#parse_request_head-59"><span class="linenos">59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a HTTP request header string (its first line) into a dict.</span>
</span><span id="parse_request_head-60"><a href="#parse_request_head-60"><span class="linenos">60</span></a>
</span><span id="parse_request_head-61"><a href="#parse_request_head-61"><span class="linenos">61</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="parse_request_head-62"><a href="#parse_request_head-62"><span class="linenos">62</span></a><span class="sd"> - verb: str</span>
</span><span id="parse_request_head-63"><a href="#parse_request_head-63"><span class="linenos">63</span></a><span class="sd"> The _uppercase_ verb of the request, i.e. the first word of the line;</span>
</span><span id="parse_request_head-64"><a href="#parse_request_head-64"><span class="linenos">64</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="parse_request_head-65"><a href="#parse_request_head-65"><span class="linenos">65</span></a><span class="sd"> - resource: str</span>
</span><span id="parse_request_head-66"><a href="#parse_request_head-66"><span class="linenos">66</span></a><span class="sd"> The requested resource, i.e. the second &quot;word&quot; of the line;</span>
</span><span id="parse_request_head-67"><a href="#parse_request_head-67"><span class="linenos">67</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="parse_request_head-68"><a href="#parse_request_head-68"><span class="linenos">68</span></a><span class="sd"> </span>
</span><span id="parse_request_head-69"><a href="#parse_request_head-69"><span class="linenos">69</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_head-70"><a href="#parse_request_head-70"><span class="linenos">70</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_head-71"><a href="#parse_request_head-71"><span class="linenos">71</span></a><span class="sd"> - line: str</span>
</span><span id="parse_request_head-72"><a href="#parse_request_head-72"><span class="linenos">72</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</span>
</span><span id="parse_request_head-73"><a href="#parse_request_head-73"><span class="linenos">73</span></a>
</span><span id="parse_request_head-74"><a href="#parse_request_head-74"><span class="linenos">74</span></a><span class="sd"> Returns</span>
</span><span id="parse_request_head-75"><a href="#parse_request_head-75"><span class="linenos">75</span></a><span class="sd"> -------</span>
</span><span id="parse_request_head-76"><a href="#parse_request_head-76"><span class="linenos">76</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_head-77"><a href="#parse_request_head-77"><span class="linenos">77</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="parse_request_head-78"><a href="#parse_request_head-78"><span class="linenos">78</span></a><span class="sd"> </span>
</span><span id="parse_request_head-79"><a href="#parse_request_head-79"><span class="linenos">79</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_head-80"><a href="#parse_request_head-80"><span class="linenos">80</span></a><span class="sd"> ------</span>
</span><span id="parse_request_head-81"><a href="#parse_request_head-81"><span class="linenos">81</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_head-82"><a href="#parse_request_head-82"><span class="linenos">82</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="parse_request_head-83"><a href="#parse_request_head-83"><span class="linenos">83</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_head-84"><a href="#parse_request_head-84"><span class="linenos">84</span></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="parse_request_head-85"><a href="#parse_request_head-85"><span class="linenos">85</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="parse_request_head-86"><a href="#parse_request_head-86"><span class="linenos">86</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request header is invalid: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="parse_request_head-87"><a href="#parse_request_head-87"><span class="linenos">87</span></a>
</span><span id="parse_request_head-88"><a href="#parse_request_head-88"><span class="linenos">88</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request_head-89"><a href="#parse_request_head-89"><span class="linenos">89</span></a> <span class="n">verb</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span>
</span><span id="parse_request_head-90"><a href="#parse_request_head-90"><span class="linenos">90</span></a> <span class="n">resource</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="parse_request_head-91"><a href="#parse_request_head-91"><span class="linenos">91</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_head-60"><a href="#parse_request_head-60"><span class="linenos">60</span></a><span class="k">def</span> <span class="nf">parse_request_head</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_request_head-61"><a href="#parse_request_head-61"><span class="linenos">61</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses a HTTP request header string (its first line) into a dict.</span>
</span><span id="parse_request_head-62"><a href="#parse_request_head-62"><span class="linenos">62</span></a>
</span><span id="parse_request_head-63"><a href="#parse_request_head-63"><span class="linenos">63</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="parse_request_head-64"><a href="#parse_request_head-64"><span class="linenos">64</span></a><span class="sd"> - verb: str</span>
</span><span id="parse_request_head-65"><a href="#parse_request_head-65"><span class="linenos">65</span></a><span class="sd"> The _uppercase_ verb of the request, i.e. the first word of the line;</span>
</span><span id="parse_request_head-66"><a href="#parse_request_head-66"><span class="linenos">66</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="parse_request_head-67"><a href="#parse_request_head-67"><span class="linenos">67</span></a><span class="sd"> - resource: str</span>
</span><span id="parse_request_head-68"><a href="#parse_request_head-68"><span class="linenos">68</span></a><span class="sd"> The requested resource, i.e. the second &quot;word&quot; of the line;</span>
</span><span id="parse_request_head-69"><a href="#parse_request_head-69"><span class="linenos">69</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="parse_request_head-70"><a href="#parse_request_head-70"><span class="linenos">70</span></a><span class="sd"> </span>
</span><span id="parse_request_head-71"><a href="#parse_request_head-71"><span class="linenos">71</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_head-72"><a href="#parse_request_head-72"><span class="linenos">72</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_head-73"><a href="#parse_request_head-73"><span class="linenos">73</span></a><span class="sd"> - line: str</span>
</span><span id="parse_request_head-74"><a href="#parse_request_head-74"><span class="linenos">74</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</span>
</span><span id="parse_request_head-75"><a href="#parse_request_head-75"><span class="linenos">75</span></a>
</span><span id="parse_request_head-76"><a href="#parse_request_head-76"><span class="linenos">76</span></a><span class="sd"> Returns</span>
</span><span id="parse_request_head-77"><a href="#parse_request_head-77"><span class="linenos">77</span></a><span class="sd"> -------</span>
</span><span id="parse_request_head-78"><a href="#parse_request_head-78"><span class="linenos">78</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_head-79"><a href="#parse_request_head-79"><span class="linenos">79</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="parse_request_head-80"><a href="#parse_request_head-80"><span class="linenos">80</span></a><span class="sd"> </span>
</span><span id="parse_request_head-81"><a href="#parse_request_head-81"><span class="linenos">81</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_head-82"><a href="#parse_request_head-82"><span class="linenos">82</span></a><span class="sd"> ------</span>
</span><span id="parse_request_head-83"><a href="#parse_request_head-83"><span class="linenos">83</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_head-84"><a href="#parse_request_head-84"><span class="linenos">84</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="parse_request_head-85"><a href="#parse_request_head-85"><span class="linenos">85</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_head-86"><a href="#parse_request_head-86"><span class="linenos">86</span></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="parse_request_head-87"><a href="#parse_request_head-87"><span class="linenos">87</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="parse_request_head-88"><a href="#parse_request_head-88"><span class="linenos">88</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request header is invalid: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="parse_request_head-89"><a href="#parse_request_head-89"><span class="linenos">89</span></a>
</span><span id="parse_request_head-90"><a href="#parse_request_head-90"><span class="linenos">90</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request_head-91"><a href="#parse_request_head-91"><span class="linenos">91</span></a> <span class="n">verb</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span>
</span><span id="parse_request_head-92"><a href="#parse_request_head-92"><span class="linenos">92</span></a> <span class="n">resource</span><span class="o">=</span><span class="n">fields</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="parse_request_head-93"><a href="#parse_request_head-93"><span class="linenos">93</span></a> <span class="p">)</span>
</span></pre></div>
@ -371,40 +373,40 @@ The HTTP request header (the first line of a full HTTP request).</li>
</div>
<a class="headerlink" href="#parse_request_params"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_params-93"><a href="#parse_request_params-93"><span class="linenos"> 93</span></a><span class="k">def</span> <span class="nf">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_request_params-94"><a href="#parse_request_params-94"><span class="linenos"> 94</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses HTTP request parameters (a list of lines) into a dict.</span>
</span><span id="parse_request_params-95"><a href="#parse_request_params-95"><span class="linenos"> 95</span></a>
</span><span id="parse_request_params-96"><a href="#parse_request_params-96"><span class="linenos"> 96</span></a><span class="sd"> The parsed request dict contains one key/value pair per line, with the </span>
</span><span id="parse_request_params-97"><a href="#parse_request_params-97"><span class="linenos"> 97</span></a><span class="sd"> dict key being the left part of the line (the parameter key), and the </span>
</span><span id="parse_request_params-98"><a href="#parse_request_params-98"><span class="linenos"> 98</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="parse_request_params-99"><a href="#parse_request_params-99"><span class="linenos"> 99</span></a>
</span><span id="parse_request_params-100"><a href="#parse_request_params-100"><span class="linenos">100</span></a><span class="sd"> The function strips leading and trailing spaces: &quot; Host: a.org &quot; becomes</span>
</span><span id="parse_request_params-101"><a href="#parse_request_params-101"><span class="linenos">101</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="parse_request_params-102"><a href="#parse_request_params-102"><span class="linenos">102</span></a><span class="sd"> </span>
</span><span id="parse_request_params-103"><a href="#parse_request_params-103"><span class="linenos">103</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_params-104"><a href="#parse_request_params-104"><span class="linenos">104</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_params-105"><a href="#parse_request_params-105"><span class="linenos">105</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="parse_request_params-106"><a href="#parse_request_params-106"><span class="linenos">106</span></a><span class="sd"> HTTP parameters (one list item per line)</span>
</span><span id="parse_request_params-107"><a href="#parse_request_params-107"><span class="linenos">107</span></a>
</span><span id="parse_request_params-108"><a href="#parse_request_params-108"><span class="linenos">108</span></a><span class="sd"> Returns</span>
</span><span id="parse_request_params-109"><a href="#parse_request_params-109"><span class="linenos">109</span></a><span class="sd"> -------</span>
</span><span id="parse_request_params-110"><a href="#parse_request_params-110"><span class="linenos">110</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_params-111"><a href="#parse_request_params-111"><span class="linenos">111</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="parse_request_params-112"><a href="#parse_request_params-112"><span class="linenos">112</span></a><span class="sd"> </span>
</span><span id="parse_request_params-113"><a href="#parse_request_params-113"><span class="linenos">113</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_params-114"><a href="#parse_request_params-114"><span class="linenos">114</span></a><span class="sd"> ------</span>
</span><span id="parse_request_params-115"><a href="#parse_request_params-115"><span class="linenos">115</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_params-116"><a href="#parse_request_params-116"><span class="linenos">116</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="parse_request_params-117"><a href="#parse_request_params-117"><span class="linenos">117</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_params-118"><a href="#parse_request_params-118"><span class="linenos">118</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="parse_request_params-119"><a href="#parse_request_params-119"><span class="linenos">119</span></a> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
</span><span id="parse_request_params-120"><a href="#parse_request_params-120"><span class="linenos">120</span></a> <span class="n">kv</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;: &#39;</span><span class="p">)</span>
</span><span id="parse_request_params-121"><a href="#parse_request_params-121"><span class="linenos">121</span></a>
</span><span id="parse_request_params-122"><a href="#parse_request_params-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="parse_request_params-123"><a href="#parse_request_params-123"><span class="linenos">123</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request line is not a valid key/value pair: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="parse_request_params-124"><a href="#parse_request_params-124"><span class="linenos">124</span></a>
</span><span id="parse_request_params-125"><a href="#parse_request_params-125"><span class="linenos">125</span></a> <span class="n">params</span><span class="p">[</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="parse_request_params-126"><a href="#parse_request_params-126"><span class="linenos">126</span></a> <span class="k">return</span> <span class="n">params</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_params-95"><a href="#parse_request_params-95"><span class="linenos"> 95</span></a><span class="k">def</span> <span class="nf">parse_request_params</span><span class="p">(</span><span class="n">lines</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="parse_request_params-96"><a href="#parse_request_params-96"><span class="linenos"> 96</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses HTTP request parameters (a list of lines) into a dict.</span>
</span><span id="parse_request_params-97"><a href="#parse_request_params-97"><span class="linenos"> 97</span></a>
</span><span id="parse_request_params-98"><a href="#parse_request_params-98"><span class="linenos"> 98</span></a><span class="sd"> The parsed request dict contains one key/value pair per line, with the </span>
</span><span id="parse_request_params-99"><a href="#parse_request_params-99"><span class="linenos"> 99</span></a><span class="sd"> dict key being the left part of the line (the parameter key), and the </span>
</span><span id="parse_request_params-100"><a href="#parse_request_params-100"><span class="linenos">100</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="parse_request_params-101"><a href="#parse_request_params-101"><span class="linenos">101</span></a>
</span><span id="parse_request_params-102"><a href="#parse_request_params-102"><span class="linenos">102</span></a><span class="sd"> The function strips leading and trailing spaces: &quot; Host: a.org &quot; becomes</span>
</span><span id="parse_request_params-103"><a href="#parse_request_params-103"><span class="linenos">103</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="parse_request_params-104"><a href="#parse_request_params-104"><span class="linenos">104</span></a><span class="sd"> </span>
</span><span id="parse_request_params-105"><a href="#parse_request_params-105"><span class="linenos">105</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_params-106"><a href="#parse_request_params-106"><span class="linenos">106</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_params-107"><a href="#parse_request_params-107"><span class="linenos">107</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="parse_request_params-108"><a href="#parse_request_params-108"><span class="linenos">108</span></a><span class="sd"> HTTP parameters (one list item per line)</span>
</span><span id="parse_request_params-109"><a href="#parse_request_params-109"><span class="linenos">109</span></a>
</span><span id="parse_request_params-110"><a href="#parse_request_params-110"><span class="linenos">110</span></a><span class="sd"> Returns</span>
</span><span id="parse_request_params-111"><a href="#parse_request_params-111"><span class="linenos">111</span></a><span class="sd"> -------</span>
</span><span id="parse_request_params-112"><a href="#parse_request_params-112"><span class="linenos">112</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_params-113"><a href="#parse_request_params-113"><span class="linenos">113</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="parse_request_params-114"><a href="#parse_request_params-114"><span class="linenos">114</span></a><span class="sd"> </span>
</span><span id="parse_request_params-115"><a href="#parse_request_params-115"><span class="linenos">115</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_params-116"><a href="#parse_request_params-116"><span class="linenos">116</span></a><span class="sd"> ------</span>
</span><span id="parse_request_params-117"><a href="#parse_request_params-117"><span class="linenos">117</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_params-118"><a href="#parse_request_params-118"><span class="linenos">118</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="parse_request_params-119"><a href="#parse_request_params-119"><span class="linenos">119</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_params-120"><a href="#parse_request_params-120"><span class="linenos">120</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="parse_request_params-121"><a href="#parse_request_params-121"><span class="linenos">121</span></a> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
</span><span id="parse_request_params-122"><a href="#parse_request_params-122"><span class="linenos">122</span></a> <span class="n">kv</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;: &#39;</span><span class="p">)</span>
</span><span id="parse_request_params-123"><a href="#parse_request_params-123"><span class="linenos">123</span></a>
</span><span id="parse_request_params-124"><a href="#parse_request_params-124"><span class="linenos">124</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="parse_request_params-125"><a href="#parse_request_params-125"><span class="linenos">125</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request line is not a valid key/value pair: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="parse_request_params-126"><a href="#parse_request_params-126"><span class="linenos">126</span></a>
</span><span id="parse_request_params-127"><a href="#parse_request_params-127"><span class="linenos">127</span></a> <span class="n">params</span><span class="p">[</span><span class="n">kv</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">kv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="parse_request_params-128"><a href="#parse_request_params-128"><span class="linenos">128</span></a> <span class="k">return</span> <span class="n">params</span>
</span></pre></div>

View file

@ -58,9 +58,9 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.log </h1>
<div class="docstring"><p>A module for learning network programming in Python.</p>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This functions handle the http messages.</p>
<p>This module (file) manages the HTTP logging messages.</p>
</div>
<input id="mod-log-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -78,9 +78,9 @@
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A module for learning network programming in Python.</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This functions handle the http messages.</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This module (file) manages the HTTP logging messages.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">myserver.date</span> <span class="kn">import</span> <span class="n">now_rfc2616</span>
@ -143,9 +143,9 @@
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="k">def</span> <span class="nf">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">],</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd"> Logs a reply message to stdout, with a timestamp and an address (host:port).</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd"> Logs an HTTP reply to stdout, with timestamp, address (host:port), code, UA.</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> </span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> Output is: `timestamp - host:port - message`.</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> Output is: `timestamp - host:port - HTTP-verb HTTP-resource - code - message`.</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="sd"> </span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> Parameters</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> ----------</span>
@ -324,9 +324,9 @@ The request to print.</li>
<a class="headerlink" href="#log_reply"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="log_reply-76"><a href="#log_reply-76"><span class="linenos"> 76</span></a><span class="k">def</span> <span class="nf">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">dict</span><span class="p">],</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="log_reply-77"><a href="#log_reply-77"><span class="linenos"> 77</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="log_reply-78"><a href="#log_reply-78"><span class="linenos"> 78</span></a><span class="sd"> Logs a reply message to stdout, with a timestamp and an address (host:port).</span>
</span><span id="log_reply-78"><a href="#log_reply-78"><span class="linenos"> 78</span></a><span class="sd"> Logs an HTTP reply to stdout, with timestamp, address (host:port), code, UA.</span>
</span><span id="log_reply-79"><a href="#log_reply-79"><span class="linenos"> 79</span></a><span class="sd"> </span>
</span><span id="log_reply-80"><a href="#log_reply-80"><span class="linenos"> 80</span></a><span class="sd"> Output is: `timestamp - host:port - message`.</span>
</span><span id="log_reply-80"><a href="#log_reply-80"><span class="linenos"> 80</span></a><span class="sd"> Output is: `timestamp - host:port - HTTP-verb HTTP-resource - code - message`.</span>
</span><span id="log_reply-81"><a href="#log_reply-81"><span class="linenos"> 81</span></a><span class="sd"> </span>
</span><span id="log_reply-82"><a href="#log_reply-82"><span class="linenos"> 82</span></a><span class="sd"> Parameters</span>
</span><span id="log_reply-83"><a href="#log_reply-83"><span class="linenos"> 83</span></a><span class="sd"> ----------</span>
@ -351,9 +351,9 @@ The request to print.</li>
</span></pre></div>
<div class="docstring"><p>Logs a reply message to stdout, with a timestamp and an address (host:port).</p>
<div class="docstring"><p>Logs an HTTP reply to stdout, with timestamp, address (host:port), code, UA.</p>
<p>Output is: <code>timestamp - host:port - message</code>.</p>
<p>Output is: <code>timestamp - host:port - HTTP-verb HTTP-resource - code - message</code>.</p>
<h2 id="parameters">Parameters</h2>

View file

@ -37,7 +37,10 @@
<a class="function" href="#handle_client">handle_client</a>
</li>
<li>
<a class="function" href="#reply">reply</a>
<a class="function" href="#prepare_resource">prepare_resource</a>
</li>
<li>
<a class="function" href="#prepare_reply">prepare_reply</a>
</li>
</ul>
@ -55,94 +58,198 @@
<h1 class="modulename">
<a href="./../../src.html">src</a><wbr>.<a href="./../myserver.html">myserver</a><wbr>.server </h1>
<div class="docstring"><p>A module for learning network programming in Python.</p>
<div class="docstring"><p>A package for learning network programming in Python.</p>
<p>This functions manage the socket connections and multi-threading of clients.</p>
<p>This part manages the socket connections and multi-threading of clients.</p>
</div>
<input id="mod-server-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-server-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">A module for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">This functions manage the socket connections and multi-threading of clients.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">import</span> <span class="nn">socket</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">myserver.log</span> <span class="kn">import</span> <span class="n">log</span><span class="p">,</span> <span class="n">log_reply</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">myserver.http_request</span> <span class="kn">import</span> <span class="n">parse_request</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">myserver.file</span> <span class="kn">import</span> <span class="n">get_resource</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="kn">from</span> <span class="nn">myserver.date</span> <span class="kn">import</span> <span class="n">now_rfc2616</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="n">_BUF_SIZE</span> <span class="o">=</span> <span class="mi">1024</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="n">_SERVER_ADDR</span> <span class="o">=</span> <span class="s2">&quot;0.0.0.0&quot;</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="k">def</span> <span class="nf">serve</span><span class="p">(</span><span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a><span class="sd"> Serves http request connections for clients.</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="sd"> </span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a><span class="sd"> This function creates the network socket, listens, and calls</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a><span class="sd"> :func:`~myserver.handle_client()` when a request comes in.</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="c1"># Allows reusing a socket right after it got closed (after ctrl-c)</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">s</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">_SERVER_ADDR</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">()</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Server started at </span><span class="si">{</span><span class="n">_SERVER_ADDR</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="k">try</span><span class="p">:</span> <span class="c1"># Catch KeyboardInterrupt to close server socket</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">c</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="k">try</span><span class="p">:</span> <span class="c1"># Catch KeyboardInterrupt to close client handling socket</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="n">s</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a><span class="k">def</span> <span class="nf">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">root</span><span class="p">:</span><span class="nb">str</span><span class="p">):</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="n">buf</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">_BUF_SIZE</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a> <span class="k">if</span> <span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;verb&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a> <span class="n">code</span><span class="p">,</span> <span class="n">content</span> <span class="o">=</span> <span class="n">get_resource</span><span class="p">(</span><span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;resource&#39;</span><span class="p">],</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="n">reply</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a><span class="k">def</span> <span class="nf">reply</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a> <span class="n">return_message</span> <span class="o">=</span> <span class="s2">&quot;200 OK&quot;</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a> <span class="n">return_message</span> <span class="o">=</span> <span class="s2">&quot;404 Not found&quot;</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="c1"># TODO: Change content type depending on actual content type</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a> <span class="n">reply_header</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;HTTP/1.1 </span><span class="si">{</span><span class="n">return_message</span><span class="si">}</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a><span class="s2">Content-Type: text/html; charset=utf-8</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a><span class="s2">Date: </span><span class="si">{</span><span class="n">now_rfc2616</span><span class="p">()</span><span class="si">}</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a><span class="s2">Content-Length: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="si">}</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a><span class="s2">&quot;&quot;&quot;</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">reply_header</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a>
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="n">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">A package for learning network programming in Python.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd">This part manages the socket connections and multi-threading of clients.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">import</span> <span class="nn">socket</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="kn">from</span> <span class="nn">myserver.log</span> <span class="kn">import</span> <span class="n">log</span><span class="p">,</span> <span class="n">log_reply</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="kn">from</span> <span class="nn">myserver.http_request</span> <span class="kn">import</span> <span class="n">parse_request</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="kn">from</span> <span class="nn">myserver.file</span> <span class="kn">import</span> <span class="n">resolve_location</span><span class="p">,</span> <span class="n">get_resource</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="kn">from</span> <span class="nn">myserver.date</span> <span class="kn">import</span> <span class="n">now_rfc2616</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="kn">from</span> <span class="nn">myserver.http</span> <span class="kn">import</span> <span class="n">get_http_code</span><span class="p">,</span> <span class="n">get_http_content_type</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="n">_BUF_SIZE</span> <span class="o">=</span> <span class="mi">4096</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="n">_SERVER_ADDR</span> <span class="o">=</span> <span class="s2">&quot;0.0.0.0&quot;</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="k">def</span> <span class="nf">serve</span><span class="p">(</span><span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="sd"> Serves http request connections for clients.</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> </span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd"> This function creates the network socket, listens, and as soon as it receives</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="sd"> a request (connection), calls the :func:`~myserver.handle_client()`.</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="c1"># Allows reusing a socket right after it got closed (after ctrl-c)</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="n">s</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="c1"># Attach the socket to the port and interface provided.</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">_SERVER_ADDR</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="c1">## Start listening on the socket.</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">()</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Server started at </span><span class="si">{</span><span class="n">_SERVER_ADDR</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="c1"># Try / catch KeyboardInterrupt to close server socket properly if we hit</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="c1"># the Control-C sequence to interrupt the server.</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="n">c</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="c1"># Try / catch KeyboardInterrupt to properly close the client socket if</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="c1"># we hit the Control-C sequence to interrupt the server.</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="c1"># If the KeyboardInterrupt is raised, we pass it to the outer loop</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="c1"># to also close the server socket.</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="n">log</span><span class="p">(</span><span class="s2">&quot;Received KeyboardInterrupt. Closing...&quot;</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">s</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a><span class="k">def</span> <span class="nf">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">root</span><span class="p">:</span><span class="nb">str</span><span class="p">):</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a><span class="sd"> Manages a single connection from a client.</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a><span class="sd"> In details, we:</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a><span class="sd"> * read data from the socket provided,</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a><span class="sd"> * parse this data to build the request and headers,</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="sd"> * call the handle_request() function,</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a><span class="sd"> [* optionally write something in the log,]</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="sd"> * close the connection.</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd"> Parameters</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> ----------</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> - c: socket.socket</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="sd"> The socket to communicate with the client.</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> - addr: tuple[str, int]</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> The IP address and port of the client, as returned by the accept command.</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="sd"> - root: str</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">buf</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">_BUF_SIZE</span><span class="p">)</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="c1"># Prepare our reply.</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">if</span> <span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;verb&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">reply</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">prepare_resource</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="c1"># Not implemented: we treat only GET calls for now.</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">reply</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">prepare_reply</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">501</span><span class="p">)</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="c1"># Send the reply back.</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">reply</span><span class="p">)</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="c1"># Trace the action in the logs.</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="c1"># Close the connection.</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="k">def</span> <span class="nf">prepare_resource</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> Retrieves the content of the resource and sets the status code.</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> Parameters</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> ----------</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> - root: str</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> - req: dict[str, dict]</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> The request to proceed.</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> Returns</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="sd"> -------</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd"> tuple </span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="sd"> - data: str</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a><span class="sd"> - code: int</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">200</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">content</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">res_path</span><span class="p">,</span> <span class="n">res_extension</span> <span class="o">=</span> <span class="n">resolve_location</span><span class="p">(</span><span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;resource&#39;</span><span class="p">],</span> <span class="n">root</span><span class="p">)</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">if</span> <span class="n">res_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">404</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">get_http_content_type</span><span class="p">(</span><span class="n">res_extension</span><span class="p">)</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="n">content</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">get_resource</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">prepare_reply</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="k">def</span> <span class="nf">prepare_reply</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">,</span> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a><span class="sd"> Generates the proper answer, including the HTTP headers and content of the</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd"> webpage, and the status code.</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> For more information about:</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> * Content type, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> * Status code, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> Parameters</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> ----------</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> - content: bytes</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> The raw data for the resource.</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a><span class="sd"> - content_type: str</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a><span class="sd"> The content type for the resource.</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a><span class="sd"> - code: int</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="sd"> The status code.</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a><span class="sd"> Returns</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a><span class="sd"> -------</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a><span class="sd"> tuple </span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="sd"> - data: str</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="sd"> - code: int</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="c1"># Prepare status code</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">http_code_dict</span> <span class="o">=</span> <span class="n">get_http_code</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">http_code_dict</span><span class="p">[</span><span class="s1">&#39;html&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">get_http_content_type</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;; charset=utf-8&quot;</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="c1"># Prepare header</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="n">header</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;HTTP/1.0 </span><span class="si">{</span><span class="n">http_code_dict</span><span class="p">[</span><span class="s1">&#39;header&#39;</span><span class="p">]</span><span class="si">}</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a><span class="s2">Content-Type: </span><span class="si">{</span><span class="n">content_type</span><span class="si">}</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a><span class="s2">Date: </span><span class="si">{</span><span class="n">now_rfc2616</span><span class="p">()</span><span class="si">}</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a><span class="s2">Content-Length: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="si">}</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a><span class="s2">Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="k">return</span> <span class="n">header</span> <span class="o">+</span> <span class="n">content</span><span class="p">,</span> <span class="n">code</span>
</span></pre></div>
@ -158,40 +265,50 @@
</div>
<a class="headerlink" href="#serve"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="serve-27"><a href="#serve-27"><span class="linenos">27</span></a><span class="k">def</span> <span class="nf">serve</span><span class="p">(</span><span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="serve-28"><a href="#serve-28"><span class="linenos">28</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="serve-29"><a href="#serve-29"><span class="linenos">29</span></a><span class="sd"> Serves http request connections for clients.</span>
</span><span id="serve-30"><a href="#serve-30"><span class="linenos">30</span></a><span class="sd"> </span>
</span><span id="serve-31"><a href="#serve-31"><span class="linenos">31</span></a><span class="sd"> This function creates the network socket, listens, and calls</span>
</span><span id="serve-32"><a href="#serve-32"><span class="linenos">32</span></a><span class="sd"> :func:`~myserver.handle_client()` when a request comes in.</span>
</span><span id="serve-33"><a href="#serve-33"><span class="linenos">33</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="serve-34"><a href="#serve-34"><span class="linenos">34</span></a> <span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
</span><span id="serve-35"><a href="#serve-35"><span class="linenos">35</span></a>
</span><span id="serve-36"><a href="#serve-36"><span class="linenos">36</span></a> <span class="c1"># Allows reusing a socket right after it got closed (after ctrl-c)</span>
</span><span id="serve-37"><a href="#serve-37"><span class="linenos">37</span></a> <span class="n">s</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="serve-38"><a href="#serve-38"><span class="linenos">38</span></a>
</span><span id="serve-39"><a href="#serve-39"><span class="linenos">39</span></a> <span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">_SERVER_ADDR</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
</span><span id="serve-40"><a href="#serve-40"><span class="linenos">40</span></a> <span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">()</span>
</span><span id="serve-41"><a href="#serve-41"><span class="linenos">41</span></a>
</span><span id="serve-42"><a href="#serve-42"><span class="linenos">42</span></a> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Server started at </span><span class="si">{</span><span class="n">_SERVER_ADDR</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="serve-43"><a href="#serve-43"><span class="linenos">43</span></a>
</span><span id="serve-44"><a href="#serve-44"><span class="linenos">44</span></a> <span class="k">try</span><span class="p">:</span> <span class="c1"># Catch KeyboardInterrupt to close server socket</span>
</span><span id="serve-45"><a href="#serve-45"><span class="linenos">45</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="serve-46"><a href="#serve-46"><span class="linenos">46</span></a> <span class="n">c</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</span><span id="serve-47"><a href="#serve-47"><span class="linenos">47</span></a> <span class="k">try</span><span class="p">:</span> <span class="c1"># Catch KeyboardInterrupt to close client handling socket</span>
</span><span id="serve-48"><a href="#serve-48"><span class="linenos">48</span></a> <span class="n">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="serve-49"><a href="#serve-49"><span class="linenos">49</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="serve-50"><a href="#serve-50"><span class="linenos">50</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="serve-51"><a href="#serve-51"><span class="linenos">51</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="serve-52"><a href="#serve-52"><span class="linenos">52</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
</span><span id="serve-53"><a href="#serve-53"><span class="linenos">53</span></a> <span class="n">s</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="serve-28"><a href="#serve-28"><span class="linenos">28</span></a><span class="k">def</span> <span class="nf">serve</span><span class="p">(</span><span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="serve-29"><a href="#serve-29"><span class="linenos">29</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="serve-30"><a href="#serve-30"><span class="linenos">30</span></a><span class="sd"> Serves http request connections for clients.</span>
</span><span id="serve-31"><a href="#serve-31"><span class="linenos">31</span></a><span class="sd"> </span>
</span><span id="serve-32"><a href="#serve-32"><span class="linenos">32</span></a><span class="sd"> This function creates the network socket, listens, and as soon as it receives</span>
</span><span id="serve-33"><a href="#serve-33"><span class="linenos">33</span></a><span class="sd"> a request (connection), calls the :func:`~myserver.handle_client()`.</span>
</span><span id="serve-34"><a href="#serve-34"><span class="linenos">34</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="serve-35"><a href="#serve-35"><span class="linenos">35</span></a> <span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
</span><span id="serve-36"><a href="#serve-36"><span class="linenos">36</span></a>
</span><span id="serve-37"><a href="#serve-37"><span class="linenos">37</span></a> <span class="c1"># Allows reusing a socket right after it got closed (after ctrl-c)</span>
</span><span id="serve-38"><a href="#serve-38"><span class="linenos">38</span></a> <span class="n">s</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="serve-39"><a href="#serve-39"><span class="linenos">39</span></a>
</span><span id="serve-40"><a href="#serve-40"><span class="linenos">40</span></a> <span class="c1"># Attach the socket to the port and interface provided.</span>
</span><span id="serve-41"><a href="#serve-41"><span class="linenos">41</span></a> <span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">_SERVER_ADDR</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
</span><span id="serve-42"><a href="#serve-42"><span class="linenos">42</span></a>
</span><span id="serve-43"><a href="#serve-43"><span class="linenos">43</span></a> <span class="c1">## Start listening on the socket.</span>
</span><span id="serve-44"><a href="#serve-44"><span class="linenos">44</span></a> <span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">()</span>
</span><span id="serve-45"><a href="#serve-45"><span class="linenos">45</span></a>
</span><span id="serve-46"><a href="#serve-46"><span class="linenos">46</span></a> <span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Server started at </span><span class="si">{</span><span class="n">_SERVER_ADDR</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="serve-47"><a href="#serve-47"><span class="linenos">47</span></a>
</span><span id="serve-48"><a href="#serve-48"><span class="linenos">48</span></a> <span class="c1"># Try / catch KeyboardInterrupt to close server socket properly if we hit</span>
</span><span id="serve-49"><a href="#serve-49"><span class="linenos">49</span></a> <span class="c1"># the Control-C sequence to interrupt the server.</span>
</span><span id="serve-50"><a href="#serve-50"><span class="linenos">50</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="serve-51"><a href="#serve-51"><span class="linenos">51</span></a> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="serve-52"><a href="#serve-52"><span class="linenos">52</span></a> <span class="n">c</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</span><span id="serve-53"><a href="#serve-53"><span class="linenos">53</span></a> <span class="c1"># Try / catch KeyboardInterrupt to properly close the client socket if</span>
</span><span id="serve-54"><a href="#serve-54"><span class="linenos">54</span></a> <span class="c1"># we hit the Control-C sequence to interrupt the server.</span>
</span><span id="serve-55"><a href="#serve-55"><span class="linenos">55</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="serve-56"><a href="#serve-56"><span class="linenos">56</span></a> <span class="n">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">root</span><span class="p">)</span>
</span><span id="serve-57"><a href="#serve-57"><span class="linenos">57</span></a> <span class="c1"># If the KeyboardInterrupt is raised, we pass it to the outer loop</span>
</span><span id="serve-58"><a href="#serve-58"><span class="linenos">58</span></a> <span class="c1"># to also close the server socket.</span>
</span><span id="serve-59"><a href="#serve-59"><span class="linenos">59</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="serve-60"><a href="#serve-60"><span class="linenos">60</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="serve-61"><a href="#serve-61"><span class="linenos">61</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="serve-62"><a href="#serve-62"><span class="linenos">62</span></a> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
</span><span id="serve-63"><a href="#serve-63"><span class="linenos">63</span></a> <span class="n">log</span><span class="p">(</span><span class="s2">&quot;Received KeyboardInterrupt. Closing...&quot;</span><span class="p">)</span>
</span><span id="serve-64"><a href="#serve-64"><span class="linenos">64</span></a> <span class="n">s</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Serves http request connections for clients.</p>
<p>This function creates the network socket, listens, and calls
<code>~myserver.handle_client()()</code> when a request comes in.</p>
<p>This function creates the network socket, listens, and as soon as it receives
a request (connection), calls the <code>~myserver.handle_client()()</code>.</p>
</div>
@ -207,52 +324,231 @@
</div>
<a class="headerlink" href="#handle_client"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="handle_client-55"><a href="#handle_client-55"><span class="linenos">55</span></a><span class="k">def</span> <span class="nf">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">root</span><span class="p">:</span><span class="nb">str</span><span class="p">):</span>
</span><span id="handle_client-56"><a href="#handle_client-56"><span class="linenos">56</span></a> <span class="n">buf</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">_BUF_SIZE</span><span class="p">)</span>
</span><span id="handle_client-57"><a href="#handle_client-57"><span class="linenos">57</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span id="handle_client-58"><a href="#handle_client-58"><span class="linenos">58</span></a>
</span><span id="handle_client-59"><a href="#handle_client-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;verb&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
</span><span id="handle_client-60"><a href="#handle_client-60"><span class="linenos">60</span></a> <span class="n">code</span><span class="p">,</span> <span class="n">content</span> <span class="o">=</span> <span class="n">get_resource</span><span class="p">(</span><span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;resource&#39;</span><span class="p">],</span> <span class="n">root</span><span class="p">)</span>
</span><span id="handle_client-61"><a href="#handle_client-61"><span class="linenos">61</span></a> <span class="n">reply</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
</span><span id="handle_client-62"><a href="#handle_client-62"><span class="linenos">62</span></a>
</span><span id="handle_client-63"><a href="#handle_client-63"><span class="linenos">63</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="handle_client-67"><a href="#handle_client-67"><span class="linenos"> 67</span></a><span class="k">def</span> <span class="nf">handle_client</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">root</span><span class="p">:</span><span class="nb">str</span><span class="p">):</span>
</span><span id="handle_client-68"><a href="#handle_client-68"><span class="linenos"> 68</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="handle_client-69"><a href="#handle_client-69"><span class="linenos"> 69</span></a><span class="sd"> Manages a single connection from a client.</span>
</span><span id="handle_client-70"><a href="#handle_client-70"><span class="linenos"> 70</span></a>
</span><span id="handle_client-71"><a href="#handle_client-71"><span class="linenos"> 71</span></a><span class="sd"> In details, we:</span>
</span><span id="handle_client-72"><a href="#handle_client-72"><span class="linenos"> 72</span></a><span class="sd"> * read data from the socket provided,</span>
</span><span id="handle_client-73"><a href="#handle_client-73"><span class="linenos"> 73</span></a><span class="sd"> * parse this data to build the request and headers,</span>
</span><span id="handle_client-74"><a href="#handle_client-74"><span class="linenos"> 74</span></a><span class="sd"> * call the handle_request() function,</span>
</span><span id="handle_client-75"><a href="#handle_client-75"><span class="linenos"> 75</span></a><span class="sd"> [* optionally write something in the log,]</span>
</span><span id="handle_client-76"><a href="#handle_client-76"><span class="linenos"> 76</span></a><span class="sd"> * close the connection.</span>
</span><span id="handle_client-77"><a href="#handle_client-77"><span class="linenos"> 77</span></a>
</span><span id="handle_client-78"><a href="#handle_client-78"><span class="linenos"> 78</span></a><span class="sd"> Parameters</span>
</span><span id="handle_client-79"><a href="#handle_client-79"><span class="linenos"> 79</span></a><span class="sd"> ----------</span>
</span><span id="handle_client-80"><a href="#handle_client-80"><span class="linenos"> 80</span></a><span class="sd"> - c: socket.socket</span>
</span><span id="handle_client-81"><a href="#handle_client-81"><span class="linenos"> 81</span></a><span class="sd"> The socket to communicate with the client.</span>
</span><span id="handle_client-82"><a href="#handle_client-82"><span class="linenos"> 82</span></a><span class="sd"> - addr: tuple[str, int]</span>
</span><span id="handle_client-83"><a href="#handle_client-83"><span class="linenos"> 83</span></a><span class="sd"> The IP address and port of the client, as returned by the accept command.</span>
</span><span id="handle_client-84"><a href="#handle_client-84"><span class="linenos"> 84</span></a><span class="sd"> - root: str</span>
</span><span id="handle_client-85"><a href="#handle_client-85"><span class="linenos"> 85</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="handle_client-86"><a href="#handle_client-86"><span class="linenos"> 86</span></a>
</span><span id="handle_client-87"><a href="#handle_client-87"><span class="linenos"> 87</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="handle_client-88"><a href="#handle_client-88"><span class="linenos"> 88</span></a> <span class="n">buf</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">_BUF_SIZE</span><span class="p">)</span>
</span><span id="handle_client-89"><a href="#handle_client-89"><span class="linenos"> 89</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">parse_request</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span id="handle_client-90"><a href="#handle_client-90"><span class="linenos"> 90</span></a>
</span><span id="handle_client-91"><a href="#handle_client-91"><span class="linenos"> 91</span></a> <span class="c1"># Prepare our reply.</span>
</span><span id="handle_client-92"><a href="#handle_client-92"><span class="linenos"> 92</span></a> <span class="k">if</span> <span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;verb&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
</span><span id="handle_client-93"><a href="#handle_client-93"><span class="linenos"> 93</span></a> <span class="n">reply</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">prepare_resource</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
</span><span id="handle_client-94"><a href="#handle_client-94"><span class="linenos"> 94</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="handle_client-95"><a href="#handle_client-95"><span class="linenos"> 95</span></a> <span class="c1"># Not implemented: we treat only GET calls for now.</span>
</span><span id="handle_client-96"><a href="#handle_client-96"><span class="linenos"> 96</span></a> <span class="n">reply</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">prepare_reply</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">501</span><span class="p">)</span>
</span><span id="handle_client-97"><a href="#handle_client-97"><span class="linenos"> 97</span></a>
</span><span id="handle_client-98"><a href="#handle_client-98"><span class="linenos"> 98</span></a> <span class="c1"># Send the reply back.</span>
</span><span id="handle_client-99"><a href="#handle_client-99"><span class="linenos"> 99</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">reply</span><span class="p">)</span>
</span><span id="handle_client-100"><a href="#handle_client-100"><span class="linenos">100</span></a>
</span><span id="handle_client-101"><a href="#handle_client-101"><span class="linenos">101</span></a> <span class="c1"># Trace the action in the logs.</span>
</span><span id="handle_client-102"><a href="#handle_client-102"><span class="linenos">102</span></a> <span class="n">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
</span><span id="handle_client-103"><a href="#handle_client-103"><span class="linenos">103</span></a>
</span><span id="handle_client-104"><a href="#handle_client-104"><span class="linenos">104</span></a> <span class="c1"># Close the connection.</span>
</span><span id="handle_client-105"><a href="#handle_client-105"><span class="linenos">105</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></pre></div>
<div class="docstring"><p>Manages a single connection from a client.</p>
<p>In details, we:</p>
<ul>
<li>read data from the socket provided,</li>
<li>parse this data to build the request and headers,</li>
<li>call the handle_request() function,
[* optionally write something in the log,]</li>
<li>close the connection.</li>
</ul>
<h2 id="parameters">Parameters</h2>
<ul>
<li>c: socket.socket
The socket to communicate with the client.</li>
<li>addr: tuple[str, int]
The IP address and port of the client, as returned by the accept command.</li>
<li>root: str
The path to the local directory to serve.</li>
</ul>
</div>
</section>
<section id="reply">
<input id="reply-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<section id="prepare_resource">
<input id="prepare_resource-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">reply</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span>,</span><span class="param"> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>,</span><span class="param"> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span>,</span><span class="param"> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span>,</span><span class="param"> <span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span></span><span class="return-annotation">):</span></span>
<span class="name">prepare_resource</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">root</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">req</span><span class="p">:</span> <span class="nb">dict</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="reply-view-source"><span>View Source</span></label>
<label class="view-source-button" for="prepare_resource-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#reply"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="reply-65"><a href="#reply-65"><span class="linenos">65</span></a><span class="k">def</span> <span class="nf">reply</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">,</span> <span class="n">addr</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
</span><span id="reply-66"><a href="#reply-66"><span class="linenos">66</span></a> <span class="n">return_message</span> <span class="o">=</span> <span class="s2">&quot;200 OK&quot;</span>
</span><span id="reply-67"><a href="#reply-67"><span class="linenos">67</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
</span><span id="reply-68"><a href="#reply-68"><span class="linenos">68</span></a> <span class="n">return_message</span> <span class="o">=</span> <span class="s2">&quot;404 Not found&quot;</span>
</span><span id="reply-69"><a href="#reply-69"><span class="linenos">69</span></a>
</span><span id="reply-70"><a href="#reply-70"><span class="linenos">70</span></a> <span class="c1"># TODO: Change content type depending on actual content type</span>
</span><span id="reply-71"><a href="#reply-71"><span class="linenos">71</span></a> <span class="n">reply_header</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;HTTP/1.1 </span><span class="si">{</span><span class="n">return_message</span><span class="si">}</span>
</span><span id="reply-72"><a href="#reply-72"><span class="linenos">72</span></a><span class="s2">Content-Type: text/html; charset=utf-8</span>
</span><span id="reply-73"><a href="#reply-73"><span class="linenos">73</span></a><span class="s2">Date: </span><span class="si">{</span><span class="n">now_rfc2616</span><span class="p">()</span><span class="si">}</span>
</span><span id="reply-74"><a href="#reply-74"><span class="linenos">74</span></a><span class="s2">Content-Length: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="si">}</span>
</span><span id="reply-75"><a href="#reply-75"><span class="linenos">75</span></a>
</span><span id="reply-76"><a href="#reply-76"><span class="linenos">76</span></a><span class="s2">&quot;&quot;&quot;</span>
</span><span id="reply-77"><a href="#reply-77"><span class="linenos">77</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">reply_header</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span><span id="reply-78"><a href="#reply-78"><span class="linenos">78</span></a> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
</span><span id="reply-79"><a href="#reply-79"><span class="linenos">79</span></a>
</span><span id="reply-80"><a href="#reply-80"><span class="linenos">80</span></a> <span class="n">log_reply</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
<a class="headerlink" href="#prepare_resource"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="prepare_resource-108"><a href="#prepare_resource-108"><span class="linenos">108</span></a><span class="k">def</span> <span class="nf">prepare_resource</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">req</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span><span id="prepare_resource-109"><a href="#prepare_resource-109"><span class="linenos">109</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="prepare_resource-110"><a href="#prepare_resource-110"><span class="linenos">110</span></a><span class="sd"> Retrieves the content of the resource and sets the status code.</span>
</span><span id="prepare_resource-111"><a href="#prepare_resource-111"><span class="linenos">111</span></a>
</span><span id="prepare_resource-112"><a href="#prepare_resource-112"><span class="linenos">112</span></a><span class="sd"> Parameters</span>
</span><span id="prepare_resource-113"><a href="#prepare_resource-113"><span class="linenos">113</span></a><span class="sd"> ----------</span>
</span><span id="prepare_resource-114"><a href="#prepare_resource-114"><span class="linenos">114</span></a><span class="sd"> - root: str</span>
</span><span id="prepare_resource-115"><a href="#prepare_resource-115"><span class="linenos">115</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="prepare_resource-116"><a href="#prepare_resource-116"><span class="linenos">116</span></a><span class="sd"> - req: dict[str, dict]</span>
</span><span id="prepare_resource-117"><a href="#prepare_resource-117"><span class="linenos">117</span></a><span class="sd"> The request to proceed.</span>
</span><span id="prepare_resource-118"><a href="#prepare_resource-118"><span class="linenos">118</span></a>
</span><span id="prepare_resource-119"><a href="#prepare_resource-119"><span class="linenos">119</span></a><span class="sd"> Returns</span>
</span><span id="prepare_resource-120"><a href="#prepare_resource-120"><span class="linenos">120</span></a><span class="sd"> -------</span>
</span><span id="prepare_resource-121"><a href="#prepare_resource-121"><span class="linenos">121</span></a><span class="sd"> tuple </span>
</span><span id="prepare_resource-122"><a href="#prepare_resource-122"><span class="linenos">122</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="prepare_resource-123"><a href="#prepare_resource-123"><span class="linenos">123</span></a><span class="sd"> - data: str</span>
</span><span id="prepare_resource-124"><a href="#prepare_resource-124"><span class="linenos">124</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="prepare_resource-125"><a href="#prepare_resource-125"><span class="linenos">125</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_resource-126"><a href="#prepare_resource-126"><span class="linenos">126</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="prepare_resource-127"><a href="#prepare_resource-127"><span class="linenos">127</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="prepare_resource-128"><a href="#prepare_resource-128"><span class="linenos">128</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">200</span>
</span><span id="prepare_resource-129"><a href="#prepare_resource-129"><span class="linenos">129</span></a> <span class="n">content</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
</span><span id="prepare_resource-130"><a href="#prepare_resource-130"><span class="linenos">130</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="prepare_resource-131"><a href="#prepare_resource-131"><span class="linenos">131</span></a>
</span><span id="prepare_resource-132"><a href="#prepare_resource-132"><span class="linenos">132</span></a> <span class="n">res_path</span><span class="p">,</span> <span class="n">res_extension</span> <span class="o">=</span> <span class="n">resolve_location</span><span class="p">(</span><span class="n">req</span><span class="p">[</span><span class="s1">&#39;head&#39;</span><span class="p">][</span><span class="s1">&#39;resource&#39;</span><span class="p">],</span> <span class="n">root</span><span class="p">)</span>
</span><span id="prepare_resource-133"><a href="#prepare_resource-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="n">res_path</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
</span><span id="prepare_resource-134"><a href="#prepare_resource-134"><span class="linenos">134</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">404</span>
</span><span id="prepare_resource-135"><a href="#prepare_resource-135"><span class="linenos">135</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="prepare_resource-136"><a href="#prepare_resource-136"><span class="linenos">136</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">get_http_content_type</span><span class="p">(</span><span class="n">res_extension</span><span class="p">)</span>
</span><span id="prepare_resource-137"><a href="#prepare_resource-137"><span class="linenos">137</span></a> <span class="n">content</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="n">get_resource</span><span class="p">(</span><span class="n">res_path</span><span class="p">)</span>
</span><span id="prepare_resource-138"><a href="#prepare_resource-138"><span class="linenos">138</span></a>
</span><span id="prepare_resource-139"><a href="#prepare_resource-139"><span class="linenos">139</span></a> <span class="k">return</span> <span class="n">prepare_reply</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">content_type</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Retrieves the content of the resource and sets the status code.</p>
<h2 id="parameters">Parameters</h2>
<ul>
<li>root: str
The path to the local directory to serve.</li>
<li>req: dict[str, dict]
The request to proceed.</li>
</ul>
<h2 id="returns">Returns</h2>
<p>tuple
The reply for the request, including the data and status code.
- data: str
The data (header + content) to reply on the socket.
- code: int
The status code for the reply.</p>
</div>
</section>
<section id="prepare_reply">
<input id="prepare_reply-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">prepare_reply</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span>, </span><span class="param"><span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">code</span><span class="p">:</span> <span class="nb">int</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="prepare_reply-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#prepare_reply"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="prepare_reply-142"><a href="#prepare_reply-142"><span class="linenos">142</span></a><span class="k">def</span> <span class="nf">prepare_reply</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">,</span> <span class="n">content_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">code</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="prepare_reply-143"><a href="#prepare_reply-143"><span class="linenos">143</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="prepare_reply-144"><a href="#prepare_reply-144"><span class="linenos">144</span></a><span class="sd"> Generates the proper answer, including the HTTP headers and content of the</span>
</span><span id="prepare_reply-145"><a href="#prepare_reply-145"><span class="linenos">145</span></a><span class="sd"> webpage, and the status code.</span>
</span><span id="prepare_reply-146"><a href="#prepare_reply-146"><span class="linenos">146</span></a>
</span><span id="prepare_reply-147"><a href="#prepare_reply-147"><span class="linenos">147</span></a><span class="sd"> For more information about:</span>
</span><span id="prepare_reply-148"><a href="#prepare_reply-148"><span class="linenos">148</span></a><span class="sd"> * Content type, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types</span>
</span><span id="prepare_reply-149"><a href="#prepare_reply-149"><span class="linenos">149</span></a><span class="sd"> * Status code, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</span>
</span><span id="prepare_reply-150"><a href="#prepare_reply-150"><span class="linenos">150</span></a>
</span><span id="prepare_reply-151"><a href="#prepare_reply-151"><span class="linenos">151</span></a><span class="sd"> Parameters</span>
</span><span id="prepare_reply-152"><a href="#prepare_reply-152"><span class="linenos">152</span></a><span class="sd"> ----------</span>
</span><span id="prepare_reply-153"><a href="#prepare_reply-153"><span class="linenos">153</span></a><span class="sd"> - content: bytes</span>
</span><span id="prepare_reply-154"><a href="#prepare_reply-154"><span class="linenos">154</span></a><span class="sd"> The raw data for the resource.</span>
</span><span id="prepare_reply-155"><a href="#prepare_reply-155"><span class="linenos">155</span></a><span class="sd"> - content_type: str</span>
</span><span id="prepare_reply-156"><a href="#prepare_reply-156"><span class="linenos">156</span></a><span class="sd"> The content type for the resource.</span>
</span><span id="prepare_reply-157"><a href="#prepare_reply-157"><span class="linenos">157</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_reply-158"><a href="#prepare_reply-158"><span class="linenos">158</span></a><span class="sd"> The status code.</span>
</span><span id="prepare_reply-159"><a href="#prepare_reply-159"><span class="linenos">159</span></a>
</span><span id="prepare_reply-160"><a href="#prepare_reply-160"><span class="linenos">160</span></a><span class="sd"> Returns</span>
</span><span id="prepare_reply-161"><a href="#prepare_reply-161"><span class="linenos">161</span></a><span class="sd"> -------</span>
</span><span id="prepare_reply-162"><a href="#prepare_reply-162"><span class="linenos">162</span></a><span class="sd"> tuple </span>
</span><span id="prepare_reply-163"><a href="#prepare_reply-163"><span class="linenos">163</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="prepare_reply-164"><a href="#prepare_reply-164"><span class="linenos">164</span></a><span class="sd"> - data: str</span>
</span><span id="prepare_reply-165"><a href="#prepare_reply-165"><span class="linenos">165</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="prepare_reply-166"><a href="#prepare_reply-166"><span class="linenos">166</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_reply-167"><a href="#prepare_reply-167"><span class="linenos">167</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="prepare_reply-168"><a href="#prepare_reply-168"><span class="linenos">168</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="prepare_reply-169"><a href="#prepare_reply-169"><span class="linenos">169</span></a> <span class="c1"># Prepare status code</span>
</span><span id="prepare_reply-170"><a href="#prepare_reply-170"><span class="linenos">170</span></a> <span class="n">http_code_dict</span> <span class="o">=</span> <span class="n">get_http_code</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
</span><span id="prepare_reply-171"><a href="#prepare_reply-171"><span class="linenos">171</span></a> <span class="k">if</span> <span class="n">code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="prepare_reply-172"><a href="#prepare_reply-172"><span class="linenos">172</span></a> <span class="n">content</span> <span class="o">=</span> <span class="n">http_code_dict</span><span class="p">[</span><span class="s1">&#39;html&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="prepare_reply-173"><a href="#prepare_reply-173"><span class="linenos">173</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="n">get_http_content_type</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;; charset=utf-8&quot;</span>
</span><span id="prepare_reply-174"><a href="#prepare_reply-174"><span class="linenos">174</span></a>
</span><span id="prepare_reply-175"><a href="#prepare_reply-175"><span class="linenos">175</span></a> <span class="c1"># Prepare header</span>
</span><span id="prepare_reply-176"><a href="#prepare_reply-176"><span class="linenos">176</span></a> <span class="n">header</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;HTTP/1.0 </span><span class="si">{</span><span class="n">http_code_dict</span><span class="p">[</span><span class="s1">&#39;header&#39;</span><span class="p">]</span><span class="si">}</span>
</span><span id="prepare_reply-177"><a href="#prepare_reply-177"><span class="linenos">177</span></a><span class="s2">Content-Type: </span><span class="si">{</span><span class="n">content_type</span><span class="si">}</span>
</span><span id="prepare_reply-178"><a href="#prepare_reply-178"><span class="linenos">178</span></a><span class="s2">Date: </span><span class="si">{</span><span class="n">now_rfc2616</span><span class="p">()</span><span class="si">}</span>
</span><span id="prepare_reply-179"><a href="#prepare_reply-179"><span class="linenos">179</span></a><span class="s2">Content-Length: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="si">}</span>
</span><span id="prepare_reply-180"><a href="#prepare_reply-180"><span class="linenos">180</span></a><span class="s2">Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="prepare_reply-181"><a href="#prepare_reply-181"><span class="linenos">181</span></a>
</span><span id="prepare_reply-182"><a href="#prepare_reply-182"><span class="linenos">182</span></a><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span><span id="prepare_reply-183"><a href="#prepare_reply-183"><span class="linenos">183</span></a>
</span><span id="prepare_reply-184"><a href="#prepare_reply-184"><span class="linenos">184</span></a> <span class="k">return</span> <span class="n">header</span> <span class="o">+</span> <span class="n">content</span><span class="p">,</span> <span class="n">code</span>
</span></pre></div>
<div class="docstring"><p>Generates the proper answer, including the HTTP headers and content of the
webpage, and the status code.</p>
<p>For more information about:</p>
<ul>
<li>Content type, see <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types</a></li>
<li>Status code, see <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</a></li>
</ul>
<h2 id="parameters">Parameters</h2>
<ul>
<li>content: bytes
The raw data for the resource.</li>
<li>content_type: str
The content type for the resource.</li>
<li>code: int
The status code.</li>
</ul>
<h2 id="returns">Returns</h2>
<p>tuple
The reply for the request, including the data and status code.
- data: str
The data (header + content) to reply on the socket.
- code: int
The status code for the reply.</p>
</div>
</section>
</main>

View file

@ -31,6 +31,7 @@
<h2>Submodules</h2>
<ul>
<li><a href="tests/test_file.html">test_file</a></li>
<li><a href="tests/test_http_request.html">test_http_request</a></li>
<li><a href="tests/test_log.html">test_log</a></li>
<li><a href="tests/test_server.html">test_server</a></li>

File diff suppressed because one or more lines are too long

View file

@ -36,6 +36,21 @@
<li>
<a class="function" href="#test_log_address">test_log_address</a>
</li>
<li>
<a class="function" href="#test_log_request">test_log_request</a>
</li>
<li>
<a class="function" href="#test_log_request_useragent">test_log_request_useragent</a>
</li>
<li>
<a class="function" href="#test_log_request_failed_assert">test_log_request_failed_assert</a>
</li>
<li>
<a class="function" href="#test_log_reply">test_log_reply</a>
</li>
<li>
<a class="function" href="#test_log_reply_useragent">test_log_reply_useragent</a>
</li>
</ul>
@ -59,49 +74,159 @@
<label class="view-source-button" for="mod-test_log-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">Script to test the myserver module.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">import</span> <span class="nn">pytest</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">import</span> <span class="nn">io</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">redirect_stdout</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">myserver.log</span> <span class="kn">import</span> <span class="n">log</span><span class="p">,</span> <span class="n">log_address</span><span class="p">,</span> <span class="n">log_request</span><span class="p">,</span> <span class="n">log_reply</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="k">def</span> <span class="nf">test_log</span><span class="p">():</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd"> Tests the log() function by capturing stdout.</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">log</span><span class="p">(</span><span class="s1">&#39;test message&#39;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - test message</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a><span class="k">def</span> <span class="nf">test_log_address</span><span class="p">():</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a><span class="sd"> Tests the log_address() function by capturing stdout.</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="n">log_address</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="s1">&#39;test message&#39;</span><span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - test message</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1">######################################################################</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1"># Copyright (c) Adrien Luxey-Bitri, Boris Baldassari</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1">#</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># This program and the accompanying materials are made</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># available under the terms of the Eclipse Public License 2.0</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># which is available at https://www.eclipse.org/legal/epl-2.0/</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1">#</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># SPDX-License-Identifier: EPL-2.0</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1">######################################################################</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd">Script to test the myserver module.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">import</span> <span class="nn">pytest</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="kn">import</span> <span class="nn">io</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">redirect_stdout</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="kn">from</span> <span class="nn">myserver.log</span> <span class="kn">import</span> <span class="n">log</span><span class="p">,</span> <span class="n">log_address</span><span class="p">,</span> <span class="n">log_request</span><span class="p">,</span> <span class="n">log_reply</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="k">def</span> <span class="nf">test_log</span><span class="p">():</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> Tests the log() function by capturing stdout.</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">log</span><span class="p">(</span><span class="s1">&#39;test message&#39;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - test message</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="k">def</span> <span class="nf">test_log_address</span><span class="p">():</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a><span class="sd"> Tests the log_address() function by capturing stdout.</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="n">log_address</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="s1">&#39;test message&#39;</span><span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - test message</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="k">def</span> <span class="nf">test_log_request</span><span class="p">():</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="sd"> Tests the log_request() function by capturing stdout.</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="p">}</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="p">}</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="k">def</span> <span class="nf">test_log_request_useragent</span><span class="p">():</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a><span class="sd"> Tests the log_request() function by capturing stdout.</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="p">},</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="s1">&#39;params&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="s1">&#39;MyTest UserAgent v1.23&#39;</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="p">}</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="p">}</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="k">def</span> <span class="nf">test_log_request_failed_assert</span><span class="p">():</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> Tests if the log_request() function properly fails when wrong</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> parameters are provided.</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="p">}</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="p">}</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">with</span> <span class="n">pytest</span><span class="o">.</span><span class="n">raises</span><span class="p">(</span><span class="ne">AssertionError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e_info</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="s1">&#39;whatever&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="p">}</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="p">}</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">with</span> <span class="n">pytest</span><span class="o">.</span><span class="n">raises</span><span class="p">(</span><span class="ne">AssertionError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e_info</span><span class="p">:</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="k">def</span> <span class="nf">test_log_reply</span><span class="p">():</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd"> Tests the log_reply() function by checking its output.</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="p">}</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 200</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="c1"># Check a different status code.</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">403</span><span class="p">)</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 403</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a><span class="k">def</span> <span class="nf">test_log_reply_useragent</span><span class="p">():</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a><span class="sd"> Tests the log_reply() function by checking its output.</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="p">},</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="s1">&#39;params&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="s1">&#39;MyTest UserAgent v1.23&#39;</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="p">}</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="p">}</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 200 - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">502</span><span class="p">)</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 127.0.0.1:12345 - GET /index.html - 502 - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></pre></div>
@ -163,6 +288,206 @@
</div>
</section>
<section id="test_log_request">
<input id="test_log_request-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">test_log_request</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_log_request-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_log_request"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_log_request-47"><a href="#test_log_request-47"><span class="linenos">47</span></a><span class="k">def</span> <span class="nf">test_log_request</span><span class="p">():</span>
</span><span id="test_log_request-48"><a href="#test_log_request-48"><span class="linenos">48</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_log_request-49"><a href="#test_log_request-49"><span class="linenos">49</span></a><span class="sd"> Tests the log_request() function by capturing stdout.</span>
</span><span id="test_log_request-50"><a href="#test_log_request-50"><span class="linenos">50</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_log_request-51"><a href="#test_log_request-51"><span class="linenos">51</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_request-52"><a href="#test_log_request-52"><span class="linenos">52</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_request-53"><a href="#test_log_request-53"><span class="linenos">53</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_request-54"><a href="#test_log_request-54"><span class="linenos">54</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="test_log_request-55"><a href="#test_log_request-55"><span class="linenos">55</span></a> <span class="p">}</span>
</span><span id="test_log_request-56"><a href="#test_log_request-56"><span class="linenos">56</span></a> <span class="p">}</span>
</span><span id="test_log_request-57"><a href="#test_log_request-57"><span class="linenos">57</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="test_log_request-58"><a href="#test_log_request-58"><span class="linenos">58</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_request-59"><a href="#test_log_request-59"><span class="linenos">59</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="test_log_request-60"><a href="#test_log_request-60"><span class="linenos">60</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_request-61"><a href="#test_log_request-61"><span class="linenos">61</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_request-62"><a href="#test_log_request-62"><span class="linenos">62</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Tests the log_request() function by capturing stdout.</p>
</div>
</section>
<section id="test_log_request_useragent">
<input id="test_log_request_useragent-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">test_log_request_useragent</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_log_request_useragent-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_log_request_useragent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_log_request_useragent-64"><a href="#test_log_request_useragent-64"><span class="linenos">64</span></a><span class="k">def</span> <span class="nf">test_log_request_useragent</span><span class="p">():</span>
</span><span id="test_log_request_useragent-65"><a href="#test_log_request_useragent-65"><span class="linenos">65</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_log_request_useragent-66"><a href="#test_log_request_useragent-66"><span class="linenos">66</span></a><span class="sd"> Tests the log_request() function by capturing stdout.</span>
</span><span id="test_log_request_useragent-67"><a href="#test_log_request_useragent-67"><span class="linenos">67</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_log_request_useragent-68"><a href="#test_log_request_useragent-68"><span class="linenos">68</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_request_useragent-69"><a href="#test_log_request_useragent-69"><span class="linenos">69</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_request_useragent-70"><a href="#test_log_request_useragent-70"><span class="linenos">70</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_request_useragent-71"><a href="#test_log_request_useragent-71"><span class="linenos">71</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="test_log_request_useragent-72"><a href="#test_log_request_useragent-72"><span class="linenos">72</span></a> <span class="p">},</span>
</span><span id="test_log_request_useragent-73"><a href="#test_log_request_useragent-73"><span class="linenos">73</span></a> <span class="s1">&#39;params&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_request_useragent-74"><a href="#test_log_request_useragent-74"><span class="linenos">74</span></a> <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="s1">&#39;MyTest UserAgent v1.23&#39;</span>
</span><span id="test_log_request_useragent-75"><a href="#test_log_request_useragent-75"><span class="linenos">75</span></a> <span class="p">}</span>
</span><span id="test_log_request_useragent-76"><a href="#test_log_request_useragent-76"><span class="linenos">76</span></a> <span class="p">}</span>
</span><span id="test_log_request_useragent-77"><a href="#test_log_request_useragent-77"><span class="linenos">77</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="test_log_request_useragent-78"><a href="#test_log_request_useragent-78"><span class="linenos">78</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_request_useragent-79"><a href="#test_log_request_useragent-79"><span class="linenos">79</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="test_log_request_useragent-80"><a href="#test_log_request_useragent-80"><span class="linenos">80</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_request_useragent-81"><a href="#test_log_request_useragent-81"><span class="linenos">81</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_request_useragent-82"><a href="#test_log_request_useragent-82"><span class="linenos">82</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Tests the log_request() function by capturing stdout.</p>
</div>
</section>
<section id="test_log_request_failed_assert">
<input id="test_log_request_failed_assert-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">test_log_request_failed_assert</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_log_request_failed_assert-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_log_request_failed_assert"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_log_request_failed_assert-84"><a href="#test_log_request_failed_assert-84"><span class="linenos"> 84</span></a><span class="k">def</span> <span class="nf">test_log_request_failed_assert</span><span class="p">():</span>
</span><span id="test_log_request_failed_assert-85"><a href="#test_log_request_failed_assert-85"><span class="linenos"> 85</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_log_request_failed_assert-86"><a href="#test_log_request_failed_assert-86"><span class="linenos"> 86</span></a><span class="sd"> Tests if the log_request() function properly fails when wrong</span>
</span><span id="test_log_request_failed_assert-87"><a href="#test_log_request_failed_assert-87"><span class="linenos"> 87</span></a><span class="sd"> parameters are provided.</span>
</span><span id="test_log_request_failed_assert-88"><a href="#test_log_request_failed_assert-88"><span class="linenos"> 88</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_log_request_failed_assert-89"><a href="#test_log_request_failed_assert-89"><span class="linenos"> 89</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_request_failed_assert-90"><a href="#test_log_request_failed_assert-90"><span class="linenos"> 90</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_request_failed_assert-91"><a href="#test_log_request_failed_assert-91"><span class="linenos"> 91</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_request_failed_assert-92"><a href="#test_log_request_failed_assert-92"><span class="linenos"> 92</span></a> <span class="p">}</span>
</span><span id="test_log_request_failed_assert-93"><a href="#test_log_request_failed_assert-93"><span class="linenos"> 93</span></a> <span class="p">}</span>
</span><span id="test_log_request_failed_assert-94"><a href="#test_log_request_failed_assert-94"><span class="linenos"> 94</span></a> <span class="k">with</span> <span class="n">pytest</span><span class="o">.</span><span class="n">raises</span><span class="p">(</span><span class="ne">AssertionError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e_info</span><span class="p">:</span>
</span><span id="test_log_request_failed_assert-95"><a href="#test_log_request_failed_assert-95"><span class="linenos"> 95</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span><span id="test_log_request_failed_assert-96"><a href="#test_log_request_failed_assert-96"><span class="linenos"> 96</span></a>
</span><span id="test_log_request_failed_assert-97"><a href="#test_log_request_failed_assert-97"><span class="linenos"> 97</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_request_failed_assert-98"><a href="#test_log_request_failed_assert-98"><span class="linenos"> 98</span></a> <span class="s1">&#39;whatever&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_request_failed_assert-99"><a href="#test_log_request_failed_assert-99"><span class="linenos"> 99</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_request_failed_assert-100"><a href="#test_log_request_failed_assert-100"><span class="linenos">100</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="test_log_request_failed_assert-101"><a href="#test_log_request_failed_assert-101"><span class="linenos">101</span></a> <span class="p">}</span>
</span><span id="test_log_request_failed_assert-102"><a href="#test_log_request_failed_assert-102"><span class="linenos">102</span></a> <span class="p">}</span>
</span><span id="test_log_request_failed_assert-103"><a href="#test_log_request_failed_assert-103"><span class="linenos">103</span></a> <span class="k">with</span> <span class="n">pytest</span><span class="o">.</span><span class="n">raises</span><span class="p">(</span><span class="ne">AssertionError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e_info</span><span class="p">:</span>
</span><span id="test_log_request_failed_assert-104"><a href="#test_log_request_failed_assert-104"><span class="linenos">104</span></a> <span class="n">log_request</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Tests if the log_request() function properly fails when wrong
parameters are provided.</p>
</div>
</section>
<section id="test_log_reply">
<input id="test_log_reply-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">test_log_reply</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_log_reply-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_log_reply"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_log_reply-106"><a href="#test_log_reply-106"><span class="linenos">106</span></a><span class="k">def</span> <span class="nf">test_log_reply</span><span class="p">():</span>
</span><span id="test_log_reply-107"><a href="#test_log_reply-107"><span class="linenos">107</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_log_reply-108"><a href="#test_log_reply-108"><span class="linenos">108</span></a><span class="sd"> Tests the log_reply() function by checking its output.</span>
</span><span id="test_log_reply-109"><a href="#test_log_reply-109"><span class="linenos">109</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_log_reply-110"><a href="#test_log_reply-110"><span class="linenos">110</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_reply-111"><a href="#test_log_reply-111"><span class="linenos">111</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_reply-112"><a href="#test_log_reply-112"><span class="linenos">112</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_reply-113"><a href="#test_log_reply-113"><span class="linenos">113</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="test_log_reply-114"><a href="#test_log_reply-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="test_log_reply-115"><a href="#test_log_reply-115"><span class="linenos">115</span></a> <span class="p">}</span>
</span><span id="test_log_reply-116"><a href="#test_log_reply-116"><span class="linenos">116</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="test_log_reply-117"><a href="#test_log_reply-117"><span class="linenos">117</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_reply-118"><a href="#test_log_reply-118"><span class="linenos">118</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span><span id="test_log_reply-119"><a href="#test_log_reply-119"><span class="linenos">119</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_reply-120"><a href="#test_log_reply-120"><span class="linenos">120</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_reply-121"><a href="#test_log_reply-121"><span class="linenos">121</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 200</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="test_log_reply-122"><a href="#test_log_reply-122"><span class="linenos">122</span></a>
</span><span id="test_log_reply-123"><a href="#test_log_reply-123"><span class="linenos">123</span></a> <span class="c1"># Check a different status code.</span>
</span><span id="test_log_reply-124"><a href="#test_log_reply-124"><span class="linenos">124</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_reply-125"><a href="#test_log_reply-125"><span class="linenos">125</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">403</span><span class="p">)</span>
</span><span id="test_log_reply-126"><a href="#test_log_reply-126"><span class="linenos">126</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_reply-127"><a href="#test_log_reply-127"><span class="linenos">127</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_reply-128"><a href="#test_log_reply-128"><span class="linenos">128</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 403</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Tests the log_reply() function by checking its output.</p>
</div>
</section>
<section id="test_log_reply_useragent">
<input id="test_log_reply_useragent-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">test_log_reply_useragent</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_log_reply_useragent-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_log_reply_useragent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_log_reply_useragent-130"><a href="#test_log_reply_useragent-130"><span class="linenos">130</span></a><span class="k">def</span> <span class="nf">test_log_reply_useragent</span><span class="p">():</span>
</span><span id="test_log_reply_useragent-131"><a href="#test_log_reply_useragent-131"><span class="linenos">131</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_log_reply_useragent-132"><a href="#test_log_reply_useragent-132"><span class="linenos">132</span></a><span class="sd"> Tests the log_reply() function by checking its output.</span>
</span><span id="test_log_reply_useragent-133"><a href="#test_log_reply_useragent-133"><span class="linenos">133</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_log_reply_useragent-134"><a href="#test_log_reply_useragent-134"><span class="linenos">134</span></a> <span class="n">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="test_log_reply_useragent-135"><a href="#test_log_reply_useragent-135"><span class="linenos">135</span></a> <span class="s1">&#39;head&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_reply_useragent-136"><a href="#test_log_reply_useragent-136"><span class="linenos">136</span></a> <span class="s1">&#39;verb&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span id="test_log_reply_useragent-137"><a href="#test_log_reply_useragent-137"><span class="linenos">137</span></a> <span class="s1">&#39;resource&#39;</span><span class="p">:</span> <span class="s1">&#39;/index.html&#39;</span>
</span><span id="test_log_reply_useragent-138"><a href="#test_log_reply_useragent-138"><span class="linenos">138</span></a> <span class="p">},</span>
</span><span id="test_log_reply_useragent-139"><a href="#test_log_reply_useragent-139"><span class="linenos">139</span></a> <span class="s1">&#39;params&#39;</span><span class="p">:</span> <span class="p">{</span>
</span><span id="test_log_reply_useragent-140"><a href="#test_log_reply_useragent-140"><span class="linenos">140</span></a> <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="s1">&#39;MyTest UserAgent v1.23&#39;</span>
</span><span id="test_log_reply_useragent-141"><a href="#test_log_reply_useragent-141"><span class="linenos">141</span></a> <span class="p">}</span>
</span><span id="test_log_reply_useragent-142"><a href="#test_log_reply_useragent-142"><span class="linenos">142</span></a> <span class="p">}</span>
</span><span id="test_log_reply_useragent-143"><a href="#test_log_reply_useragent-143"><span class="linenos">143</span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
</span><span id="test_log_reply_useragent-144"><a href="#test_log_reply_useragent-144"><span class="linenos">144</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_reply_useragent-145"><a href="#test_log_reply_useragent-145"><span class="linenos">145</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span><span id="test_log_reply_useragent-146"><a href="#test_log_reply_useragent-146"><span class="linenos">146</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_reply_useragent-147"><a href="#test_log_reply_useragent-147"><span class="linenos">147</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_reply_useragent-148"><a href="#test_log_reply_useragent-148"><span class="linenos">148</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 0.0.0.0:12345 - GET /index.html - 200 - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span><span id="test_log_reply_useragent-149"><a href="#test_log_reply_useragent-149"><span class="linenos">149</span></a>
</span><span id="test_log_reply_useragent-150"><a href="#test_log_reply_useragent-150"><span class="linenos">150</span></a> <span class="k">with</span> <span class="n">redirect_stdout</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span id="test_log_reply_useragent-151"><a href="#test_log_reply_useragent-151"><span class="linenos">151</span></a> <span class="n">log_reply</span><span class="p">((</span><span class="s1">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="mi">12345</span><span class="p">),</span> <span class="n">req</span><span class="p">,</span> <span class="mi">502</span><span class="p">)</span>
</span><span id="test_log_reply_useragent-152"><a href="#test_log_reply_useragent-152"><span class="linenos">152</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</span><span id="test_log_reply_useragent-153"><a href="#test_log_reply_useragent-153"><span class="linenos">153</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span id="test_log_reply_useragent-154"><a href="#test_log_reply_useragent-154"><span class="linenos">154</span></a> <span class="k">assert</span> <span class="n">out</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; - 127.0.0.1:12345 - GET /index.html - 502 - MyTest UserAgent v1.23</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Tests the log_reply() function by checking its output.</p>
</div>
</section>
</main>
<script>

View file

@ -79,44 +79,45 @@
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">import</span> <span class="nn">pytest</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">import</span> <span class="nn">requests</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">threading</span> <span class="kn">import</span> <span class="n">Thread</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">import</span> <span class="nn">_thread</span><span class="o">,</span> <span class="nn">signal</span><span class="o">,</span> <span class="nn">sys</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="c1"># import _thread, signal, sys</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">myserver.server</span> <span class="kn">import</span> <span class="n">serve</span> <span class="c1">#, handle_client, reply</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="n">HTTP_PORT</span> <span class="o">=</span> <span class="mi">12345</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="sd">&quot;&quot;&quot; The port to use during the tests, both for the server and client. &quot;&quot;&quot;</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="nd">@pytest</span><span class="o">.</span><span class="n">fixture</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="k">def</span> <span class="nf">start_server</span><span class="p">():</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a><span class="sd"> Automatically starts and stops the server when running the tests.</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="n">thread</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">serve</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">HTTP_PORT</span><span class="p">,</span> <span class="s1">&#39;resources/www&#39;</span><span class="p">))</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="c1">#signal.signal( signal.SIGINT, lambda s, f : exit() )</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="c1"># run the thread</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="k">yield</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="c1"># wait for the thread to finish</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">_thread</span><span class="o">.</span><span class="n">interrupt_main</span><span class="p">()</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Waiting for the thread...&#39;</span><span class="p">)</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="k">return</span> <span class="mi">0</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a><span class="k">def</span> <span class="nf">test_serve</span><span class="p">(</span><span class="n">start_server</span><span class="p">):</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a><span class="sd"> Tests the serve() function by using the requests module.</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="c1"># The function is called automatically (autouse=True) ...</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="c1"># before and after all the tests in the file (scope=&quot;module&quot;)</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a><span class="nd">@pytest</span><span class="o">.</span><span class="n">fixture</span><span class="p">(</span><span class="n">autouse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="s2">&quot;module&quot;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="k">def</span> <span class="nf">start_server</span><span class="p">():</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a><span class="sd"> Automatically starts and stops the server when running the tests.</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">thread</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">serve</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">HTTP_PORT</span><span class="p">,</span> <span class="s1">&#39;resources/www&#39;</span><span class="p">))</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="c1"># run the thread</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="c1">#thread.daemon = True</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="k">yield</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="c1"># print(&quot;Sending KeyboardInterrupt to server thread...&quot;)</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="c1"># # Error: interrupts test thread, not the tested server</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="c1"># thread.interrupt_main()</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="c1"># # wait for the thread to finish</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="c1"># print(&quot;Waiting for the thread to join...&quot;)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="c1"># thread.join()</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="k">return</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a><span class="sd"> Uses the start_server fixture to start and stop the serverduring the tests.</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;http://localhost:</span><span class="si">{</span><span class="n">HTTP_PORT</span><span class="si">}</span><span class="s2">/&quot;</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Starting server on </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="n">ret</span> <span class="o">=</span> <span class="n">start_server</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Requesting url </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="n">url</span> <span class="p">)</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="k">assert</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">2</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a><span class="k">def</span> <span class="nf">test_serve</span><span class="p">():</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a><span class="sd"> Tests the serve() function by using the requests module.</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a><span class="sd"> Uses the start_server fixture to start and stop the serverduring the tests.</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a> <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;http://localhost:</span><span class="si">{</span><span class="n">HTTP_PORT</span><span class="si">}</span><span class="s2">/&quot;</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Requesting url </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="n">url</span> <span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
</span></pre></div>
@ -138,7 +139,7 @@
<section id="start_server">
<input id="start_server-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@pytest.fixture</div>
<div class="decorator">@pytest.fixture(autouse=True, scope=&#39;module&#39;)</div>
<span class="def">def</span>
<span class="name">start_server</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
@ -147,22 +148,23 @@
</div>
<a class="headerlink" href="#start_server"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="start_server-26"><a href="#start_server-26"><span class="linenos">26</span></a><span class="nd">@pytest</span><span class="o">.</span><span class="n">fixture</span>
</span><span id="start_server-27"><a href="#start_server-27"><span class="linenos">27</span></a><span class="k">def</span> <span class="nf">start_server</span><span class="p">():</span>
</span><span id="start_server-28"><a href="#start_server-28"><span class="linenos">28</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="start_server-29"><a href="#start_server-29"><span class="linenos">29</span></a><span class="sd"> Automatically starts and stops the server when running the tests.</span>
</span><span id="start_server-30"><a href="#start_server-30"><span class="linenos">30</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="start_server-31"><a href="#start_server-31"><span class="linenos">31</span></a> <span class="n">thread</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">serve</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">HTTP_PORT</span><span class="p">,</span> <span class="s1">&#39;resources/www&#39;</span><span class="p">))</span>
</span><span id="start_server-32"><a href="#start_server-32"><span class="linenos">32</span></a> <span class="c1">#signal.signal( signal.SIGINT, lambda s, f : exit() )</span>
</span><span id="start_server-33"><a href="#start_server-33"><span class="linenos">33</span></a> <span class="c1"># run the thread</span>
</span><span id="start_server-34"><a href="#start_server-34"><span class="linenos">34</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="start_server-35"><a href="#start_server-35"><span class="linenos">35</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span><span id="start_server-36"><a href="#start_server-36"><span class="linenos">36</span></a> <span class="k">yield</span>
</span><span id="start_server-37"><a href="#start_server-37"><span class="linenos">37</span></a> <span class="c1"># wait for the thread to finish</span>
</span><span id="start_server-38"><a href="#start_server-38"><span class="linenos">38</span></a> <span class="n">_thread</span><span class="o">.</span><span class="n">interrupt_main</span><span class="p">()</span>
</span><span id="start_server-39"><a href="#start_server-39"><span class="linenos">39</span></a> <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Waiting for the thread...&#39;</span><span class="p">)</span>
</span><span id="start_server-40"><a href="#start_server-40"><span class="linenos">40</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
</span><span id="start_server-41"><a href="#start_server-41"><span class="linenos">41</span></a> <span class="k">return</span> <span class="mi">0</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="start_server-29"><a href="#start_server-29"><span class="linenos">29</span></a><span class="nd">@pytest</span><span class="o">.</span><span class="n">fixture</span><span class="p">(</span><span class="n">autouse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="s2">&quot;module&quot;</span><span class="p">)</span>
</span><span id="start_server-30"><a href="#start_server-30"><span class="linenos">30</span></a><span class="k">def</span> <span class="nf">start_server</span><span class="p">():</span>
</span><span id="start_server-31"><a href="#start_server-31"><span class="linenos">31</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="start_server-32"><a href="#start_server-32"><span class="linenos">32</span></a><span class="sd"> Automatically starts and stops the server when running the tests.</span>
</span><span id="start_server-33"><a href="#start_server-33"><span class="linenos">33</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="start_server-34"><a href="#start_server-34"><span class="linenos">34</span></a> <span class="n">thread</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">serve</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">HTTP_PORT</span><span class="p">,</span> <span class="s1">&#39;resources/www&#39;</span><span class="p">))</span>
</span><span id="start_server-35"><a href="#start_server-35"><span class="linenos">35</span></a> <span class="c1"># run the thread</span>
</span><span id="start_server-36"><a href="#start_server-36"><span class="linenos">36</span></a> <span class="c1">#thread.daemon = True</span>
</span><span id="start_server-37"><a href="#start_server-37"><span class="linenos">37</span></a> <span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span><span id="start_server-38"><a href="#start_server-38"><span class="linenos">38</span></a> <span class="k">yield</span>
</span><span id="start_server-39"><a href="#start_server-39"><span class="linenos">39</span></a> <span class="c1"># print(&quot;Sending KeyboardInterrupt to server thread...&quot;)</span>
</span><span id="start_server-40"><a href="#start_server-40"><span class="linenos">40</span></a> <span class="c1"># # Error: interrupts test thread, not the tested server</span>
</span><span id="start_server-41"><a href="#start_server-41"><span class="linenos">41</span></a> <span class="c1"># thread.interrupt_main()</span>
</span><span id="start_server-42"><a href="#start_server-42"><span class="linenos">42</span></a> <span class="c1"># # wait for the thread to finish</span>
</span><span id="start_server-43"><a href="#start_server-43"><span class="linenos">43</span></a> <span class="c1"># print(&quot;Waiting for the thread to join...&quot;)</span>
</span><span id="start_server-44"><a href="#start_server-44"><span class="linenos">44</span></a> <span class="c1"># thread.join()</span>
</span><span id="start_server-45"><a href="#start_server-45"><span class="linenos">45</span></a> <span class="k">return</span>
</span></pre></div>
@ -176,25 +178,22 @@
<div class="attr function">
<span class="def">def</span>
<span class="name">test_serve</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">start_server</span></span><span class="return-annotation">):</span></span>
<span class="name">test_serve</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>
<label class="view-source-button" for="test_serve-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#test_serve"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_serve-44"><a href="#test_serve-44"><span class="linenos">44</span></a><span class="k">def</span> <span class="nf">test_serve</span><span class="p">(</span><span class="n">start_server</span><span class="p">):</span>
</span><span id="test_serve-45"><a href="#test_serve-45"><span class="linenos">45</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_serve-46"><a href="#test_serve-46"><span class="linenos">46</span></a><span class="sd"> Tests the serve() function by using the requests module.</span>
</span><span id="test_serve-47"><a href="#test_serve-47"><span class="linenos">47</span></a>
</span><span id="test_serve-48"><a href="#test_serve-48"><span class="linenos">48</span></a><span class="sd"> Uses the start_server fixture to start and stop the serverduring the tests.</span>
</span><span id="test_serve-49"><a href="#test_serve-49"><span class="linenos">49</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_serve-50"><a href="#test_serve-50"><span class="linenos">50</span></a> <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;http://localhost:</span><span class="si">{</span><span class="n">HTTP_PORT</span><span class="si">}</span><span class="s2">/&quot;</span>
</span><span id="test_serve-51"><a href="#test_serve-51"><span class="linenos">51</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Starting server on </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="test_serve-52"><a href="#test_serve-52"><span class="linenos">52</span></a> <span class="n">ret</span> <span class="o">=</span> <span class="n">start_server</span>
</span><span id="test_serve-53"><a href="#test_serve-53"><span class="linenos">53</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Requesting url </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="test_serve-54"><a href="#test_serve-54"><span class="linenos">54</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="n">url</span> <span class="p">)</span>
</span><span id="test_serve-55"><a href="#test_serve-55"><span class="linenos">55</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
</span><span id="test_serve-56"><a href="#test_serve-56"><span class="linenos">56</span></a> <span class="k">assert</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">2</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="test_serve-48"><a href="#test_serve-48"><span class="linenos">48</span></a><span class="k">def</span> <span class="nf">test_serve</span><span class="p">():</span>
</span><span id="test_serve-49"><a href="#test_serve-49"><span class="linenos">49</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="test_serve-50"><a href="#test_serve-50"><span class="linenos">50</span></a><span class="sd"> Tests the serve() function by using the requests module.</span>
</span><span id="test_serve-51"><a href="#test_serve-51"><span class="linenos">51</span></a>
</span><span id="test_serve-52"><a href="#test_serve-52"><span class="linenos">52</span></a><span class="sd"> Uses the start_server fixture to start and stop the serverduring the tests.</span>
</span><span id="test_serve-53"><a href="#test_serve-53"><span class="linenos">53</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="test_serve-54"><a href="#test_serve-54"><span class="linenos">54</span></a> <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;http://localhost:</span><span class="si">{</span><span class="n">HTTP_PORT</span><span class="si">}</span><span class="s2">/&quot;</span>
</span><span id="test_serve-55"><a href="#test_serve-55"><span class="linenos">55</span></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Requesting url </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="test_serve-56"><a href="#test_serve-56"><span class="linenos">56</span></a> <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="n">url</span> <span class="p">)</span>
</span><span id="test_serve-57"><a href="#test_serve-57"><span class="linenos">57</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
</span></pre></div>