OSDN Git Service

ModFileIOのnameパラメタにURLでコードを追加
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 4 Jul 2013 08:57:27 +0000 (08:57 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 4 Jul 2013 08:57:27 +0000 (08:57 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@271 47198e57-cb75-475f-84c4-a814cd6f29e0

lib/src/NyLPC_cMiMicEnv.h
lib/src/http/NyLPC_cUrlEncode.c
lib/src/http/NyLPC_cUrlEncode.h
lib/src/net/httpd/NyLPC_cHttpdConnection.h
lib/src/net/httpd/mod/NyLPC_cModFileIoBaseClass.c

index 16503bd..28ac7c5 100644 (file)
@@ -13,7 +13,7 @@ extern "C" {
 #endif /* __cplusplus */\r
 \r
 \r
-#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.14"\r
+#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.15"\r
 \r
 \r
 #ifdef __cplusplus\r
index 9fa7ecf..20c06ad 100644 (file)
@@ -9,6 +9,7 @@ NyLPC_TBool NyLPC_cUrlEncode_initialize(NyLPC_TcUrlEncode_t* i_inst)
        return NyLPC_TBool_TRUE;\r
 }\r
 \r
+\r
 NyLPC_TcUrlEncode_ST NyLPC_cUrlEncode_decode(NyLPC_TcUrlEncode_t* i_inst,NyLPC_TChar c,NyLPC_TChar* out)\r
 {\r
        int t;\r
index a6ef8d6..8eb3ae3 100644 (file)
@@ -31,6 +31,7 @@ NyLPC_TBool NyLPC_cUrlEncode_initialize(NyLPC_TcUrlEncode_t* i_inst);
 \r
 #define NyLPC_cUrlEncode_finalize(i_inst)\r
 \r
+#define NyLPC_cUrlEncode_reset(i_inst) (i_inst)->_len=0\r
 \r
 \r
 NyLPC_TcUrlEncode_ST NyLPC_cUrlEncode_decode(NyLPC_TcUrlEncode_t* i_inst,NyLPC_TChar c,NyLPC_TChar* out);\r
index 721f37a..d390962 100644 (file)
@@ -94,13 +94,19 @@ NyLPC_TBool NyLPC_cHttpdConnection_send100Continue(NyLPC_TcHttpdConnection_t* i_
 /**\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
index 9533152..b1caa95 100644 (file)
@@ -38,6 +38,7 @@
 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
@@ -51,6 +52,7 @@ struct TModFileIoHeader
 \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
@@ -95,6 +97,7 @@ static const struct NyLPC_TTextIdTbl qname_id_table[]=
 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
@@ -141,6 +144,7 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                //クエリ値がある場合\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
@@ -159,7 +163,16 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                        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
@@ -238,6 +251,7 @@ NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_in
                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
@@ -254,8 +268,10 @@ NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_in
                        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
@@ -271,8 +287,9 @@ NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_in
                {\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
@@ -314,20 +331,19 @@ NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_in
                        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