OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / lib / src / net / httpd / mod / NyLPC_cModFileIoBaseClass.c
index beb7d7d..0cd2504 100644 (file)
@@ -19,8 +19,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
  *\r
  * For further information please contact.\r
- *     http://nyatla.jp/\r
- *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ *  http://nyatla.jp/\r
+ *  <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
  *\r
  *********************************************************************************/\r
 #include "NyLPC_cModFileIoBaseClass.h"\r
 #include "../NyLPC_cHttpdUtils.h"\r
 #include "NyLPC_net.h"\r
 \r
-#define FNAME_MAX      48\r
-#define STRBUF_MAX     48\r
+#define FNAME_MAX   48\r
+#define STRBUF_MAX  48\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
-       NyLPC_TUInt8 _astate;\r
-       NyLPC_TInt16 _prefix_len;\r
-       NyLPC_TcStr_t _tstr;\r
-       NyLPC_TChar _tstr_buf[STRBUF_MAX];\r
-       /** 文字列のパーサ*/\r
-       char fname[FNAME_MAX];//対象ファイル名の格納先\r
+    struct NyLPC_THttpBasicHeader super;\r
+    NyLPC_TcUrlEncode_t urlencode;\r
+    NyLPC_TUInt8 _content_id;\r
+    //解析用\r
+    NyLPC_TUInt8 _qery_name_id;\r
+    NyLPC_TUInt8 _astate;\r
+    NyLPC_TInt16 _prefix_len;\r
+    NyLPC_TcStr_t _tstr;\r
+    NyLPC_TChar _tstr_buf[STRBUF_MAX];\r
+    /** 文字列のパーサ*/\r
+    char fname[FNAME_MAX];//対象ファイル名の格納先\r
 };\r
 \r
 #define ST_PARSE_PATH 1\r
 #define ST_PARSE_QUERY_NAME 2\r
-#define ST_PARSE_QUERY_VALUE 3         //Query読み出し中\r
+#define ST_PARSE_QUERY_VALUE 3      //Query読み出し中\r
 #define ST_PARSE_QUERY_VALUE_NAME 4\r
 /**\r
  * コンテンツID定義(コンテンツ名に対応)\r
@@ -61,137 +61,137 @@ struct TModFileIoHeader
 #define CONTENT_ID_UNKNOWN 0\r
 \r
 \r
-#define QNAME_ID_NAME   1\r
+#define QNAME_ID_NAME    1\r
 #define QNAME_ID_UNKNOWN 0\r
 \r
 \r
 static const struct NyLPC_TTextIdTbl url_tbl[]=\r
 {\r
-       {"upload.api",CONTENT_ID_UPLOAD},\r
-       {"create.api",CONTENT_ID_CREATE},\r
-       {"remove.api",CONTENT_ID_REMOVE},\r
-       {NULL,CONTENT_ID_UNKNOWN}\r
+    {"upload.api",CONTENT_ID_UPLOAD},\r
+    {"create.api",CONTENT_ID_CREATE},\r
+    {"remove.api",CONTENT_ID_REMOVE},\r
+    {NULL,CONTENT_ID_UNKNOWN}\r
 };\r
 \r
 static const struct NyLPC_TTextIdTbl qname_id_table[]=\r
 {\r
-       {"name",QNAME_ID_NAME},\r
-       {NULL,QNAME_ID_UNKNOWN}\r
+    {"name",QNAME_ID_NAME},\r
+    {NULL,QNAME_ID_UNKNOWN}\r
 };\r
 \r
 \r
 \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
-               return NyLPC_TBool_TRUE;//読み飛ばし\r
-       }\r
-       //Path解析\r
-       if(out->_astate==ST_PARSE_PATH){\r
-               if(i_c!='\0' && i_c!='?'){\r
-                       if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
-                               //ERROR\r
-                               NyLPC_OnErrorGoto(ERROR);\r
-                       }\r
-               }else{\r
-                       out->_content_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),url_tbl);\r
-                       switch(out->_content_id)\r
-                       {\r
-                       case CONTENT_ID_UPLOAD:\r
-                       case CONTENT_ID_CREATE:\r
-                       case CONTENT_ID_REMOVE:\r
-                               break;\r
-                       default:\r
-                               NyLPC_OnErrorGoto(ERROR);\r
-                       }\r
-                       NyLPC_cStr_clear(&(out->_tstr));\r
-                       out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ\r
-               }\r
-               return NyLPC_TBool_TRUE;\r
-       }\r
-       switch(out->_content_id)\r
-       {\r
-       case CONTENT_ID_UPLOAD:\r
-       case CONTENT_ID_CREATE:\r
-       case CONTENT_ID_REMOVE:\r
-               switch(out->_astate){\r
-               case ST_PARSE_QUERY_NAME:\r
-                       if(i_c!='\0' && i_c!='&' && i_c!='='){\r
-                               if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
-                                       NyLPC_OnErrorGoto(ERROR);\r
-                               }\r
-                       }else{\r
-                               //Query確定。\r
-                               out->_qery_name_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),qname_id_table);\r
-                               NyLPC_cStr_clear(&(out->_tstr));\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
-                                       out->_astate=ST_PARSE_QUERY_VALUE;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       return NyLPC_TBool_TRUE;\r
-               case ST_PARSE_QUERY_VALUE:\r
-                       //未知のクエリは無視\r
-                       if(i_c!='\0' && i_c!='&'){\r
-                       }else{\r
-                               //クエリ値解析完了\r
-                               out->_astate=ST_PARSE_QUERY_NAME;\r
-                       }\r
-                       return NyLPC_TBool_TRUE;\r
-               case ST_PARSE_QUERY_VALUE_NAME:\r
-                       if(i_c!='\0' && 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
-                       }else{\r
-                               if(NyLPC_cStr_len(&out->_tstr)<1){\r
-                                       //ファイル名短すぎ\r
-                                       NyLPC_OnErrorGoto(ERROR);\r
-                               }\r
-                               //ファイル名を保存\r
-                               strcpy(out->fname,(const char*)NyLPC_cStr_str(&out->_tstr));\r
-                               //終端しているなら、次のクエリへ\r
-                               out->_astate=ST_PARSE_QUERY_NAME;\r
-                       }\r
-                       return NyLPC_TBool_TRUE;\r
-               default:\r
-                       break;\r
-               }\r
-               NyLPC_OnErrorGoto(ERROR);\r
-       default:\r
-               NyLPC_OnErrorGoto(ERROR);\r
-       }\r
-       return NyLPC_TBool_TRUE;\r
+    struct TModFileIoHeader* out=(struct TModFileIoHeader*)o_out;\r
+    NyLPC_TChar c;\r
+    //読み飛ばし\r
+    if(out->_prefix_len<0){\r
+        out->_prefix_len++;\r
+        return NyLPC_TBool_TRUE;//読み飛ばし\r
+    }\r
+    //Path解析\r
+    if(out->_astate==ST_PARSE_PATH){\r
+        if(i_c!='\0' && i_c!='?'){\r
+            if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+                //ERROR\r
+                NyLPC_OnErrorGoto(ERROR);\r
+            }\r
+        }else{\r
+            out->_content_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),url_tbl);\r
+            switch(out->_content_id)\r
+            {\r
+            case CONTENT_ID_UPLOAD:\r
+            case CONTENT_ID_CREATE:\r
+            case CONTENT_ID_REMOVE:\r
+                break;\r
+            default:\r
+                NyLPC_OnErrorGoto(ERROR);\r
+            }\r
+            NyLPC_cStr_clear(&(out->_tstr));\r
+            out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ\r
+        }\r
+        return NyLPC_TBool_TRUE;\r
+    }\r
+    switch(out->_content_id)\r
+    {\r
+    case CONTENT_ID_UPLOAD:\r
+    case CONTENT_ID_CREATE:\r
+    case CONTENT_ID_REMOVE:\r
+        switch(out->_astate){\r
+        case ST_PARSE_QUERY_NAME:\r
+            if(i_c!='\0' && i_c!='&' && i_c!='='){\r
+                if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
+                    NyLPC_OnErrorGoto(ERROR);\r
+                }\r
+            }else{\r
+                //Query確定。\r
+                out->_qery_name_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),qname_id_table);\r
+                NyLPC_cStr_clear(&(out->_tstr));\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
+                    out->_astate=ST_PARSE_QUERY_VALUE;\r
+                    break;\r
+                }\r
+            }\r
+            return NyLPC_TBool_TRUE;\r
+        case ST_PARSE_QUERY_VALUE:\r
+            //未知のクエリは無視\r
+            if(i_c!='\0' && i_c!='&'){\r
+            }else{\r
+                //クエリ値解析完了\r
+                out->_astate=ST_PARSE_QUERY_NAME;\r
+            }\r
+            return NyLPC_TBool_TRUE;\r
+        case ST_PARSE_QUERY_VALUE_NAME:\r
+            if(i_c!='\0' && 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
+            }else{\r
+                if(NyLPC_cStr_len(&out->_tstr)<1){\r
+                    //ファイル名短すぎ\r
+                    NyLPC_OnErrorGoto(ERROR);\r
+                }\r
+                //ファイル名を保存\r
+                strcpy(out->fname,(const char*)NyLPC_cStr_str(&out->_tstr));\r
+                //終端しているなら、次のクエリへ\r
+                out->_astate=ST_PARSE_QUERY_NAME;\r
+            }\r
+            return NyLPC_TBool_TRUE;\r
+        default:\r
+            break;\r
+        }\r
+        NyLPC_OnErrorGoto(ERROR);\r
+    default:\r
+        NyLPC_OnErrorGoto(ERROR);\r
+    }\r
+    return NyLPC_TBool_TRUE;\r
 ERROR:\r
-       return NyLPC_TBool_FALSE;\r
+    return NyLPC_TBool_FALSE;\r
 }\r
 /**\r
  * デフォルトハンドラ\r
  */\r
 static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=\r
 {\r
-       NULL,\r
-       urlHandler\r
+    NULL,\r
+    urlHandler\r
 };\r
 \r
 \r
