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
15 const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x00,0x01,0x02,0x03,0x04,0x05);
\r
16 const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,128,201);
\r
17 const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);
\r
18 const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,128,254);
\r
21 #define SIZE_OF_RX 256
\r
24 NyLPC_TcThread_t th;
\r
25 NyLPC_TcTcpSocket_t socket;
\r
26 char rbuf[SIZE_OF_RX];
\r
30 extern struct NyLPC_TRomFileData file_cat_jpg;
\r
31 extern struct NyLPC_TRomFileData file_index_html;
\r
32 NyLPC_TcRomFileSet_t rfs;
\r
33 const struct NyLPC_TRomFileData* rfsd[]={
\r
39 static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);
\r
40 static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);
\r
41 static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);
\r
42 static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);
\r
50 //uipサービス初期化。いろいろ利用可能に。
\r
51 NyLPC_cUipService_initialize();
\r
52 for(i=0;i<NUM_OF_TH;i++){
\r
53 NyLPC_cThread_initialize(&(proc[i].th),200);
\r
54 NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);
\r
57 NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);
\r
62 static int num_of_reqest=0;
\r
63 static int num_of_error=0;
\r
64 static int num_of_connect=0;
\r
65 static int num_of_tx=0;
\r
68 static int server(void* p)
\r
70 struct TProc* proc=(struct TProc*)p;
\r
72 const struct NyLPC_TRomFileData* rf;
\r
73 NyLPC_TcHttpStream_t st;
\r
74 struct NyLPC_THttpShortRequestHeader reqheader;
\r
75 if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){
\r
81 if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){
\r
83 ret=parseReqHeader(&st,&reqheader);
\r
85 //コネクションが増えすぎたら持続性接続を停止するために上書き。
\r
86 if(num_of_connect>5){
\r
87 reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
\r
90 //エラーならエラーレスポンスを生成。持続性接続しない。
\r
91 writeError(&st,&(reqheader.super),ret);
\r
96 if(strncmp("/rf.api?",reqheader.url,8)==0){
\r
98 rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);
\r
101 if(!writeError(&st,&(reqheader.super),404)){
\r
105 if(!writeFile(&st,&(reqheader.super),rf)){
\r
110 }else if(strncmp("/status.json",reqheader.url,8)==0){
\r
111 if(!writeJson(&st,&(reqheader.super))){
\r
116 if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){
\r
123 NyLPC_cHttpStream_finalize(&st);
\r
126 NyLPC_cTcpSocket_close(&(proc->socket),5000);
\r
134 NyLPC_TcIPv4Config_t config;
\r
135 NyLPC_TcTcpListener_t listener;
\r
139 NyLPC_cIPv4Config_initialzeForEthernet(&config,ðaddr,1480);
\r
140 NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);
\r
141 NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);
\r
144 NyLPC_cTcpListener_initialize(&listener,80);
\r
145 NyLPC_cUipService_start(&config);
\r
148 for(i=0;i<NUM_OF_TH;i++){
\r
149 if(NyLPC_cThread_isTerminated(&(proc[i].th))){
\r
151 if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){
\r
155 NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));
\r
167 static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)
\r
169 NyLPC_TUInt16 ret=200;
\r
170 NyLPC_TcHttpShortRequestHeaderParser_t hp;
\r
171 NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);
\r
174 if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){
\r
175 ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);
\r
178 if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){
\r
182 if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){
\r
185 NyLPC_cHttpBasicHeaderParser_finalize(&hp);
\r
190 * 戻り値はpersistentConnectionが有効かどうか。
\r
192 static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)
\r
194 static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";
\r
195 NyLPC_TcHttpHeaderWriter_t hw;
\r
196 NyLPC_TcHttpBodyWriter_t bw;
\r
198 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
199 return NyLPC_TBool_FALSE;
\r
202 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
203 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
205 //@bug HTTP/1.1未満のクライアントを考慮していない。
\r
206 NyLPC_cHttpHeaderWriter_setChunked(&hw);
\r
208 NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);
\r
210 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");
\r
212 //ヘッダ書込み終わり。(最後だけチェック)
\r
213 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
214 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
215 return NyLPC_TBool_FALSE;
\r
217 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
220 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
222 NyLPC_cHttpBodyWriter_setChunked(&bw);
\r
223 NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);
\r
225 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
226 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
227 return NyLPC_TBool_FALSE;
\r
229 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
230 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r
235 * 戻り値はpersistentConnectionが有効かどうか。
\r
237 static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)
\r
239 static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";
\r
240 NyLPC_TcHttpHeaderWriter_t hw;
\r
241 NyLPC_TcHttpBodyWriter_t bw;
\r
243 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
244 return NyLPC_TBool_FALSE;
\r
247 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
248 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
250 //@bug HTTP/1.1未満のクライアントを考慮していない。
\r
251 NyLPC_cHttpHeaderWriter_setChunked(&hw);
\r
253 NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);
\r
255 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");
\r
256 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");
\r
258 //ヘッダ書込み終わり。(最後だけチェック)
\r
259 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
260 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
261 return NyLPC_TBool_FALSE;
\r
263 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
266 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
268 NyLPC_cHttpBodyWriter_setChunked(&bw);
\r
269 NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,
\r
270 (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,
\r
271 NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());
\r
273 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
274 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
275 return NyLPC_TBool_FALSE;
\r
277 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
278 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r
281 * ROMファイルのレスポンスライタ。
\r
282 * 戻り値はpersistentConnectionが有効かどうか。
\r
284 static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)
\r
286 NyLPC_TcHttpHeaderWriter_t hw;
\r
287 NyLPC_TcHttpBodyWriter_t bw;
\r
289 if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){
\r
290 return NyLPC_TBool_FALSE;
\r
293 if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){
\r
294 NyLPC_cHttpHeaderWriter_setClose(&hw);
\r
296 NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);
\r
298 NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);
\r
300 NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);
\r
302 //ヘッダ書込み終わり。(最後だけチェック)
\r
303 if(!NyLPC_cHttpHeaderWriter_close(&hw)){
\r
304 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
305 return NyLPC_TBool_FALSE;
\r
307 NyLPC_cHttpHeaderWriter_finalize(&hw);
\r
310 NyLPC_cHttpBodyWriter_initialize(&bw,i_st);
\r
311 NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);
\r
313 if(!NyLPC_cHttpBodyWriter_close(&bw)){
\r
314 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
315 return NyLPC_TBool_FALSE;
\r
317 NyLPC_cHttpBodyWriter_finalize(&hw);
\r
318 return NyLPC_THttpBasicHeader_isPersistent(i_rqh);
\r