OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / projects / example / sample.net.simplehttpd / src / sketch.c
index 7166e6b..06530d3 100644 (file)
  * ROMにある定義済みファイルの入出力と、クロスドメインRESTが確認できます。\r
  */\r
 #include "boot/sketch.h"\r
-#include "NyLPC_uipService.h"\r
-#include "NyLPC_httpService.h"\r
-#include "NyLPC_utils.h"\r
-#include <stdio.h>\r
+#include "NyLPC_net.h"\r
 \r
-#include "../api/NyLPC_cNet.h"\r
-#include "../api/NyLPC_cHttpd.h"\r
-#include "../api/NyLPC_cModShortUrl.h"\r
+#include "NyLPC_http.h"\r
+#include "NyLPC_utils.h"\r
+#include "../netif/mimicip/NyLPC_cMiMicIpNetIf.h"\r
 \r
-NyLPC_TcNet_t net;\r
+const struct NyLPC_TiNetInterface_Interface* netif;\r
 struct MyHttpd{\r
        NyLPC_TcHttpd_t super;\r
 }httpd;\r
 \r
-NyLPC_TcModShortUrl_t mod_surl;\r
+#define NUM_OF_FSDATA 4\r
+extern struct NyLPC_TRomFileData fsdata[];\r
+\r
 \r
 void handler(NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
-       NyLPC_THttpMethodType m;\r
-       NyLPC_cModShortUrl_parse(&mod_surl,i_connection);\r
-       m=NyLPC_cModShortUrl_getMethod(&mod_surl);\r
-       if(m!=NyLPC_THttpMethodType_HEAD || m!=NyLPC_THttpMethodType_GET){\r
-               NyLPC_cHttpdConnection_sendResponseHeader(i_connection,200,"text/html",NULL);\r
-       }\r
-       if(m==NyLPC_THttpMethodType_GET){\r
-               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"<html><body>");\r
-               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"your request is %s",NyLPC_cModShortUrl_getPath(&mod_surl));\r
+       NyLPC_TcModUrl_t mod;\r
+       char url[64];\r
+\r
 \r
-               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"</body></html>");\r
+       //SHORT URL\r
+       NyLPC_cModUrl_initialize(&mod);\r
+       if(!NyLPC_cModUrl_execute(&mod,i_connection,url,64)){\r
+               NyLPC_cModUrl_finalize(&mod);\r
+               return;\r
        }\r
+       NyLPC_cHttpdConnection_sendResponseHeader(i_connection,200,"text/html",NULL);\r
+       NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"<html><h1>Your request path is %s</h1></html>",url);\r
+       NyLPC_cModUrl_finalize(&mod);\r
        return;\r
 }\r
 void setup(void)\r
 {\r
        //uipサービス初期化。いろいろ利用可能に。\r
-       NyLPC_cNet_initialize(&net);\r
+       netif=NyLPC_cMiMicIpNetIf_getNetInterface();\r
+       NyLPC_cNet_initialize(netif);\r
        NyLPC_cHttpd_initialize(&httpd.super,80);\r
-       httpd.super.function._handler=handler;\r
-       NyLPC_cModShortUrl_initialize(&mod_surl);\r
+       httpd.super.function.onRequest=handler;\r
+\r
 }\r
 \r
 \r
 void loop(void)\r
 {\r
        NyLPC_TcNetConfig_t c2;\r
-       NyLPC_cNetConfig_initialize(&c2);\r
-       NyLPC_cNet_start(&net,&c2);\r
+       //192.168.0.39\r
+       NyLPC_cNetConfig_initialize(&c2,NyLPC_TBool_TRUE);\r
+       NyLPC_cNet_start(&(c2.super));\r
        NyLPC_cHttpd_loop(&httpd.super);\r
        for(;;);\r
 }\r
 \r
 \r
