3 * ROMにある定義済みファイルの入出力と、クロスドメインRESTが確認できます。
\r
5 #include "boot/sketch.h"
\r
6 #include "NyLPC_uipService.h"
\r
7 #include "NyLPC_httpService.h"
\r
8 #include "NyLPC_utils.h"
\r
11 #include "../api/NyLPC_cNet.h"
\r
12 #include "../api/NyLPC_cHttpd.h"
\r
16 NyLPC_TcHttpd_t super;
\r
18 void handler(NyLPC_TcHttpdConnection_t* i_inst)
\r
24 //uipサービス初期化。いろいろ利用可能に。
\r
25 NyLPC_cNet_initialize(&net);
\r
26 NyLPC_cHttpd_initialize(&httpd.super,80);
\r
27 httpd.super.function._handler=handler;
\r
33 NyLPC_TcNetConfig_t c2;
\r
34 NyLPC_cNetConfig_initialize(&c2);
\r
35 NyLPC_cNet_start(&net,&c2);
\r
36 NyLPC_cHttpd_loop(&httpd.super);
\r
45 const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);
\r
46 const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,0,39);
\r
47 const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);
\r
48 const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,0,254);
\r
51 #define SIZE_OF_RX 256
\r
54 NyLPC_TcThread_t th;
\r
55 NyLPC_TcTcpSocket_t socket;
\r
56 char rbuf[SIZE_OF_RX];
\r
60 extern struct NyLPC_TRomFileData file_cat_jpg;
\r
61 extern struct NyLPC_TRomFileData file_index_html;
\r
62 NyLPC_TcRomFileSet_t rfs;
\r
63 const struct NyLPC_TRomFileData* rfsd[]={
\r
69 static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);
\r
70 static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);
\r
71 static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);
\r
72 static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);
\r
80 //uipサービス初期化。いろいろ利用可能に。
\r
81 NyLPC_cUipService_initialize();
\r
82 // for(i=0;i<NUM_OF_TH;i++){
\r
83 // NyLPC_cThread_initialize(&(proc[i].th),200,NyLPC_TcThread_PRIORITY_IDLE);
\r
84 // NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);
\r
86 // //ROMのファイルシステムを初期化
\r
87 // NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);
\r
92 static int num_of_reqest=0;
\r
93 static int num_of_error=0;
\r
94 static int num_of_connect=0;
\r
95 static int num_of_tx=0;
\r
98 static int server(void* p)
\r
100 struct TProc* proc=(struct TProc*)p;
\r
102 const struct NyLPC_TRomFileData* rf;
\r
103 NyLPC_TcHttpStream_t st;
\r
104 struct NyLPC_THttpShortRequestHeader reqheader;
\r
105 if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){
\r
111 if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){
\r
113 ret=parseReqHeader(&st,&reqheader);
\r
115 //コネクションが増えすぎたら持続性接続を停止するために上書き。
\r
116 if(num_of_connect>5){
\r
117 reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
\r
120 //エラーならエラーレスポンスを生成。持続性接続しない。
\r
121 writeError(&st,&(reqheader.super),ret);
\r
126 if(strncmp("/rf.api?",reqheader.url,8)==0){
\r
128 rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);
\r
131 if(!writeError(&st,&(reqheader.super),404)){
\r
135 if(!writeFile(&st,&(reqheader.super),rf)){
\r
140 }else if(strncmp("/status.json",reqheader.url,8)==0){
\r
141 if(!writeJson(&st,&(reqheader.super))){
\r
146 if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){
\r
153 NyLPC_cHttpStream_finalize(&st);
\r
156 NyLPC_cTcpSocket_close(&(proc->socket),5000);
\r
164 NyLPC_TcIPv4Config_t config;
\r
165 NyLPC_TcTcpListener_t listener;
\r
169 NyLPC_cIPv4Config_initialzeForEthernet(&config,ðaddr,1480);
\r
170 NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);
\r
171 NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);
\r
174 // NyLPC_cTcpListener_initialize(&listener,80);
\r
175 NyLPC_cUipService_start(&config);
\r
178 for(i=0;i<NUM_OF_TH;i++){
\r
179 if(NyLPC_cThread_isTerminated(&(proc[i].th))){
\r
181 if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){
\r
185 NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));
\r
197 static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)
\r
199 NyLPC_TUInt16 ret=200;
\r
200 NyLPC_TcHttpShortRequestHeaderParser_t hp;
\r
201 NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);
\r
204 if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){
\r
205 ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);
\r
208 if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){
\r
212 if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){
\r
215 NyLPC_cHttpBasicHeaderParser_finalize(&hp);
\r
220 * 戻り値はpersistentConnectionが有効かどうか。
\r
222 static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)
\r
224 static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";
\r
225 NyLPC_TcHttpHeaderWriter_t hw;
\r
226 NyLPC_TcHttpBodyWriter_t bw;
\r
228 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
229 return NyLPC_TBool_FALSE;
\r
232 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
233 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
235 //@bug HTTP/1.1未満のクライアントを考慮していない。
\r
236 NyLPC_cHttpHeaderWriter_setChunked(&hw);
\r
238 NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);
\r
240 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");
\r
242 //ヘッダ書込み終わり。(最後だけチェック)
\r
243 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
244 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
245 return NyLPC_TBool_FALSE;
\r
247 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
250 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
252 NyLPC_cHttpBodyWriter_setChunked(&bw);
\r
253 NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);
\r
255 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
256 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
257 return NyLPC_TBool_FALSE;
\r
259 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
260 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r
265 * 戻り値はpersistentConnectionが有効かどうか。
\r
267 static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)
\r
269 static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";
\r
270 NyLPC_TcHttpHeaderWriter_t hw;
\r
271 NyLPC_TcHttpBodyWriter_t bw;
\r
273 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
274 return NyLPC_TBool_FALSE;
\r
277 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
278 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
280 //@bug HTTP/1.1未満のクライアントを考慮していない。
\r
281 NyLPC_cHttpHeaderWriter_setChunked(&hw);
\r
283 NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);
\r
285 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");
\r
286 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");
\r
288 //ヘッダ書込み終わり。(最後だけチェック)
\r
289 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
290 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
291 return NyLPC_TBool_FALSE;
\r
293 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
296 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
298 NyLPC_cHttpBodyWriter_setChunked(&bw);
\r
299 NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,
\r
300 (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,
\r
301 NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());
\r
303 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
304 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
305 return NyLPC_TBool_FALSE;
\r
307 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
308 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r
311 * ROMファイルのレスポンスライタ。
\r
312 * 戻り値はpersistentConnectionが有効かどうか。
\r
314 static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)
\r
316 NyLPC_TcHttpHeaderWriter_t hw;
\r
317 NyLPC_TcHttpBodyWriter_t bw;
\r
319 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
320 return NyLPC_TBool_FALSE;
\r
323 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
324 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
326 NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);
\r
328 NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);
\r
330 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);
\r
332 //ヘッダ書込み終わり。(最後だけチェック)
\r
333 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
334 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
335 return NyLPC_TBool_FALSE;
\r
337 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
340 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
341 NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);
\r
343 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
344 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
345 return NyLPC_TBool_FALSE;
\r
347 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
348 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r