⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _h_t_t_p_request_parser_8cpp-source.html

📁 用c++编写http server的源码库,对socket等网络处理的代码可迅速转为己用.
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00486"></a>00486             }<a name="l00487"></a>00487             <span class="keywordflow">break</span>;<a name="l00488"></a>00488 <a name="l00489"></a>00489         <span class="keywordflow">case</span> PARSE_HEADER_VALUE:<a name="l00490"></a>00490             <span class="comment">// parsing the value of a header</span><a name="l00491"></a>00491             <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00492"></a>00492                 m_http_request-&gt;addHeader(m_header_name, m_header_value);<a name="l00493"></a>00493                 m_parse_state = PARSE_EXPECTING_NEWLINE;<a name="l00494"></a>00494             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00495"></a>00495                 m_http_request-&gt;addHeader(m_header_name, m_header_value);<a name="l00496"></a>00496                 m_parse_state = PARSE_EXPECTING_CR;<a name="l00497"></a>00497             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr)) {<a name="l00498"></a>00498                 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00499"></a>00499             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_header_value.size() &gt;= HEADER_VALUE_MAX) {<a name="l00500"></a>00500                 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00501"></a>00501             } <span class="keywordflow">else</span> {<a name="l00502"></a>00502                 <span class="comment">// character (not first) for the value of a header</span><a name="l00503"></a>00503                 m_header_value.push_back(*ptr);<a name="l00504"></a>00504             }<a name="l00505"></a>00505             <span class="keywordflow">break</span>;<a name="l00506"></a>00506 <a name="l00507"></a>00507         <span class="keywordflow">case</span> PARSE_EXPECTING_FINAL_NEWLINE:<a name="l00508"></a>00508             <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) ++ptr;<a name="l00509"></a>00509             <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00510"></a>00510 <a name="l00511"></a>00511         <span class="keywordflow">case</span> PARSE_EXPECTING_FINAL_CR:<a name="l00512"></a>00512             <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) ++ptr;<a name="l00513"></a>00513             <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00514"></a>00514         }<a name="l00515"></a>00515 <a name="l00516"></a>00516         ++ptr;<a name="l00517"></a>00517     }<a name="l00518"></a>00518 <a name="l00519"></a>00519     <span class="keywordflow">return</span> boost::indeterminate;<a name="l00520"></a>00520 }<a name="l00521"></a>00521 <a name="l00522"></a><a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#57d7592db90c02bca8d57c9b27846bc8">00522</a> <span class="keywordtype">bool</span> <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#57d7592db90c02bca8d57c9b27846bc8">HTTPRequestParser::parseURLEncoded</a>(<a class="code" href="structpion_1_1_h_t_t_p_types.html#c860abe7b994d3c0311318f2e335086e" title="data type for a dictionary of strings (used for HTTP headers)">HTTPTypes::StringDictionary</a>&amp; dict,<a name="l00523"></a>00523                                         <span class="keyword">const</span> <span class="keywordtype">char</span> *ptr, <span class="keyword">const</span> <span class="keywordtype">size_t</span> len)<a name="l00524"></a>00524 {<a name="l00525"></a>00525     <span class="comment">// used to track whether we are parsing the name or value</span><a name="l00526"></a>00526     <span class="keyword">enum</span> QueryParseState {<a name="l00527"></a>00527         QUERY_PARSE_NAME, QUERY_PARSE_VALUE<a name="l00528"></a>00528     } parse_state = QUERY_PARSE_NAME;<a name="l00529"></a>00529 <a name="l00530"></a>00530     <span class="comment">// misc other variables used for parsing</span><a name="l00531"></a>00531     <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> end = ptr + len;<a name="l00532"></a>00532     std::string query_name;<a name="l00533"></a>00533     std::string query_value;<a name="l00534"></a>00534     <a name="l00535"></a>00535     <span class="comment">// iterate through each encoded character</span><a name="l00536"></a>00536     <span class="keywordflow">while</span> (ptr &lt; end) {<a name="l00537"></a>00537         <span class="keywordflow">switch</span> (parse_state) {<a name="l00538"></a>00538         <a name="l00539"></a>00539         <span class="keywordflow">case</span> QUERY_PARSE_NAME:<a name="l00540"></a>00540             <span class="comment">// parsing query name</span><a name="l00541"></a>00541             <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'='</span>) {<a name="l00542"></a>00542                 <span class="comment">// end of name found</span><a name="l00543"></a>00543                 <span class="keywordflow">if</span> (query_name.empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00544"></a>00544                 parse_state = QUERY_PARSE_VALUE;<a name="l00545"></a>00545             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'&amp;'</span>) {<a name="l00546"></a>00546                 <span class="comment">// value is empty (OK)</span><a name="l00547"></a>00547                 <span class="keywordflow">if</span> (query_name.empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00548"></a>00548                 dict.insert( std::make_pair(query_name, query_value) );<a name="l00549"></a>00549                 query_name.erase();<a name="l00550"></a>00550             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || query_name.size() &gt;= QUERY_NAME_MAX) {<a name="l00551"></a>00551                 <span class="comment">// control character detected, or max sized exceeded</span><a name="l00552"></a>00552                 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00553"></a>00553             } <span class="keywordflow">else</span> {<a name="l00554"></a>00554                 <span class="comment">// character is part of the name</span><a name="l00555"></a>00555                 query_name.push_back(*ptr);<a name="l00556"></a>00556             }<a name="l00557"></a>00557             <span class="keywordflow">break</span>;<a name="l00558"></a>00558 <a name="l00559"></a>00559         <span class="keywordflow">case</span> QUERY_PARSE_VALUE:<a name="l00560"></a>00560             <span class="comment">// parsing query value</span><a name="l00561"></a>00561             <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'&amp;'</span>) {<a name="l00562"></a>00562                 <span class="comment">// end of value found (OK if empty)</span><a name="l00563"></a>00563                 dict.insert( std::make_pair(query_name, query_value) );<a name="l00564"></a>00564                 query_name.erase();<a name="l00565"></a>00565                 query_value.erase();<a name="l00566"></a>00566                 parse_state = QUERY_PARSE_NAME;<a name="l00567"></a>00567             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || query_value.size() &gt;= QUERY_VALUE_MAX) {<a name="l00568"></a>00568                 <span class="comment">// control character detected, or max sized exceeded</span><a name="l00569"></a>00569                 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00570"></a>00570             } <span class="keywordflow">else</span> {<a name="l00571"></a>00571                 <span class="comment">// character is part of the value</span><a name="l00572"></a>00572                 query_value.push_back(*ptr);<a name="l00573"></a>00573             }<a name="l00574"></a>00574             <span class="keywordflow">break</span>;<a name="l00575"></a>00575         }<a name="l00576"></a>00576         <a name="l00577"></a>00577         ++ptr;<a name="l00578"></a>00578     }<a name="l00579"></a>00579     <a name="l00580"></a>00580     <span class="comment">// handle last pair in string</span><a name="l00581"></a>00581     <span class="keywordflow">if</span> (! query_name.empty())<a name="l00582"></a>00582         dict.insert( std::make_pair(query_name, query_value) );<a name="l00583"></a>00583     <a name="l00584"></a>00584     <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00585"></a>00585 }<a name="l00586"></a>00586 <a name="l00587"></a><a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#0de32e9cf76ad689b6f86588c68e3118">00587</a> <span class="keywordtype">bool</span> <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#0de32e9cf76ad689b6f86588c68e3118">HTTPRequestParser::parseCookieHeader</a>(<a class="code" href="structpion_1_1_h_t_t_p_types.html#c860abe7b994d3c0311318f2e335086e" title="data type for a dictionary of strings (used for HTTP headers)">HTTPTypes::StringDictionary</a>&amp; dict,<a name="l00588"></a>00588                                           <span class="keyword">const</span> std::string&amp; cookie_header)<a name="l00589"></a>00589 {<a name="l00590"></a>00590     <span class="comment">// BASED ON RFC 2109</span><a name="l00591"></a>00591     <span class="comment">// </span><a name="l00592"></a>00592     <span class="comment">// The current implementation ignores cookie attributes which begin with '$'</span><a name="l00593"></a>00593     <span class="comment">// (i.e. $Path=/, $Domain=, etc.)</span><a name="l00594"></a>00594 <a name="l00595"></a>00595     <span class="comment">// used to track what we are parsing</span><a name="l00596"></a>00596     <span class="keyword">enum</span> CookieParseState {<a name="l00597"></a>00597         COOKIE_PARSE_NAME, COOKIE_PARSE_VALUE<a name="l00598"></a>00598     } parse_state = COOKIE_PARSE_NAME;<a name="l00599"></a>00599     <a name="l00600"></a>00600     <span class="comment">// misc other variables used for parsing</span><a name="l00601"></a>00601     std::string cookie_name;<a name="l00602"></a>00602     std::string cookie_value;<a name="l00603"></a>00603     <span class="keywordtype">char</span> value_quote_character = <span class="charliteral">'\0'</span>;<a name="l00604"></a>00604     <a name="l00605"></a>00605     <span class="comment">// iterate through each character</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -