📄 _h_t_t_p_request_parser_8cpp-source.html
字号:
<a name="l00361"></a>00361 <span class="keywordflow">break</span>;<a name="l00362"></a>00362 <a name="l00363"></a>00363 <span class="keywordflow">case</span> PARSE_HTTP_VERSION_MINOR:<a name="l00364"></a>00364 <span class="comment">// parsing the major version number (not first digit)</span><a name="l00365"></a>00365 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00366"></a>00366 m_parse_state = PARSE_EXPECTING_NEWLINE;<a name="l00367"></a>00367 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00368"></a>00368 m_parse_state = PARSE_EXPECTING_CR;<a name="l00369"></a>00369 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#fadced7b359e96de0e1fdaad97d5f695">isDigit</a>(*ptr)) {<a name="l00370"></a>00370 m_http_request->setVersionMinor( (m_http_request->getVersionMinor() * 10)<a name="l00371"></a>00371 + (*ptr - <span class="charliteral">'0'</span>) );<a name="l00372"></a>00372 } <span class="keywordflow">else</span> {<a name="l00373"></a>00373 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00374"></a>00374 }<a name="l00375"></a>00375 <span class="keywordflow">break</span>;<a name="l00376"></a>00376 <a name="l00377"></a>00377 <span class="keywordflow">case</span> PARSE_EXPECTING_NEWLINE:<a name="l00378"></a>00378 <span class="comment">// we received a CR; expecting a newline to follow</span><a name="l00379"></a>00379 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00380"></a>00380 m_parse_state = PARSE_HEADER_START;<a name="l00381"></a>00381 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00382"></a>00382 <span class="comment">// we received two CR's in a row</span><a name="l00383"></a>00383 <span class="comment">// assume CR only is (incorrectly) being used for line termination</span><a name="l00384"></a>00384 <span class="comment">// therefore, the request is finished</span><a name="l00385"></a>00385 ++ptr;<a name="l00386"></a>00386 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00387"></a>00387 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\t'</span> || *ptr == <span class="charliteral">' '</span>) {<a name="l00388"></a>00388 m_parse_state = PARSE_HEADER_WHITESPACE;<a name="l00389"></a>00389 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr)) {<a name="l00390"></a>00390 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00391"></a>00391 } <span class="keywordflow">else</span> {<a name="l00392"></a>00392 <span class="comment">// assume it is the first character for the name of a header</span><a name="l00393"></a>00393 m_header_name.erase();<a name="l00394"></a>00394 m_header_name.push_back(*ptr);<a name="l00395"></a>00395 m_parse_state = PARSE_HEADER_NAME;<a name="l00396"></a>00396 }<a name="l00397"></a>00397 <span class="keywordflow">break</span>;<a name="l00398"></a>00398 <a name="l00399"></a>00399 <span class="keywordflow">case</span> PARSE_EXPECTING_CR:<a name="l00400"></a>00400 <span class="comment">// we received a newline without a CR</span><a name="l00401"></a>00401 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00402"></a>00402 m_parse_state = PARSE_HEADER_START;<a name="l00403"></a>00403 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00404"></a>00404 <span class="comment">// we received two newlines in a row</span><a name="l00405"></a>00405 <span class="comment">// assume newline only is (incorrectly) being used for line termination</span><a name="l00406"></a>00406 <span class="comment">// therefore, the request is finished</span><a name="l00407"></a>00407 ++ptr;<a name="l00408"></a>00408 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00409"></a>00409 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\t'</span> || *ptr == <span class="charliteral">' '</span>) {<a name="l00410"></a>00410 m_parse_state = PARSE_HEADER_WHITESPACE;<a name="l00411"></a>00411 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr)) {<a name="l00412"></a>00412 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00413"></a>00413 } <span class="keywordflow">else</span> {<a name="l00414"></a>00414 <span class="comment">// assume it is the first character for the name of a header</span><a name="l00415"></a>00415 m_header_name.erase();<a name="l00416"></a>00416 m_header_name.push_back(*ptr);<a name="l00417"></a>00417 m_parse_state = PARSE_HEADER_NAME;<a name="l00418"></a>00418 }<a name="l00419"></a>00419 <span class="keywordflow">break</span>;<a name="l00420"></a>00420 <a name="l00421"></a>00421 <span class="keywordflow">case</span> PARSE_HEADER_WHITESPACE:<a name="l00422"></a>00422 <span class="comment">// parsing whitespace before a header name</span><a name="l00423"></a>00423 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00424"></a>00424 m_parse_state = PARSE_EXPECTING_NEWLINE;<a name="l00425"></a>00425 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00426"></a>00426 m_parse_state = PARSE_EXPECTING_CR;<a name="l00427"></a>00427 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr != <span class="charliteral">'\t'</span> && *ptr != <span class="charliteral">' '</span>) {<a name="l00428"></a>00428 <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr))<a name="l00429"></a>00429 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00430"></a>00430 <span class="comment">// assume it is the first character for the name of a header</span><a name="l00431"></a>00431 m_header_name.erase();<a name="l00432"></a>00432 m_header_name.push_back(*ptr);<a name="l00433"></a>00433 m_parse_state = PARSE_HEADER_NAME;<a name="l00434"></a>00434 }<a name="l00435"></a>00435 <span class="keywordflow">break</span>;<a name="l00436"></a>00436 <a name="l00437"></a>00437 <span class="keywordflow">case</span> PARSE_HEADER_START:<a name="l00438"></a>00438 <span class="comment">// parsing the start of a new header</span><a name="l00439"></a>00439 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00440"></a>00440 m_parse_state = PARSE_EXPECTING_FINAL_NEWLINE;<a name="l00441"></a>00441 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00442"></a>00442 m_parse_state = PARSE_EXPECTING_FINAL_CR;<a name="l00443"></a>00443 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\t'</span> || *ptr == <span class="charliteral">' '</span>) {<a name="l00444"></a>00444 m_parse_state = PARSE_HEADER_WHITESPACE;<a name="l00445"></a>00445 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr)) {<a name="l00446"></a>00446 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00447"></a>00447 } <span class="keywordflow">else</span> {<a name="l00448"></a>00448 <span class="comment">// first character for the name of a header</span><a name="l00449"></a>00449 m_header_name.erase();<a name="l00450"></a>00450 m_header_name.push_back(*ptr);<a name="l00451"></a>00451 m_parse_state = PARSE_HEADER_NAME;<a name="l00452"></a>00452 }<a name="l00453"></a>00453 <span class="keywordflow">break</span>;<a name="l00454"></a>00454 <a name="l00455"></a>00455 <span class="keywordflow">case</span> PARSE_HEADER_NAME:<a name="l00456"></a>00456 <span class="comment">// parsing the name of a header</span><a name="l00457"></a>00457 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">':'</span>) {<a name="l00458"></a>00458 m_header_value.erase();<a name="l00459"></a>00459 m_parse_state = PARSE_SPACE_BEFORE_HEADER_VALUE;<a name="l00460"></a>00460 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr)) {<a name="l00461"></a>00461 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00462"></a>00462 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_header_name.size() >= HEADER_NAME_MAX) {<a name="l00463"></a>00463 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00464"></a>00464 } <span class="keywordflow">else</span> {<a name="l00465"></a>00465 <span class="comment">// character (not first) for the name of a header</span><a name="l00466"></a>00466 m_header_name.push_back(*ptr);<a name="l00467"></a>00467 }<a name="l00468"></a>00468 <span class="keywordflow">break</span>;<a name="l00469"></a>00469 <a name="l00470"></a>00470 <span class="keywordflow">case</span> PARSE_SPACE_BEFORE_HEADER_VALUE:<a name="l00471"></a>00471 <span class="comment">// parsing space character before a header's value</span><a name="l00472"></a>00472 <span class="keywordflow">if</span> (*ptr == <span class="charliteral">' '</span>) {<a name="l00473"></a>00473 m_parse_state = PARSE_HEADER_VALUE;<a name="l00474"></a>00474 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\r'</span>) {<a name="l00475"></a>00475 m_http_request->addHeader(m_header_name, m_header_value);<a name="l00476"></a>00476 m_parse_state = PARSE_EXPECTING_NEWLINE;<a name="l00477"></a>00477 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr == <span class="charliteral">'\n'</span>) {<a name="l00478"></a>00478 m_http_request->addHeader(m_header_name, m_header_value);<a name="l00479"></a>00479 m_parse_state = PARSE_EXPECTING_CR;<a name="l00480"></a>00480 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#3576f39f53f154efb0ba36486abedc64">isChar</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#8f064aeda3ebd36b268e4a672903bfbd">isControl</a>(*ptr) || <a class="code" href="classpion_1_1_h_t_t_p_request_parser.html#c1e2d889f65e4ce9cdf48c7ceb73ddfa">isSpecial</a>(*ptr)) {<a name="l00481"></a>00481 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00482"></a>00482 } <span class="keywordflow">else</span> {<a name="l00483"></a>00483 <span class="comment">// assume it is the first character for the value of a header</span><a name="l00484"></a>00484 m_header_value.push_back(*ptr);<a name="l00485"></a>00485 m_parse_state = PARSE_HEADER_VALUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -