📄 _h_t_t_p_request_parser_8cpp-source.html
字号:
<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->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->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() >= 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>& 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 < 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">'&'</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() >= 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">'&'</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() >= 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>& dict,<a name="l00588"></a>00588 <span class="keyword">const</span> std::string& 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 + -