@@ -200,18 +200,18 @@ static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=
  */\r
 void NyLPC_cModFileIoBaseClass_initialize(NyLPC_TcModFileIoBaseClass_t* i_inst,const NyLPC_TChar* i_ref_root_path)\r
 {\r
-       NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_root_path,NULL,0);\r
+    NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_root_path,NULL,0);\r
 }\r
 void NyLPC_cModFileIoBaseClass_finalize(NyLPC_TcModFileIoBaseClass_t* i_inst)\r
 {\r
-       NyLPC_cModRomFiles_finalize(&i_inst->super);\r
+    NyLPC_cModRomFiles_finalize(&i_inst->super);\r
 }\r
 /**\r
  * モジュールがコネクションをハンドリングできるかを返します。\r
  */\r
 NyLPC_TBool NyLPC_cModFileIoBaseClass_canHandle(NyLPC_TcModFileIoBaseClass_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
-       return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);\r
+    return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);\r
 }\r
 \r
 static struct TModFileIoHeader single_header;\r
@@ -222,118 +222,118 @@ static struct TModFileIoHeader single_header;
  */\r
 NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
-       union{\r
-               NyLPC_TcHttpBasicHeaderParser_t parser;\r
-               NyLPC_TcHttpBodyParser_t body_parser;\r
-       }sh;\r
-       NyLPC_TUInt8 method_type;\r
-       //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
-       NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+    union{\r
+        NyLPC_TcHttpBasicHeaderParser_t parser;\r
+        NyLPC_TcHttpBodyParser_t body_parser;\r
+    }sh;\r
+    NyLPC_TUInt8 method_type;\r
+    //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
+    NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
 \r
