ESP32_ChinaDieselHeater_Con.../lib/esp32_https_server-master/docs/HTTPConnection_8hpp_source.html

115 lines
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ESP32 HTTPS Server: /home/frank/Projekte/esp32/https_server/esp32_https_server/src/HTTPConnection.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">ESP32 HTTPS Server
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('HTTPConnection_8hpp_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">HTTPConnection.hpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#ifndef SRC_HTTPCONNECTION_HPP_</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#define SRC_HTTPCONNECTION_HPP_</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &lt;Arduino.h&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;IPAddress.h&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &lt;mbedtls/base64.h&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &lt;hwcrypto/sha.h&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &lt;functional&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// Required for sockets</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;lwip/netdb.h&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#undef read</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &quot;lwip/sockets.h&quot;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;HTTPSServerConstants.hpp&quot;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;ConnectionContext.hpp&quot;</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;HTTPHeaders.hpp&quot;</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;HTTPHeader.hpp&quot;</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;ResourceResolver.hpp&quot;</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;ResolvedResource.hpp&quot;</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;ResourceNode.hpp&quot;</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;HTTPRequest.hpp&quot;</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;HTTPResponse.hpp&quot;</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;WebsocketHandler.hpp&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;WebsocketNode.hpp&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacehttpsserver.html">httpsserver</a> {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classhttpsserver_1_1HTTPConnection.html"> 38</a></span>&#160;<span class="keyword">class </span><a class="code" href="classhttpsserver_1_1HTTPConnection.html">HTTPConnection</a> : <span class="keyword">private</span> <a class="code" href="classhttpsserver_1_1ConnectionContext.html">ConnectionContext</a> {</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <a class="code" href="classhttpsserver_1_1HTTPConnection.html">HTTPConnection</a>(<a class="code" href="classhttpsserver_1_1ResourceResolver.html">ResourceResolver</a> * resResolver);</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keyword">virtual</span> ~<a class="code" href="classhttpsserver_1_1HTTPConnection.html">HTTPConnection</a>();</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classhttpsserver_1_1HTTPConnection.html#a477f2a00400be60f3b0ca08ab53beda5">initialize</a>(<span class="keywordtype">int</span> serverSocketID, <a class="code" href="classhttpsserver_1_1HTTPHeaders.html">HTTPHeaders</a> *defaultHeaders);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> closeConnection();</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> isSecure();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keyword">virtual</span> IPAddress <a class="code" href="classhttpsserver_1_1HTTPConnection.html#a5e103c4b601199d575de6b6f29d7fb95">getClientIP</a>();</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordtype">void</span> loop();</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classhttpsserver_1_1HTTPConnection.html#af00c9a10be467a64ece8f820e939190d">isClosed</a>();</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classhttpsserver_1_1HTTPConnection.html#a6d8889292d644962a859e6e9b0bff305">isError</a>();</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classhttpsserver_1_1HTTPRequest.html">HTTPRequest</a>;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classhttpsserver_1_1HTTPResponse.html">HTTPResponse</a>;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classhttpsserver_1_1WebsocketInputStreambuf.html">WebsocketInputStreambuf</a>;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> writeBuffer(byte* buffer, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> readBytesToBuffer(byte* buffer, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> canReadData();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> pendingByteCount();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="comment">// Timestamp of the last transmission action</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _lastTransmissionTS;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="comment">// Timestamp of when the shutdown was started</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _shutdownTS;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="comment">// Internal state machine of the connection:</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="comment">// O --- &gt; STATE_UNDEFINED -- initialize() --&gt; STATE_INITIAL -- get / http/1.1 --&gt; STATE_REQUEST_FINISHED --.</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="comment">// | | | |</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="comment">// | | | | Host: ...\r\n</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// STATE_ERROR &lt;- on error-----------------------&lt;---------------------------------------&lt; | Foo: bar\r\n</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// ^ | | | \r\n</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">// | shutdown .--&gt; STATE_CLOSED | | | \r\n</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">// | fails | | | |</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// | | close() | | |</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// STATE_CLOSING &lt;---- STATE_WEBSOCKET &lt;-. | | |</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// ^ | | | |</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// `---------- close() ---------- STATE_BODY_FINISHED &lt;-- Body received or GET -- STATE_HEADERS_FINISHED &lt;-´</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keyword">enum</span> {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">// The order is important, to be able to use state &lt;= STATE_HEADERS_FINISHED etc.</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// The connection has not been established yet</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; STATE_UNDEFINED,</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">// The connection has just been created</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; STATE_INITIAL,</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="comment">// The request line has been parsed</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; STATE_REQUEST_FINISHED,</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// The headers have been parsed</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; STATE_HEADERS_FINISHED,</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="comment">// The body has been parsed/the complete request has been processed (GET has body of length 0)</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; STATE_BODY_FINISHED,</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="comment">// The connection is in websocket mode</span></div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; STATE_WEBSOCKET,</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">// The connection is about to close (and waiting for the client to send close notify)</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; STATE_CLOSING,</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="comment">// The connection has been closed</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; STATE_CLOSED,</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="comment">// An error has occured</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; STATE_ERROR</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; } _connectionState;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keyword">enum</span> {</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; CSTATE_UNDEFINED,</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; CSTATE_ACTIVE,</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; CSTATE_CLOSED</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; } _clientState;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordtype">void</span> raiseError(uint16_t code, std::string reason);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordtype">void</span> readLine(<span class="keywordtype">int</span> lengthLimit);</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordtype">bool</span> isTimeoutExceeded();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordtype">void</span> refreshTimeout();</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordtype">int</span> updateBuffer();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordtype">size_t</span> pendingBufferSize();</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordtype">void</span> signalClientClose();</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordtype">void</span> signalRequestError();</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordtype">size_t</span> readBuffer(byte* buffer, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordtype">size_t</span> getCacheSize();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordtype">bool</span> checkWebsocket();</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="comment">// The receive buffer</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">char</span> _receiveBuffer[HTTPS_CONNECTION_DATA_CHUNK_SIZE];</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">// First index on _receive_buffer that has not been processed yet (anything before may be discarded)</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordtype">int</span> _bufferProcessed;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="comment">// The index on the receive_buffer that is the first one which is empty at the end.</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordtype">int</span> _bufferUnusedIdx;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// Socket address, length etc for the connection</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">struct </span>sockaddr _sockAddr;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; socklen_t _addrLen;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keywordtype">int</span> _socket;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="comment">// Resource resolver used to resolve resources</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <a class="code" href="classhttpsserver_1_1ResourceResolver.html">ResourceResolver</a> * _resResolver;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="comment">// The parser line. The struct is used to read the next line up to the \r\n in readLine()</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">struct </span>{</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; std::string text = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordtype">bool</span> parsingFinished = <span class="keyword">false</span>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; } _parserLine;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="comment">// HTTP properties: Method, Request, Headers</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; std::string _httpMethod;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; std::string _httpResource;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <a class="code" href="classhttpsserver_1_1HTTPHeaders.html">HTTPHeaders</a> * _httpHeaders;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// Default headers that are applied to every response</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="code" href="classhttpsserver_1_1HTTPHeaders.html">HTTPHeaders</a> * _defaultHeaders;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// Should we use keep alive</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordtype">bool</span> _isKeepAlive;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="comment">//Websocket connection</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classhttpsserver_1_1WebsocketHandler.html">WebsocketHandler</a> * _wsHandler;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;};</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacehttpsserver.html#a95a1abf6125242682b1e624342a342b8">handleWebsocketHandshake</a>(<a class="code" href="classhttpsserver_1_1HTTPRequest.html">HTTPRequest</a> * req, <a class="code" href="classhttpsserver_1_1HTTPResponse.html">HTTPResponse</a> * res);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;std::string <a class="code" href="namespacehttpsserver.html#ae475bc730f2502e1f55ffc16a5f671a0">websocketKeyResponseHash</a>(std::string <span class="keyword">const</span> &amp;key);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacehttpsserver.html#a29faf1e31601ac1f50302a2813a06539">validationMiddleware</a>(<a class="code" href="classhttpsserver_1_1HTTPRequest.html">HTTPRequest</a> * req, <a class="code" href="classhttpsserver_1_1HTTPResponse.html">HTTPResponse</a> * res, std::function&lt;<span class="keywordtype">void</span>()&gt; next);</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;} <span class="comment">/* namespace httpsserver */</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* SRC_HTTPCONNECTION_HPP_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classhttpsserver_1_1HTTPConnection_html_a5e103c4b601199d575de6b6f29d7fb95"><div class="ttname"><a href="classhttpsserver_1_1HTTPConnection.html#a5e103c4b601199d575de6b6f29d7fb95">httpsserver::HTTPConnection::getClientIP</a></div><div class="ttdeci">virtual IPAddress getClientIP()</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:65</div></div>
<div class="ttc" id="namespacehttpsserver_html_a95a1abf6125242682b1e624342a342b8"><div class="ttname"><a href="namespacehttpsserver.html#a95a1abf6125242682b1e624342a342b8">httpsserver::handleWebsocketHandshake</a></div><div class="ttdeci">void handleWebsocketHandshake(HTTPRequest *req, HTTPResponse *res)</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:652</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPRequest_html"><div class="ttname"><a href="classhttpsserver_1_1HTTPRequest.html">httpsserver::HTTPRequest</a></div><div class="ttdoc">Represents the request stream for an HTTP request. </div><div class="ttdef"><b>Definition:</b> HTTPRequest.hpp:22</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPResponse_html"><div class="ttname"><a href="classhttpsserver_1_1HTTPResponse.html">httpsserver::HTTPResponse</a></div><div class="ttdoc">Represents the response stream of an HTTP request. </div><div class="ttdef"><b>Definition:</b> HTTPResponse.hpp:25</div></div>
<div class="ttc" id="namespacehttpsserver_html_a29faf1e31601ac1f50302a2813a06539"><div class="ttname"><a href="namespacehttpsserver.html#a29faf1e31601ac1f50302a2813a06539">httpsserver::validationMiddleware</a></div><div class="ttdeci">void validationMiddleware(HTTPRequest *req, HTTPResponse *res, std::function&lt; void()&gt; next)</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:622</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPConnection_html_a6d8889292d644962a859e6e9b0bff305"><div class="ttname"><a href="classhttpsserver_1_1HTTPConnection.html#a6d8889292d644962a859e6e9b0bff305">httpsserver::HTTPConnection::isError</a></div><div class="ttdeci">bool isError()</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:99</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPHeaders_html"><div class="ttname"><a href="classhttpsserver_1_1HTTPHeaders.html">httpsserver::HTTPHeaders</a></div><div class="ttdoc">Groups and manages a set of HTTPHeader instances. </div><div class="ttdef"><b>Definition:</b> HTTPHeaders.hpp:18</div></div>
<div class="ttc" id="classhttpsserver_1_1WebsocketHandler_html"><div class="ttname"><a href="classhttpsserver_1_1WebsocketHandler.html">httpsserver::WebsocketHandler</a></div><div class="ttdef"><b>Definition:</b> WebsocketHandler.hpp:34</div></div>
<div class="ttc" id="classhttpsserver_1_1ResourceResolver_html"><div class="ttname"><a href="classhttpsserver_1_1ResourceResolver.html">httpsserver::ResourceResolver</a></div><div class="ttdoc">This class is used internally to resolve a string URL to the corresponding HTTPNode. </div><div class="ttdef"><b>Definition:</b> ResourceResolver.hpp:22</div></div>
<div class="ttc" id="classhttpsserver_1_1WebsocketInputStreambuf_html"><div class="ttname"><a href="classhttpsserver_1_1WebsocketInputStreambuf.html">httpsserver::WebsocketInputStreambuf</a></div><div class="ttdef"><b>Definition:</b> WebsocketInputStreambuf.hpp:21</div></div>
<div class="ttc" id="classhttpsserver_1_1ConnectionContext_html"><div class="ttname"><a href="classhttpsserver_1_1ConnectionContext.html">httpsserver::ConnectionContext</a></div><div class="ttdoc">Internal class to handle the state of a connection. </div><div class="ttdef"><b>Definition:</b> ConnectionContext.hpp:18</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPConnection_html"><div class="ttname"><a href="classhttpsserver_1_1HTTPConnection.html">httpsserver::HTTPConnection</a></div><div class="ttdoc">Represents a single open connection for the plain HTTPServer, without TLS. </div><div class="ttdef"><b>Definition:</b> HTTPConnection.hpp:38</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPConnection_html_af00c9a10be467a64ece8f820e939190d"><div class="ttname"><a href="classhttpsserver_1_1HTTPConnection.html#af00c9a10be467a64ece8f820e939190d">httpsserver::HTTPConnection::isClosed</a></div><div class="ttdeci">bool isClosed()</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:92</div></div>
<div class="ttc" id="namespacehttpsserver_html_ae475bc730f2502e1f55ffc16a5f671a0"><div class="ttname"><a href="namespacehttpsserver.html#ae475bc730f2502e1f55ffc16a5f671a0">httpsserver::websocketKeyResponseHash</a></div><div class="ttdeci">std::string websocketKeyResponseHash(std::string const &amp;key)</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:664</div></div>
<div class="ttc" id="classhttpsserver_1_1HTTPConnection_html_a477f2a00400be60f3b0ca08ab53beda5"><div class="ttname"><a href="classhttpsserver_1_1HTTPConnection.html#a477f2a00400be60f3b0ca08ab53beda5">httpsserver::HTTPConnection::initialize</a></div><div class="ttdeci">virtual int initialize(int serverSocketID, HTTPHeaders *defaultHeaders)</div><div class="ttdef"><b>Definition:</b> HTTPConnection.cpp:33</div></div>
<div class="ttc" id="namespacehttpsserver_html"><div class="ttname"><a href="namespacehttpsserver.html">httpsserver</a></div><div class="ttdef"><b>Definition:</b> ConnectionContext.cpp:3</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><b>HTTPConnection.hpp</b></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>