-#ifdef COMMENT\r
-\r
-\r
-//イーサネット用の初期化情報\r
-const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);\r
-const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,0,39);\r
-const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);\r
-const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,0,254);\r
-\r
-//TCP処理スレッドの定義\r
-#define SIZE_OF_RX 256\r
-#define NUM_OF_TH 7\r
-struct TProc{\r
-       NyLPC_TcThread_t th;\r
-       NyLPC_TcTcpSocket_t socket;\r
-       char rbuf[SIZE_OF_RX];\r
-}proc[NUM_OF_TH];\r
-\r
-//ROMFSの定義\r
-extern struct NyLPC_TRomFileData file_cat_jpg;\r
-extern struct NyLPC_TRomFileData file_index_html;\r
-NyLPC_TcRomFileSet_t rfs;\r
-const struct NyLPC_TRomFileData* rfsd[]={\r
-               &file_index_html,\r
-               &file_cat_jpg};\r
-\r
-//private 関数\r
-\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);\r
-\r
-\r
-//スケッチ\r
-\r
-void setup(void)\r
-{\r
-       int i;\r
-       //uipサービス初期化。いろいろ利用可能に。\r
-       NyLPC_cUipService_initialize();\r
-//     for(i=0;i<NUM_OF_TH;i++){\r
-//             NyLPC_cThread_initialize(&(proc[i].th),200,NyLPC_TcThread_PRIORITY_IDLE);\r
-//             NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);\r
-//     }\r
-//     //ROMのファイルシステムを初期化\r
-//     NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);\r
-\r
-}\r
-\r
-//ステータス用。\r
-static int num_of_reqest=0;\r
-static int num_of_error=0;\r
-static int num_of_connect=0;\r
-static int num_of_tx=0;\r
-\r
-//Httpのセッション関数\r
-static int server(void* p)\r
-{\r
-       struct TProc* proc=(struct TProc*)p;\r
-       NyLPC_TUInt16 ret;\r
-       const struct NyLPC_TRomFileData* rf;\r
-       NyLPC_TcHttpStream_t st;\r
-       struct NyLPC_THttpShortRequestHeader reqheader;\r
-       if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
-               return -1;\r
-       }\r
-       num_of_connect++;\r
-\r
-       //TCPのオープン\r
-       if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){\r
-               for(;;){\r
-                       ret=parseReqHeader(&st,&reqheader);\r
-                       num_of_reqest++;\r
-                       //コネクションが増えすぎたら持続性接続を停止するために上書き。\r
-                       if(num_of_connect>5){\r
-                               reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;\r
-                       }\r
-                       if(ret!=200){\r
-                               //エラーならエラーレスポンスを生成。持続性接続しない。\r
-                               writeError(&st,&(reqheader.super),ret);\r
-                               num_of_error++;\r
-                               break;\r
-                       }\r
-                       //URLから判定。\r
-                       if(strncmp("/rf.api?",reqheader.url,8)==0){\r
-                               //ファイル検索\r
-                               rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);\r
-                               if(rf==NULL){\r
-                                       num_of_error++;\r
-                                       if(!writeError(&st,&(reqheader.super),404)){\r
-                                               break;\r
-                                       }\r
-                               }else{\r
-                                       if(!writeFile(&st,&(reqheader.super),rf)){\r
-                                               num_of_error++;\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }else if(strncmp("/status.json",reqheader.url,8)==0){\r
-                               if(!writeJson(&st,&(reqheader.super))){\r
-                                       break;\r
-                               }\r
-                               //httpdの状態を返す。\r
-                       }else{\r
-                               if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){\r
-                                       num_of_error++;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-               }\r
-               NyLPC_cHttpStream_finalize(&st);\r
-       }\r
-       //5秒以内に切断\r
-       NyLPC_cTcpSocket_close(&(proc->socket),5000);\r
-       num_of_connect--;\r
-       return 0;\r
-}\r
-\r
-\r
-void loop(void)\r
-{\r
-       NyLPC_TcIPv4Config_t config;\r
-       NyLPC_TcTcpListener_t listener;\r
-       int i;\r
-\r
-\r
-       NyLPC_cIPv4Config_initialzeForEthernet(&config,&ethaddr,1480);\r
-       NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);\r
-       NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);\r
-\r
-\r
-//     NyLPC_cTcpListener_initialize(&listener,80);\r
-       NyLPC_cUipService_start(&config);\r
-/*     for(;;){\r
-               //ターミネイト状態のタスクを検索\r
-               for(i=0;i<NUM_OF_TH;i++){\r
-                       if(NyLPC_cThread_isTerminated(&(proc[i].th))){\r
-                               //リスニング\r
-                               if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){\r
-                                       continue;\r
-                               }\r
-                               //タスク起動\r
-                               NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));\r
-                       }\r
-               }\r
-       }*/\r
-       for(;;){}\r
-}\r
-\r
-\r
-\r
-/**\r
- * リクエストヘッダのパーサ\r
- */\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)\r
-{\r
-       NyLPC_TUInt16 ret=200;\r
-       NyLPC_TcHttpShortRequestHeaderParser_t hp;\r
-       NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);\r
-\r
-       //ヘッダ解析\r
-       if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){\r
-               ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);\r
-       }\r
-       //ヘッダの内容確認\r
-       if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){\r
-               ret=400;\r
-       }\r
-       //GETだけネ\r
-       if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){\r
-               ret=405;\r
-       }\r
-       NyLPC_cHttpBasicHeaderParser_finalize(&hp);\r
-       return ret;\r
-}\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)\r
-{\r
-       static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
-       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       //チャンク転送設定\r
-       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
-       NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)\r
-{\r
-       static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
-       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       //チャンク転送設定\r
-       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
-       NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,\r
-               (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,\r
-               NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-/**\r
- * ROMファイルのレスポンスライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)\r
-{\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-#endif\r