\r
void NyLPC_cHttpBasicBodyParser_initialize(NyLPC_TcHttpBasicBodyParser_t* i_inst,struct NyLPC_TcHttpBasicBodyParser_Handler* i_handler)\r
{\r
- i_inst->_handler=i_handler;\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_NULL;\r
+ i_inst->_handler=i_handler;\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_NULL;\r
}\r
#define NyLPC_cHttpBasicBodyParser_finalize(i_inst)\r
\r
*/\r
void NyLPC_cHttpBasicBodyParser_parseInit(NyLPC_TcHttpBasicBodyParser_t* i_inst,const struct NyLPC_THttpBasicHeader* i_info)\r
{\r
- switch(i_info->transfer_encoding)\r
- {\r
- case NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:\r
- i_inst->_encode_type=NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED;\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START;\r
- i_inst->_data.chunked.recv_len=0;\r
- break;\r
- default:\r
- i_inst->_encode_type=NyLPC_THttpMessgeHeader_TransferEncoding_NONE;\r
- i_inst->_data.normal.content_length=i_info->content_length;\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_BODY;\r
- break;\r
- }\r
+ switch(i_info->transfer_encoding)\r
+ {\r
+ case NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:\r
+ i_inst->_encode_type=NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED;\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START;\r
+ i_inst->_data.chunked.recv_len=0;\r
+ break;\r
+ default:\r
+ i_inst->_encode_type=NyLPC_THttpMessgeHeader_TransferEncoding_NONE;\r
+ i_inst->_data.normal.content_length=i_info->content_length;\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_BODY;\r
+ break;\r
+ }\r
}\r
\r
/**\r
*/\r
NyLPC_TBool NyLPC_cHttpBasicBodyParser_parseFinish(NyLPC_TcHttpBasicBodyParser_t* i_inst)\r
{\r
- NyLPC_TBool ret=(i_inst->_status==NyLPC_TcHttpBasicBodyParser_ST_EOB);\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_NULL;\r
- return ret;\r
+ NyLPC_TBool ret=(i_inst->_status==NyLPC_TcHttpBasicBodyParser_ST_EOB);\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_NULL;\r
+ return ret;\r
}\r
#define HTTP_CR 0x0D\r
#define HTTP_LF 0x0A\r
*/\r
NyLPC_TInt32 NyLPC_cHttpBasicBodyParser_parseChar(NyLPC_TcHttpBasicBodyParser_t* i_inst,const NyLPC_TChar* i_c,NyLPC_TInt32 i_size)\r
{\r
- NyLPC_TInt32 i;\r
- NyLPC_TChar c;\r
- switch(i_inst->_encode_type){\r
- case NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:\r
- for(i=0;i<i_size;)\r
- {\r
- c=*(i_c+i);\r
- //[:START:][:SP:][:EXT:][:BODY:][:END:]\r
- switch(i_inst->_status)\r
- {\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_BODY:\r
- //OnRecv\r
- if(!i_inst->_handler->bodyHandler(i_inst,c)){\r
- i_inst->_data.chunked.recv_len--;\r
- //中断\r
- if(i_inst->_data.chunked.recv_len==0){\r
- //content length分だけ読み取った\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER;\r
- }\r
- return i+1;\r
- }\r
- i_inst->_data.chunked.recv_len--;\r
- if(i_inst->_data.chunked.recv_len==0){\r
- //content length分だけ読み取った\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER;\r
- }\r
- i++;//次の文字へ\r
- break;\r
- // HEX\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START:\r
- if(isxdigit(c)){\r
- i_inst->_data.chunked.recv_len=i_inst->_data.chunked.recv_len*16+NyLPC_ctox(c);\r
- //一応最大チャンクサイズは決めておこうか。\r
- if(i_inst->_data.chunked.recv_len>0x0fffffff){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- i++;//次の文字へ\r
- }else if(c==HTTP_SP){\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_SP;\r
- i++;//次の文字へ\r
- }else if(c==HTTP_CR || c==HTTP_LF){\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT;\r
- //読取位置を変化させずにEXTへ\r
- }else{\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_SP:\r
- if(c==HTTP_SP){\r
- i++;//次の文字へ\r
- }else{\r
- //ext\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT;\r
- }\r
- break;\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT:\r
- //EXTの内容は読まない。\r
- if(c==HTTP_LF){\r
- if(i_inst->_data.chunked.recv_len==0){\r
- //chunksize=0でCRLFを検出したらend-chunk\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_END;\r
- }else{\r
- //chunksize>0でCRLFを検出したらBODY検出\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_BODY;\r
- }\r
- }else{\r
- //nothing to do\r
- }\r
- i++;//次の文字へ\r
- break;\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER:\r
- //CRLF待ち\r
- if(c==HTTP_CR){\r
- //無視\r
- }else if(c==HTTP_LF){\r
- //確定\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START;\r
- }else{\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- i++;\r
- break;\r
- case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_END:\r
- //CRLF待ち\r
- if(c==HTTP_CR){\r
- //無視\r
- }else if(c==HTTP_LF){\r
- //確定\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_EOB;\r
- return i+1;\r
- }else{\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- i++;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }\r
- return i_size;\r
- break;\r
- case NyLPC_THttpMessgeHeader_TransferEncoding_NONE:\r
- if(i_inst->_status!=NyLPC_TcHttpBasicBodyParser_ST_BODY){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- for(i=0;i<i_size;i++)\r
- {\r
- if(i_inst->_data.normal.content_length>0){\r
- //OnRecv\r
- if(!i_inst->_handler->bodyHandler(i_inst,*(i_c+i))){\r
- i++;\r
- i_inst->_data.normal.content_length--;\r
- break;//中断(遷移無し)\r
- }\r
- i_inst->_data.normal.content_length--;\r
- }else{\r
- //content-length==0;全て受信\r
- break;\r
- }\r
- }\r
- if(i_inst->_data.normal.content_length==0){\r
- //content length分だけ読み取った\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_EOB;\r
- return i;\r
- }\r
- return i;\r
- }\r
+ NyLPC_TInt32 i;\r
+ NyLPC_TChar c;\r
+ switch(i_inst->_encode_type){\r
+ case NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:\r
+ for(i=0;i<i_size;)\r
+ {\r
+ c=*(i_c+i);\r
+ //[:START:][:SP:][:EXT:][:BODY:][:END:]\r
+ switch(i_inst->_status)\r
+ {\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_BODY:\r
+ //OnRecv\r
+ if(!i_inst->_handler->bodyHandler(i_inst,c)){\r
+ i_inst->_data.chunked.recv_len--;\r
+ //中断\r
+ if(i_inst->_data.chunked.recv_len==0){\r
+ //content length分だけ読み取った\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER;\r
+ }\r
+ return i+1;\r
+ }\r
+ i_inst->_data.chunked.recv_len--;\r
+ if(i_inst->_data.chunked.recv_len==0){\r
+ //content length分だけ読み取った\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER;\r
+ }\r
+ i++;//次の文字へ\r
+ break;\r
+ // HEX\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START:\r
+ if(isxdigit((int)c)){\r
+ i_inst->_data.chunked.recv_len=i_inst->_data.chunked.recv_len*16+NyLPC_ctox(c);\r
+ //一応最大チャンクサイズは決めておこうか。\r
+ if(i_inst->_data.chunked.recv_len>0x0fffffff){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ i++;//次の文字へ\r
+ }else if(c==HTTP_SP){\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_SP;\r
+ i++;//次の文字へ\r
+ }else if(c==HTTP_CR || c==HTTP_LF){\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT;\r
+ //読取位置を変化させずにEXTへ\r
+ }else{\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_SP:\r
+ if(c==HTTP_SP){\r
+ i++;//次の文字へ\r
+ }else{\r
+ //ext\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT;\r
+ }\r
+ break;\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_EXT:\r
+ //EXTの内容は読まない。\r
+ if(c==HTTP_LF){\r
+ if(i_inst->_data.chunked.recv_len==0){\r
+ //chunksize=0でCRLFを検出したらend-chunk\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_END;\r
+ }else{\r
+ //chunksize>0でCRLFを検出したらBODY検出\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_BODY;\r
+ }\r
+ }else{\r
+ //nothing to do\r
+ }\r
+ i++;//次の文字へ\r
+ break;\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_FOOTER:\r
+ //CRLF待ち\r
+ if(c==HTTP_CR){\r
+ //無視\r
+ }else if(c==HTTP_LF){\r
+ //確定\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_CHUNK_HEADER_START;\r
+ }else{\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ i++;\r
+ break;\r
+ case NyLPC_TcHttpBasicBodyParser_ST_CHUNK_END:\r
+ //CRLF待ち\r
+ if(c==HTTP_CR){\r
+ //無視\r
+ }else if(c==HTTP_LF){\r
+ //確定\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_EOB;\r
+ return i+1;\r
+ }else{\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ i++;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }\r
+ return i_size;\r
+ case NyLPC_THttpMessgeHeader_TransferEncoding_NONE:\r
+ if(i_inst->_status!=NyLPC_TcHttpBasicBodyParser_ST_BODY){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ for(i=0;i<i_size;i++)\r
+ {\r
+ if(i_inst->_data.normal.content_length>0){\r
+ //OnRecv\r
+ if(!i_inst->_handler->bodyHandler(i_inst,*(i_c+i))){\r
+ i++;\r
+ i_inst->_data.normal.content_length--;\r
+ break;//中断(遷移無し)\r
+ }\r
+ i_inst->_data.normal.content_length--;\r
+ }else{\r
+ //content-length==0;全て受信\r
+ break;\r
+ }\r
+ }\r
+ if(i_inst->_data.normal.content_length==0){\r
+ //content length分だけ読み取った\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_EOB;\r
+ return i;\r
+ }\r
+ return i;\r
+ }\r
ERROR:\r
- //ERROR\r
- i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_ERROR;\r
- return -1;\r
+ //ERROR\r
+ i_inst->_status=NyLPC_TcHttpBasicBodyParser_ST_ERROR;\r
+ return -1;\r
}\r
\r
\r