/**\r
* レスポンスヘッダを送信します。\r
* BodyはChunkedエンコーディングで送信します。\r
+ * @param i_additional_header\r
+ * メッセージフィールドに追加する文字列です。\r
+ * \r\nで終端下文字列を指定して下さい。\r
*/\r
NyLPC_TBool NyLPC_cHttpdConnection_sendResponseHeader(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TUInt16 i_response_code,const NyLPC_TChar* i_content_type,const NyLPC_TChar* i_additional_header);\r
/**\r
* レスポンスヘッダを送信します。\r
* BodyはContentLengthを伴って送信します。Body送信時にサイズチェックは行いません。\r
- * @i_content_length\r
+ * @param i_content_length\r
* 最大で0x0fffffffを指定できます。\r
+ * @param i_additional_header\r
+ * メッセージフィールドに追加する文字列です。\r
+ * \r\nで終端下文字列を指定して下さい。\r
*/\r
NyLPC_TBool NyLPC_cHttpdConnection_sendResponseHeader2(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TUInt16 i_response_code,const NyLPC_TChar* i_content_type,NyLPC_TUInt32 i_content_length,const NyLPC_TChar* i_additional_header);\r
/**\r
struct TModFileIoHeader\r
{\r
struct NyLPC_THttpBasicHeader super;\r
+ NyLPC_TcUrlEncode_t urlencode;\r
NyLPC_TUInt8 _content_id;\r
//解析用\r
NyLPC_TUInt8 _qery_name_id;\r
\r
\r
\r
+\r
static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_name,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)\r
{\r
(void)i_inst;\r
static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)\r
{\r
struct TModFileIoHeader* out=(struct TModFileIoHeader*)o_out;\r
+ NyLPC_TChar c;\r
//読み飛ばし\r
if(out->_prefix_len<0){\r
out->_prefix_len++;\r
//クエリ値がある場合\r
switch(out->_qery_name_id){\r
case QNAME_ID_NAME:\r
+ NyLPC_cUrlEncode_reset(&out->urlencode);\r
out->_astate=ST_PARSE_QUERY_VALUE_NAME;\r
break;\r
default:\r
return NyLPC_TBool_TRUE;\r
case ST_PARSE_QUERY_VALUE_NAME:\r
if(i_c!='\0' && i_c!='&'){\r
- if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+ //URLデコードしながら蓄積\r
+ switch(NyLPC_cUrlEncode_decode(&out->urlencode,i_c,&c)){\r
+ case NyLPC_TcUrlEncode_ST_NEXT:\r
+ break;\r
+ case NyLPC_TcUrlEncode_ST_DONE:\r
+ if(!NyLPC_cStr_put(&(out->_tstr),c)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ default:\r
NyLPC_OnErrorGoto(ERROR);\r
}\r
return NyLPC_TBool_TRUE;\r
single_header._prefix_len=-((NyLPC_TInt16)strlen(i_inst->super._ref_root_path)+2);\r
single_header._astate=ST_PARSE_PATH;\r
single_header.fname[0]='\0';\r
+ NyLPC_cUrlEncode_initialize(&single_header.urlencode);\r
NyLPC_cStr_initialize(&single_header._tstr,single_header._tstr_buf,STRBUF_MAX);\r
\r
NyLPC_cHttpBasicHeaderParser_initialize(&sh.parser,&handler);\r
NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
NyLPC_OnErrorGoto(Error1);\r
}\r
- //HeaderParserはここで破棄\r
+ //HeaderParserはここで破棄(URLEncode,cSTRも)\r
NyLPC_cHttpBasicHeaderParser_finalize(&sh.parser);\r
+ NyLPC_cUrlEncode_finalize(&single_header.urlencode);\r
+ NyLPC_cStr_finalize(&single_header._tstr);\r
}\r
//Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
if(single_header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && single_header.super.startline.req.version==NyLPC_THttpVersion_11)\r
{\r
case CONTENT_ID_UPLOAD:\r
//ファイル名とBodyParserを通知\r
- if(method_type==NyLPC_THttpMethodType_POST || method_type==NyLPC_THttpMethodType_HEAD)\r
+ if(method_type==NyLPC_THttpMethodType_POST)\r
{\r
+ NyLPC_cHttpdConnection_send100Continue(i_connection);\r
NyLPC_cHttpBodyParser_initialize(&sh.body_parser);\r
NyLPC_cHttpBodyParser_parseInit(&sh.body_parser,&single_header.super);\r
//ハンドラ内ではparseStreamのみ実行\r
NyLPC_OnErrorGoto(Error2);\r
}\r
}\r
- NyLPC_cStr_finalize(&single_header._tstr);\r
//占有解除\r
NyLPC_cHttpdConnection_unlock(i_connection);\r
return NyLPC_TBool_TRUE;\r
Error2_405:\r
NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
Error2:\r
- NyLPC_cStr_finalize(&single_header._tstr);\r
//VM排他ロックの解除\r
NyLPC_cHttpdConnection_unlock(i_connection);\r
return NyLPC_TBool_FALSE;\r
Error1:\r
NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
NyLPC_cStr_finalize(&single_header._tstr);\r
+ NyLPC_cUrlEncode_finalize(&single_header.urlencode);\r
//VM排他ロックの解除\r
NyLPC_cHttpdConnection_unlock(i_connection);\r
return NyLPC_TBool_FALSE;\r