Update docs.

This commit is contained in:
Boris Baldassari 2024-03-08 09:33:27 +01:00
parent bed0a72f08
commit 9648a058e0
3 changed files with 492 additions and 415 deletions

File diff suppressed because one or more lines are too long

View file

@ -92,105 +92,120 @@
</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-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"> An example of return:</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"> {</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd"> &#39;head&#39;: { &#39;verb&#39;: &#39;GET&#39;, &#39;resource&#39;: &#39;//index.html&#39;}, </span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd"> &#39;params&#39;: {</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="sd"> &#39;Host&#39;: &#39;localhost:8000&#39;, </span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a><span class="sd"> &#39;User-Agent&#39;: &#39;Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0&#39;, </span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="sd"> &#39;Accept&#39;: &#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8&#39;, </span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a><span class="sd"> &#39;Accept-Language&#39;: &#39;en-GB,en;q=0.5&#39;, </span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a><span class="sd"> &#39;Accept-Encoding&#39;: &#39;gzip, deflate, br&#39;,</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="sd"> [SNIP]</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"> }</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="sd"> ```</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="sd"> Parameters</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="sd"> ----------</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="sd"> - buf: bytes </span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="sd"> The HTTP request buffer.</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="sd"> Returns</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a><span class="sd"> -------</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a><span class="sd"> Raises</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a><span class="sd"> ------</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a><span class="sd"> ValueError</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</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-61"><a href="#L-61"><span class="linenos"> 61</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-62"><a href="#L-62"><span class="linenos"> 62</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-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="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-65"><a href="#L-65"><span class="linenos"> 65</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-66"><a href="#L-66"><span class="linenos"> 66</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-67"><a href="#L-67"><span class="linenos"> 67</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-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="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</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-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="p">)</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</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-75"><a href="#L-75"><span class="linenos"> 75</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-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"> The parsed request dict contains two keys:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> - verb: str</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd"> The _uppercase_ verb of the request, i.e. the first word of the line;</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> - resource: str</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> The requested resource, i.e. the second &quot;word&quot; of the line;</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> </span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> Parameters</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> ----------</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> - line: str</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</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="sd"> Returns</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a><span class="sd"> -------</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="sd"> </span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="sd"> Raises</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"> ValueError</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</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-101"><a href="#L-101"><span class="linenos">101</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-102"><a href="#L-102"><span class="linenos">102</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-103"><a href="#L-103"><span class="linenos">103</span></a>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</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-106"><a href="#L-106"><span class="linenos">106</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-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="p">)</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><span id="L-109"><a href="#L-109"><span class="linenos">109</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-110"><a href="#L-110"><span class="linenos">110</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-111"><a href="#L-111"><span class="linenos">111</span></a>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> The parsed request dict contains one key/value pair per line, with the </span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> dict key being the left part of the line (the parameter key), and the </span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> The function strips leading and trailing spaces: &quot; Host: a.org &quot; becomes</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> </span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="sd"> Parameters</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd"> ----------</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="sd"> HTTP parameters (one list item per line)</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="sd"> Returns</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd"> -------</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd"> dict[str, str]</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="sd"> </span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a><span class="sd"> Raises</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a><span class="sd"> ------</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a><span class="sd"> ValueError</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</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-136"><a href="#L-136"><span class="linenos">136</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-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">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-139"><a href="#L-139"><span class="linenos">139</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-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="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-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">return</span> <span class="n">params</span>
</span></pre></div>
@ -216,35 +231,50 @@
</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><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"> An example of return:</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"> {</span>
</span><span id="parse_request-34"><a href="#parse_request-34"><span class="linenos">34</span></a><span class="sd"> &#39;head&#39;: { &#39;verb&#39;: &#39;GET&#39;, &#39;resource&#39;: &#39;//index.html&#39;}, </span>
</span><span id="parse_request-35"><a href="#parse_request-35"><span class="linenos">35</span></a><span class="sd"> &#39;params&#39;: {</span>
</span><span id="parse_request-36"><a href="#parse_request-36"><span class="linenos">36</span></a><span class="sd"> &#39;Host&#39;: &#39;localhost:8000&#39;, </span>
</span><span id="parse_request-37"><a href="#parse_request-37"><span class="linenos">37</span></a><span class="sd"> &#39;User-Agent&#39;: &#39;Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0&#39;, </span>
</span><span id="parse_request-38"><a href="#parse_request-38"><span class="linenos">38</span></a><span class="sd"> &#39;Accept&#39;: &#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8&#39;, </span>
</span><span id="parse_request-39"><a href="#parse_request-39"><span class="linenos">39</span></a><span class="sd"> &#39;Accept-Language&#39;: &#39;en-GB,en;q=0.5&#39;, </span>
</span><span id="parse_request-40"><a href="#parse_request-40"><span class="linenos">40</span></a><span class="sd"> &#39;Accept-Encoding&#39;: &#39;gzip, deflate, br&#39;,</span>
</span><span id="parse_request-41"><a href="#parse_request-41"><span class="linenos">41</span></a><span class="sd"> [SNIP]</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"> }</span>
</span><span id="parse_request-44"><a href="#parse_request-44"><span class="linenos">44</span></a><span class="sd"> ```</span>
</span><span id="parse_request-45"><a href="#parse_request-45"><span class="linenos">45</span></a>
</span><span id="parse_request-46"><a href="#parse_request-46"><span class="linenos">46</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request-47"><a href="#parse_request-47"><span class="linenos">47</span></a><span class="sd"> ----------</span>
</span><span id="parse_request-48"><a href="#parse_request-48"><span class="linenos">48</span></a><span class="sd"> - buf: bytes </span>
</span><span id="parse_request-49"><a href="#parse_request-49"><span class="linenos">49</span></a><span class="sd"> The HTTP request buffer.</span>
</span><span id="parse_request-50"><a href="#parse_request-50"><span class="linenos">50</span></a>
</span><span id="parse_request-51"><a href="#parse_request-51"><span class="linenos">51</span></a><span class="sd"> Returns</span>
</span><span id="parse_request-52"><a href="#parse_request-52"><span class="linenos">52</span></a><span class="sd"> -------</span>
</span><span id="parse_request-53"><a href="#parse_request-53"><span class="linenos">53</span></a><span class="sd"> dict[str, dict]</span>
</span><span id="parse_request-54"><a href="#parse_request-54"><span class="linenos">54</span></a><span class="sd"> The parsed content of the HTTP request.</span>
</span><span id="parse_request-55"><a href="#parse_request-55"><span class="linenos">55</span></a>
</span><span id="parse_request-56"><a href="#parse_request-56"><span class="linenos">56</span></a><span class="sd"> Raises</span>
</span><span id="parse_request-57"><a href="#parse_request-57"><span class="linenos">57</span></a><span class="sd"> ------</span>
</span><span id="parse_request-58"><a href="#parse_request-58"><span class="linenos">58</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request-59"><a href="#parse_request-59"><span class="linenos">59</span></a><span class="sd"> The request is not valid HTTP.</span>
</span><span id="parse_request-60"><a href="#parse_request-60"><span class="linenos">60</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request-61"><a href="#parse_request-61"><span class="linenos">61</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-62"><a href="#parse_request-62"><span class="linenos">62</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-63"><a href="#parse_request-63"><span class="linenos">63</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-64"><a href="#parse_request-64"><span class="linenos">64</span></a>
</span><span id="parse_request-65"><a href="#parse_request-65"><span class="linenos">65</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-66"><a href="#parse_request-66"><span class="linenos">66</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-67"><a href="#parse_request-67"><span class="linenos">67</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-68"><a href="#parse_request-68"><span class="linenos">68</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-69"><a href="#parse_request-69"><span class="linenos">69</span></a>
</span><span id="parse_request-70"><a href="#parse_request-70"><span class="linenos">70</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request-71"><a href="#parse_request-71"><span class="linenos">71</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-72"><a href="#parse_request-72"><span class="linenos">72</span></a> <span class="n">params</span><span class="o">=</span><span class="n">req_params</span>
</span><span id="parse_request-73"><a href="#parse_request-73"><span class="linenos">73</span></a> <span class="p">)</span>
</span></pre></div>
@ -261,6 +291,21 @@ List of the HTTP parameters (i.e. the following lines);
output of <code><a href="#parse_request_params">parse_request_params</a></code>.</li>
</ul>
<p>An example of return:</p>
<pre><code>{
'head': { 'verb': 'GET', 'resource': '//index.html'},
'params': {
'Host': 'localhost:8000',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'en-GB,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
[SNIP]
}
}
</code></pre>
<h2 id="parameters">Parameters</h2>
<ul>
@ -292,40 +337,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-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>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_head-75"><a href="#parse_request_head-75"><span class="linenos"> 75</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-76"><a href="#parse_request_head-76"><span class="linenos"> 76</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-77"><a href="#parse_request_head-77"><span class="linenos"> 77</span></a>
</span><span id="parse_request_head-78"><a href="#parse_request_head-78"><span class="linenos"> 78</span></a><span class="sd"> The parsed request dict contains two keys:</span>
</span><span id="parse_request_head-79"><a href="#parse_request_head-79"><span class="linenos"> 79</span></a><span class="sd"> - verb: str</span>
</span><span id="parse_request_head-80"><a href="#parse_request_head-80"><span class="linenos"> 80</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-81"><a href="#parse_request_head-81"><span class="linenos"> 81</span></a><span class="sd"> for example: &quot;GET&quot;.</span>
</span><span id="parse_request_head-82"><a href="#parse_request_head-82"><span class="linenos"> 82</span></a><span class="sd"> - resource: str</span>
</span><span id="parse_request_head-83"><a href="#parse_request_head-83"><span class="linenos"> 83</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-84"><a href="#parse_request_head-84"><span class="linenos"> 84</span></a><span class="sd"> for example: &quot;/index.html&quot;.</span>
</span><span id="parse_request_head-85"><a href="#parse_request_head-85"><span class="linenos"> 85</span></a><span class="sd"> </span>
</span><span id="parse_request_head-86"><a href="#parse_request_head-86"><span class="linenos"> 86</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_head-87"><a href="#parse_request_head-87"><span class="linenos"> 87</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_head-88"><a href="#parse_request_head-88"><span class="linenos"> 88</span></a><span class="sd"> - line: str</span>
</span><span id="parse_request_head-89"><a href="#parse_request_head-89"><span class="linenos"> 89</span></a><span class="sd"> The HTTP request header (the first line of a full HTTP request).</span>
</span><span id="parse_request_head-90"><a href="#parse_request_head-90"><span class="linenos"> 90</span></a>
</span><span id="parse_request_head-91"><a href="#parse_request_head-91"><span class="linenos"> 91</span></a><span class="sd"> Returns</span>
</span><span id="parse_request_head-92"><a href="#parse_request_head-92"><span class="linenos"> 92</span></a><span class="sd"> -------</span>
</span><span id="parse_request_head-93"><a href="#parse_request_head-93"><span class="linenos"> 93</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_head-94"><a href="#parse_request_head-94"><span class="linenos"> 94</span></a><span class="sd"> The parsed content of the HTTP request header.</span>
</span><span id="parse_request_head-95"><a href="#parse_request_head-95"><span class="linenos"> 95</span></a><span class="sd"> </span>
</span><span id="parse_request_head-96"><a href="#parse_request_head-96"><span class="linenos"> 96</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_head-97"><a href="#parse_request_head-97"><span class="linenos"> 97</span></a><span class="sd"> ------</span>
</span><span id="parse_request_head-98"><a href="#parse_request_head-98"><span class="linenos"> 98</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_head-99"><a href="#parse_request_head-99"><span class="linenos"> 99</span></a><span class="sd"> The request header is not valid HTTP.</span>
</span><span id="parse_request_head-100"><a href="#parse_request_head-100"><span class="linenos">100</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_head-101"><a href="#parse_request_head-101"><span class="linenos">101</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-102"><a href="#parse_request_head-102"><span class="linenos">102</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-103"><a href="#parse_request_head-103"><span class="linenos">103</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-104"><a href="#parse_request_head-104"><span class="linenos">104</span></a>
</span><span id="parse_request_head-105"><a href="#parse_request_head-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
</span><span id="parse_request_head-106"><a href="#parse_request_head-106"><span class="linenos">106</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-107"><a href="#parse_request_head-107"><span class="linenos">107</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-108"><a href="#parse_request_head-108"><span class="linenos">108</span></a> <span class="p">)</span>
</span></pre></div>
@ -373,40 +418,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-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>
<div class="pdoc-code codehilite"><pre><span></span><span id="parse_request_params-110"><a href="#parse_request_params-110"><span class="linenos">110</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-111"><a href="#parse_request_params-111"><span class="linenos">111</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-112"><a href="#parse_request_params-112"><span class="linenos">112</span></a>
</span><span id="parse_request_params-113"><a href="#parse_request_params-113"><span class="linenos">113</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-114"><a href="#parse_request_params-114"><span class="linenos">114</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-115"><a href="#parse_request_params-115"><span class="linenos">115</span></a><span class="sd"> dict value being the right part of the line (the parameter value).</span>
</span><span id="parse_request_params-116"><a href="#parse_request_params-116"><span class="linenos">116</span></a>
</span><span id="parse_request_params-117"><a href="#parse_request_params-117"><span class="linenos">117</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-118"><a href="#parse_request_params-118"><span class="linenos">118</span></a><span class="sd"> `{&quot;Host&quot;: &quot;a.org&quot;}`.</span>
</span><span id="parse_request_params-119"><a href="#parse_request_params-119"><span class="linenos">119</span></a><span class="sd"> </span>
</span><span id="parse_request_params-120"><a href="#parse_request_params-120"><span class="linenos">120</span></a><span class="sd"> Parameters</span>
</span><span id="parse_request_params-121"><a href="#parse_request_params-121"><span class="linenos">121</span></a><span class="sd"> ----------</span>
</span><span id="parse_request_params-122"><a href="#parse_request_params-122"><span class="linenos">122</span></a><span class="sd"> - lines: list[str]</span>
</span><span id="parse_request_params-123"><a href="#parse_request_params-123"><span class="linenos">123</span></a><span class="sd"> HTTP parameters (one list item per line)</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="sd"> Returns</span>
</span><span id="parse_request_params-126"><a href="#parse_request_params-126"><span class="linenos">126</span></a><span class="sd"> -------</span>
</span><span id="parse_request_params-127"><a href="#parse_request_params-127"><span class="linenos">127</span></a><span class="sd"> dict[str, str]</span>
</span><span id="parse_request_params-128"><a href="#parse_request_params-128"><span class="linenos">128</span></a><span class="sd"> Dictionary of the parameters</span>
</span><span id="parse_request_params-129"><a href="#parse_request_params-129"><span class="linenos">129</span></a><span class="sd"> </span>
</span><span id="parse_request_params-130"><a href="#parse_request_params-130"><span class="linenos">130</span></a><span class="sd"> Raises</span>
</span><span id="parse_request_params-131"><a href="#parse_request_params-131"><span class="linenos">131</span></a><span class="sd"> ------</span>
</span><span id="parse_request_params-132"><a href="#parse_request_params-132"><span class="linenos">132</span></a><span class="sd"> ValueError</span>
</span><span id="parse_request_params-133"><a href="#parse_request_params-133"><span class="linenos">133</span></a><span class="sd"> The provided lines are not valid HTTP.</span>
</span><span id="parse_request_params-134"><a href="#parse_request_params-134"><span class="linenos">134</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="parse_request_params-135"><a href="#parse_request_params-135"><span class="linenos">135</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-136"><a href="#parse_request_params-136"><span class="linenos">136</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-137"><a href="#parse_request_params-137"><span class="linenos">137</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-138"><a href="#parse_request_params-138"><span class="linenos">138</span></a>
</span><span id="parse_request_params-139"><a href="#parse_request_params-139"><span class="linenos">139</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-140"><a href="#parse_request_params-140"><span class="linenos">140</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-141"><a href="#parse_request_params-141"><span class="linenos">141</span></a>
</span><span id="parse_request_params-142"><a href="#parse_request_params-142"><span class="linenos">142</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-143"><a href="#parse_request_params-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="n">params</span>
</span></pre></div>

View file

@ -139,117 +139,128 @@
</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-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="sd"> * call the prepare_resource() or prepare_reply() function accordingly,</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a><span class="sd"> * send the reply back.</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="sd"> * optionally write something in the log,</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a><span class="sd"> * close the connection.</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd"> Parameters</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"> - c: socket.socket</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> The socket to communicate with the client.</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd"> - addr: tuple[str, int]</span>
</span><span id="L-83"><a href="#L-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="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> - root: str</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> The path to the local directory to serve.</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="sd"> &quot;&quot;&quot;</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="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-90"><a href="#L-90"><span class="linenos"> 90</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-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="c1"># Prepare our reply.</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</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-94"><a href="#L-94"><span class="linenos"> 94</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-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="c1"># Not implemented: we treat only GET calls for now.</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</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-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="c1"># Send the reply back.</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</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-101"><a href="#L-101"><span class="linenos">101</span></a>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="c1"># Trace the action in the logs.</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</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-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="c1"># Close the connection.</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</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="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-110"><a href="#L-110"><span class="linenos">110</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> Retrieves the content of the resource and sets the status code.</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> Parameters</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd"> ----------</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> - root: str</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> - req: dict[str, dict]</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> The request to proceed.</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd"> Returns</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="sd"> -------</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="sd"> tuple </span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a><span class="sd"> - data: str</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd"> - code: int</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">200</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</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-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</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-134"><a href="#L-134"><span class="linenos">134</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-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">404</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</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-138"><a href="#L-138"><span class="linenos">138</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-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><span id="L-140"><a href="#L-140"><span class="linenos">140</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-141"><a href="#L-141"><span class="linenos">141</span></a>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</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-144"><a href="#L-144"><span class="linenos">144</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="sd"> Generates the proper answer, including the HTTP headers and content of the</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> webpage, and the status code.</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> Headers will look like that:</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> ```</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> HTTP/1.0 200 OK</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> Content-Type: text/html</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> Date: Thu, 07 Mar 2024 08:29:45 GMT</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> Content-Length: 152</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a><span class="sd"> Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a><span class="sd"> ```</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="sd"> For more information about:</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</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-159"><a href="#L-159"><span class="linenos">159</span></a><span class="sd"> * Status code, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a><span class="sd"> Parameters</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="sd"> ----------</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="sd"> - content: bytes</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="sd"> The raw data for the resource.</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="sd"> - content_type: str</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a><span class="sd"> The content type for the resource.</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="sd"> - code: int</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a><span class="sd"> The status code.</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a><span class="sd"> Returns</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a><span class="sd"> -------</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a><span class="sd"> tuple </span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a><span class="sd"> - data: str</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a><span class="sd"> - code: int</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="c1"># Prepare status code</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</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-181"><a href="#L-181"><span class="linenos">181</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-182"><a href="#L-182"><span class="linenos">182</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-183"><a href="#L-183"><span class="linenos">183</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-184"><a href="#L-184"><span class="linenos">184</span></a>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="c1"># Prepare headers, including content-type, date, content-length, server.</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</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-187"><a href="#L-187"><span class="linenos">187</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-188"><a href="#L-188"><span class="linenos">188</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-189"><a href="#L-189"><span class="linenos">189</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-190"><a href="#L-190"><span class="linenos">190</span></a><span class="s2">Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</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-193"><a href="#L-193"><span class="linenos">193</span></a>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</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>
@ -331,38 +342,40 @@ a request (connection), calls the <code>~myserver.handle_client()()</code>.</p>
</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><span id="handle_client-74"><a href="#handle_client-74"><span class="linenos"> 74</span></a><span class="sd"> * call the prepare_resource() or prepare_reply() function accordingly,</span>
</span><span id="handle_client-75"><a href="#handle_client-75"><span class="linenos"> 75</span></a><span class="sd"> * send the reply back.</span>
</span><span id="handle_client-76"><a href="#handle_client-76"><span class="linenos"> 76</span></a><span class="sd"> * optionally write something in the log,</span>
</span><span id="handle_client-77"><a href="#handle_client-77"><span class="linenos"> 77</span></a><span class="sd"> * close the connection.</span>
</span><span id="handle_client-78"><a href="#handle_client-78"><span class="linenos"> 78</span></a>
</span><span id="handle_client-79"><a href="#handle_client-79"><span class="linenos"> 79</span></a><span class="sd"> Parameters</span>
</span><span id="handle_client-80"><a href="#handle_client-80"><span class="linenos"> 80</span></a><span class="sd"> ----------</span>
</span><span id="handle_client-81"><a href="#handle_client-81"><span class="linenos"> 81</span></a><span class="sd"> - c: socket.socket</span>
</span><span id="handle_client-82"><a href="#handle_client-82"><span class="linenos"> 82</span></a><span class="sd"> The socket to communicate with the client.</span>
</span><span id="handle_client-83"><a href="#handle_client-83"><span class="linenos"> 83</span></a><span class="sd"> - addr: tuple[str, int]</span>
</span><span id="handle_client-84"><a href="#handle_client-84"><span class="linenos"> 84</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-85"><a href="#handle_client-85"><span class="linenos"> 85</span></a><span class="sd"> - root: str</span>
</span><span id="handle_client-86"><a href="#handle_client-86"><span class="linenos"> 86</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="handle_client-87"><a href="#handle_client-87"><span class="linenos"> 87</span></a>
</span><span id="handle_client-88"><a href="#handle_client-88"><span class="linenos"> 88</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="handle_client-89"><a href="#handle_client-89"><span class="linenos"> 89</span></a>
</span><span id="handle_client-90"><a href="#handle_client-90"><span class="linenos"> 90</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-91"><a href="#handle_client-91"><span class="linenos"> 91</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-92"><a href="#handle_client-92"><span class="linenos"> 92</span></a>
</span><span id="handle_client-93"><a href="#handle_client-93"><span class="linenos"> 93</span></a> <span class="c1"># Prepare our reply.</span>
</span><span id="handle_client-94"><a href="#handle_client-94"><span class="linenos"> 94</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-95"><a href="#handle_client-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_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-96"><a href="#handle_client-96"><span class="linenos"> 96</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="handle_client-97"><a href="#handle_client-97"><span class="linenos"> 97</span></a> <span class="c1"># Not implemented: we treat only GET calls for now.</span>
</span><span id="handle_client-98"><a href="#handle_client-98"><span class="linenos"> 98</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-99"><a href="#handle_client-99"><span class="linenos"> 99</span></a>
</span><span id="handle_client-100"><a href="#handle_client-100"><span class="linenos">100</span></a> <span class="c1"># Send the reply back.</span>
</span><span id="handle_client-101"><a href="#handle_client-101"><span class="linenos">101</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-102"><a href="#handle_client-102"><span class="linenos">102</span></a>
</span><span id="handle_client-103"><a href="#handle_client-103"><span class="linenos">103</span></a> <span class="c1"># Trace the action in the logs.</span>
</span><span id="handle_client-104"><a href="#handle_client-104"><span class="linenos">104</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-105"><a href="#handle_client-105"><span class="linenos">105</span></a>
</span><span id="handle_client-106"><a href="#handle_client-106"><span class="linenos">106</span></a> <span class="c1"># Close the connection.</span>
</span><span id="handle_client-107"><a href="#handle_client-107"><span class="linenos">107</span></a> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></pre></div>
@ -373,8 +386,9 @@ a request (connection), calls the <code>~myserver.handle_client()()</code>.</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>call the prepare_resource() or prepare_reply() function accordingly,</li>
<li>send the reply back.</li>
<li>optionally write something in the log,</li>
<li>close the connection.</li>
</ul>
@ -403,38 +417,38 @@ The path to the local directory to serve.</li>
</div>
<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>
<div class="pdoc-code codehilite"><pre><span></span><span id="prepare_resource-110"><a href="#prepare_resource-110"><span class="linenos">110</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-111"><a href="#prepare_resource-111"><span class="linenos">111</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="prepare_resource-112"><a href="#prepare_resource-112"><span class="linenos">112</span></a><span class="sd"> Retrieves the content of the resource and sets the status code.</span>
</span><span id="prepare_resource-113"><a href="#prepare_resource-113"><span class="linenos">113</span></a>
</span><span id="prepare_resource-114"><a href="#prepare_resource-114"><span class="linenos">114</span></a><span class="sd"> Parameters</span>
</span><span id="prepare_resource-115"><a href="#prepare_resource-115"><span class="linenos">115</span></a><span class="sd"> ----------</span>
</span><span id="prepare_resource-116"><a href="#prepare_resource-116"><span class="linenos">116</span></a><span class="sd"> - root: str</span>
</span><span id="prepare_resource-117"><a href="#prepare_resource-117"><span class="linenos">117</span></a><span class="sd"> The path to the local directory to serve.</span>
</span><span id="prepare_resource-118"><a href="#prepare_resource-118"><span class="linenos">118</span></a><span class="sd"> - req: dict[str, dict]</span>
</span><span id="prepare_resource-119"><a href="#prepare_resource-119"><span class="linenos">119</span></a><span class="sd"> The request to proceed.</span>
</span><span id="prepare_resource-120"><a href="#prepare_resource-120"><span class="linenos">120</span></a>
</span><span id="prepare_resource-121"><a href="#prepare_resource-121"><span class="linenos">121</span></a><span class="sd"> Returns</span>
</span><span id="prepare_resource-122"><a href="#prepare_resource-122"><span class="linenos">122</span></a><span class="sd"> -------</span>
</span><span id="prepare_resource-123"><a href="#prepare_resource-123"><span class="linenos">123</span></a><span class="sd"> tuple </span>
</span><span id="prepare_resource-124"><a href="#prepare_resource-124"><span class="linenos">124</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="prepare_resource-125"><a href="#prepare_resource-125"><span class="linenos">125</span></a><span class="sd"> - data: str</span>
</span><span id="prepare_resource-126"><a href="#prepare_resource-126"><span class="linenos">126</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="prepare_resource-127"><a href="#prepare_resource-127"><span class="linenos">127</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_resource-128"><a href="#prepare_resource-128"><span class="linenos">128</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="prepare_resource-129"><a href="#prepare_resource-129"><span class="linenos">129</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="prepare_resource-130"><a href="#prepare_resource-130"><span class="linenos">130</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">200</span>
</span><span id="prepare_resource-131"><a href="#prepare_resource-131"><span class="linenos">131</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-132"><a href="#prepare_resource-132"><span class="linenos">132</span></a> <span class="n">content_type</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="prepare_resource-133"><a href="#prepare_resource-133"><span class="linenos">133</span></a>
</span><span id="prepare_resource-134"><a href="#prepare_resource-134"><span class="linenos">134</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-135"><a href="#prepare_resource-135"><span class="linenos">135</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-136"><a href="#prepare_resource-136"><span class="linenos">136</span></a> <span class="n">code</span> <span class="o">=</span> <span class="mi">404</span>
</span><span id="prepare_resource-137"><a href="#prepare_resource-137"><span class="linenos">137</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="prepare_resource-138"><a href="#prepare_resource-138"><span class="linenos">138</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-139"><a href="#prepare_resource-139"><span class="linenos">139</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-140"><a href="#prepare_resource-140"><span class="linenos">140</span></a>
</span><span id="prepare_resource-141"><a href="#prepare_resource-141"><span class="linenos">141</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>
@ -472,55 +486,73 @@ The request to proceed.</li>
</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>
<div class="pdoc-code codehilite"><pre><span></span><span id="prepare_reply-144"><a href="#prepare_reply-144"><span class="linenos">144</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-145"><a href="#prepare_reply-145"><span class="linenos">145</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="prepare_reply-146"><a href="#prepare_reply-146"><span class="linenos">146</span></a><span class="sd"> Generates the proper answer, including the HTTP headers and content of the</span>
</span><span id="prepare_reply-147"><a href="#prepare_reply-147"><span class="linenos">147</span></a><span class="sd"> webpage, and the status code.</span>
</span><span id="prepare_reply-148"><a href="#prepare_reply-148"><span class="linenos">148</span></a>
</span><span id="prepare_reply-149"><a href="#prepare_reply-149"><span class="linenos">149</span></a><span class="sd"> Headers will look like that:</span>
</span><span id="prepare_reply-150"><a href="#prepare_reply-150"><span class="linenos">150</span></a><span class="sd"> ```</span>
</span><span id="prepare_reply-151"><a href="#prepare_reply-151"><span class="linenos">151</span></a><span class="sd"> HTTP/1.0 200 OK</span>
</span><span id="prepare_reply-152"><a href="#prepare_reply-152"><span class="linenos">152</span></a><span class="sd"> Content-Type: text/html</span>
</span><span id="prepare_reply-153"><a href="#prepare_reply-153"><span class="linenos">153</span></a><span class="sd"> Date: Thu, 07 Mar 2024 08:29:45 GMT</span>
</span><span id="prepare_reply-154"><a href="#prepare_reply-154"><span class="linenos">154</span></a><span class="sd"> Content-Length: 152</span>
</span><span id="prepare_reply-155"><a href="#prepare_reply-155"><span class="linenos">155</span></a><span class="sd"> Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="prepare_reply-156"><a href="#prepare_reply-156"><span class="linenos">156</span></a><span class="sd"> ```</span>
</span><span id="prepare_reply-157"><a href="#prepare_reply-157"><span class="linenos">157</span></a>
</span><span id="prepare_reply-158"><a href="#prepare_reply-158"><span class="linenos">158</span></a><span class="sd"> For more information about:</span>
</span><span id="prepare_reply-159"><a href="#prepare_reply-159"><span class="linenos">159</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-160"><a href="#prepare_reply-160"><span class="linenos">160</span></a><span class="sd"> * Status code, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</span>
</span><span id="prepare_reply-161"><a href="#prepare_reply-161"><span class="linenos">161</span></a>
</span><span id="prepare_reply-162"><a href="#prepare_reply-162"><span class="linenos">162</span></a><span class="sd"> Parameters</span>
</span><span id="prepare_reply-163"><a href="#prepare_reply-163"><span class="linenos">163</span></a><span class="sd"> ----------</span>
</span><span id="prepare_reply-164"><a href="#prepare_reply-164"><span class="linenos">164</span></a><span class="sd"> - content: bytes</span>
</span><span id="prepare_reply-165"><a href="#prepare_reply-165"><span class="linenos">165</span></a><span class="sd"> The raw data for the resource.</span>
</span><span id="prepare_reply-166"><a href="#prepare_reply-166"><span class="linenos">166</span></a><span class="sd"> - content_type: str</span>
</span><span id="prepare_reply-167"><a href="#prepare_reply-167"><span class="linenos">167</span></a><span class="sd"> The content type for the resource.</span>
</span><span id="prepare_reply-168"><a href="#prepare_reply-168"><span class="linenos">168</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_reply-169"><a href="#prepare_reply-169"><span class="linenos">169</span></a><span class="sd"> The status code.</span>
</span><span id="prepare_reply-170"><a href="#prepare_reply-170"><span class="linenos">170</span></a>
</span><span id="prepare_reply-171"><a href="#prepare_reply-171"><span class="linenos">171</span></a><span class="sd"> Returns</span>
</span><span id="prepare_reply-172"><a href="#prepare_reply-172"><span class="linenos">172</span></a><span class="sd"> -------</span>
</span><span id="prepare_reply-173"><a href="#prepare_reply-173"><span class="linenos">173</span></a><span class="sd"> tuple </span>
</span><span id="prepare_reply-174"><a href="#prepare_reply-174"><span class="linenos">174</span></a><span class="sd"> The reply for the request, including the data and status code.</span>
</span><span id="prepare_reply-175"><a href="#prepare_reply-175"><span class="linenos">175</span></a><span class="sd"> - data: str</span>
</span><span id="prepare_reply-176"><a href="#prepare_reply-176"><span class="linenos">176</span></a><span class="sd"> The data (header + content) to reply on the socket.</span>
</span><span id="prepare_reply-177"><a href="#prepare_reply-177"><span class="linenos">177</span></a><span class="sd"> - code: int</span>
</span><span id="prepare_reply-178"><a href="#prepare_reply-178"><span class="linenos">178</span></a><span class="sd"> The status code for the reply.</span>
</span><span id="prepare_reply-179"><a href="#prepare_reply-179"><span class="linenos">179</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="prepare_reply-180"><a href="#prepare_reply-180"><span class="linenos">180</span></a> <span class="c1"># Prepare status code</span>
</span><span id="prepare_reply-181"><a href="#prepare_reply-181"><span class="linenos">181</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-182"><a href="#prepare_reply-182"><span class="linenos">182</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-183"><a href="#prepare_reply-183"><span class="linenos">183</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-184"><a href="#prepare_reply-184"><span class="linenos">184</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-185"><a href="#prepare_reply-185"><span class="linenos">185</span></a>
</span><span id="prepare_reply-186"><a href="#prepare_reply-186"><span class="linenos">186</span></a> <span class="c1"># Prepare headers, including content-type, date, content-length, server.</span>
</span><span id="prepare_reply-187"><a href="#prepare_reply-187"><span class="linenos">187</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-188"><a href="#prepare_reply-188"><span class="linenos">188</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-189"><a href="#prepare_reply-189"><span class="linenos">189</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-190"><a href="#prepare_reply-190"><span class="linenos">190</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-191"><a href="#prepare_reply-191"><span class="linenos">191</span></a><span class="s2">Server: RegardeMamanJeFaisUnServeurWeb/0.1</span>
</span><span id="prepare_reply-192"><a href="#prepare_reply-192"><span class="linenos">192</span></a>
</span><span id="prepare_reply-193"><a href="#prepare_reply-193"><span class="linenos">193</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-194"><a href="#prepare_reply-194"><span class="linenos">194</span></a>
</span><span id="prepare_reply-195"><a href="#prepare_reply-195"><span class="linenos">195</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>Headers will look like that:</p>
<pre><code>HTTP/1.0 200 OK
Content-Type: text/html
Date: Thu, 07 Mar 2024 08:29:45 GMT
Content-Length: 152
Server: RegardeMamanJeFaisUnServeurWeb/0.1
</code></pre>
<p>For more information about:</p>
<ul>