-       //排他ロック\r
-       NyLPC_cHttpdConnection_lock(i_connection);\r
-       {//parser\r
+    //排他ロック\r
+    NyLPC_cHttpdConnection_lock(i_connection);\r
+    {//parser\r
 \r
-               //URL解析の準備\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
+        //URL解析の準備\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_cHttpBasicHeaderParser_initialize(&sh.parser,&handler);\r
 \r
-               //プリフェッチしたデータを流す\r
-               NyLPC_cHttpBasicHeaderParser_parseInit(&sh.parser,&(single_header.super));\r
-               NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&sh.parser,&single_header.super);\r
-               //後続をストリームから取り込む\r
-               if(!NyLPC_cHttpBasicHeaderParser_parseStream(&sh.parser,NyLPC_cHttpdConnection_refStream(i_connection),&(single_header.super))){\r
-                       NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
-                       NyLPC_OnErrorGoto(Error1);\r
-               }\r
-               if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&sh.parser,&(single_header.super))){\r
-                       NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
-                       NyLPC_OnErrorGoto(Error1);\r
-               }\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
-       //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
-       if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
-       {\r
-               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
-       }\r
-       //返答フェーズ\r
-       {\r
-               method_type=NyLPC_cHttpdConnection_getMethod(i_connection);\r
+        //プリフェッチしたデータを流す\r
+        NyLPC_cHttpBasicHeaderParser_parseInit(&sh.parser,&(single_header.super));\r
+        NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&sh.parser,&single_header.super);\r
+        //後続をストリームから取り込む\r
+        if(!NyLPC_cHttpBasicHeaderParser_parseStream(&sh.parser,NyLPC_cHttpdConnection_refStream(i_connection),&(single_header.super))){\r
+            NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
+            NyLPC_OnErrorGoto(Error1);\r
+        }\r
+        if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&sh.parser,&(single_header.super))){\r
+            NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
+            NyLPC_OnErrorGoto(Error1);\r
+        }\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
+    //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+    if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
+    {\r
+        NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+    }\r
+    //返答フェーズ\r
+    {\r
+        method_type=NyLPC_cHttpdConnection_getMethod(i_connection);\r
 \r
-               //CGIの実行\r
-               switch(single_header._content_id)\r
-               {\r
-               case CONTENT_ID_UPLOAD:\r
-                       //ファイル名とBodyParserを通知\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
-                               if(!i_inst->_abstruct_function.upload(i_connection,single_header.fname,&sh.body_parser)){\r
-                                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
-                               }\r
-                               if(NyLPC_cHttpBodyParser_parseFinish(&sh.body_parser)){\r
-                                       NyLPC_cHttpBodyParser_finalize(&sh.body_parser);\r
-                                       NyLPC_OnErrorGoto(Error2);//エラーメッセージはハンドラ内で送られていると仮定する。\r
-                               }\r
-                               NyLPC_cHttpBodyParser_finalize(&sh.body_parser);\r
-                       }else{\r
-                               NyLPC_OnErrorGoto(Error2);\r
-                       }\r
-                       break;\r
-               case CONTENT_ID_CREATE:\r
-                       if(method_type==NyLPC_THttpMethodType_GET || method_type==NyLPC_THttpMethodType_HEAD)\r
-                       {\r
-                               //イベント起動\r
-                               if(!i_inst->_abstruct_function.create(i_connection,single_header.fname)){\r
-                                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
-                               }\r
-                               break;\r
-                       }\r
-                       NyLPC_OnErrorGoto(Error2_405);\r
-               case CONTENT_ID_REMOVE:\r
-                       //ファイル名を通知\r
-                       if(method_type==NyLPC_THttpMethodType_GET || method_type==NyLPC_THttpMethodType_HEAD)\r
-                       {\r
-                               //イベント起動\r
-                               if(!i_inst->_abstruct_function.remove(i_connection,single_header.fname)){\r
-                                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
-                               }\r
-                               break;\r
-                       }\r
-                       NyLPC_OnErrorGoto(Error2_405);\r
-               default:\r
-                       NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
-                       NyLPC_OnErrorGoto(Error2);\r
-               }\r
-       }\r
+        //CGIの実行\r
+        switch(single_header._content_id)\r
+        {\r
+        case CONTENT_ID_UPLOAD:\r
+            //ファイル名とBodyParserを通知\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
+                if(!i_inst->_abstruct_function.upload(i_connection,single_header.fname,&sh.body_parser)){\r
+                    NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+                }\r
+                if(NyLPC_cHttpBodyParser_parseFinish(&sh.body_parser)){\r
+                    NyLPC_cHttpBodyParser_finalize(&sh.body_parser);\r
+                    NyLPC_OnErrorGoto(Error2);//エラーメッセージはハンドラ内で送られていると仮定する。\r
+                }\r
+                NyLPC_cHttpBodyParser_finalize(&sh.body_parser);\r
+            }else{\r
+                NyLPC_OnErrorGoto(Error2);\r
+            }\r
+            break;\r
+        case CONTENT_ID_CREATE:\r
+            if(method_type==NyLPC_THttpMethodType_GET || method_type==NyLPC_THttpMethodType_HEAD)\r
+            {\r
+                //イベント起動\r
+                if(!i_inst->_abstruct_function.create(i_connection,single_header.fname)){\r
+                    NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+                }\r
+                break;\r
+            }\r
+            NyLPC_OnErrorGoto(Error2_405);\r
+        case CONTENT_ID_REMOVE:\r
+            //ファイル名を通知\r
+            if(method_type==NyLPC_THttpMethodType_GET || method_type==NyLPC_THttpMethodType_HEAD)\r
+            {\r
+                //イベント起動\r
+                if(!i_inst->_abstruct_function.remove(i_connection,single_header.fname)){\r
+                    NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+                }\r
+                break;\r
+            }\r
+            NyLPC_OnErrorGoto(Error2_405);\r
+        default:\r
+            NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);\r
+            NyLPC_OnErrorGoto(Error2);\r
+        }\r
+    }\r
 //占有解除\r
-       NyLPC_cHttpdConnection_unlock(i_connection);\r
-       return NyLPC_TBool_TRUE;\r
+    NyLPC_cHttpdConnection_unlock(i_connection);\r
+    return NyLPC_TBool_TRUE;\r
 Error2_405:\r
-       NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
+    NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
 Error2:\r
-       //VM排他ロックの解除\r
-       NyLPC_cHttpdConnection_unlock(i_connection);\r
-       return NyLPC_TBool_FALSE;\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
+    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
 }\r
 \r
 \r