OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / lib / src / net / httpd / NyLPC_cHttpRequestPrefixParser.c
1 /*********************************************************************************\r
2  * PROJECT: MiMic\r
3  * --------------------------------------------------------------------------------\r
4  *\r
5  * This file is part of MiMic\r
6  * Copyright (C)2011 Ryo Iizuka\r
7  *\r
8  * MiMic is free software: you can redistribute it and/or modify\r
9  * it under the terms of the GNU Lesser General Public License as published\r
10  * by the Free Software Foundation, either version 3 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU Lesser General Public License\r
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
20  *\r
21  * For further information please contact.\r
22  *  http://nyatla.jp/\r
23  *  <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
24  *\r
25  *********************************************************************************/\r
26 #include "NyLPC_cHttpRequestPrefixParser.h"\r
27 \r
28 \r
29 \r
30 \r
31 struct THttpHeaderPrefix{\r
32     struct NyLPC_THttpBasicHeader super;\r
33     /** URL蓄積用のオブジェクト*/\r
34     NyLPC_TcStr_t surl;\r
35     /** コールバック関数の成功/失敗を判定するフラグ*/\r
36     NyLPC_TBool status;\r
37 };\r
38 \r
39 \r
40 \r
41 const NyLPC_TChar* NyLPC_cHttpRequestPrefixParser_getUrlPrefix(const NyLPC_TcHttpRequestPrefixParser_t* i_inst)\r
42 {\r
43     return i_inst->_url;\r
44 }\r
45 /**\r
46  * URLハンドラ。\r
47  * 規定文字数のPathを入力されるか、Pathが終了するまで文字列を蓄積する。\r
48  */\r
49 static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)\r
50 {\r
51     struct THttpHeaderPrefix* s=(struct THttpHeaderPrefix*)o_out;\r
52 \r
53     //終端なら終わらせる。\r
54     if(i_c=='\0'){\r
55         s->status=NyLPC_TBool_TRUE;\r
56         return NyLPC_TBool_FALSE;\r
57     }\r
58     //容量がいっぱい->解析を終わらせる。\r
59     if(NyLPC_cStr_capacity(&(s->surl))<1)\r
60     {\r
61         s->status=NyLPC_TBool_TRUE;\r
62         return NyLPC_TBool_FALSE;\r
63     }\r
64     NyLPC_cStr_put(&(s->surl),i_c);\r
65     return NyLPC_TBool_TRUE;\r
66 }\r
67 /**\r
68  * デフォルトハンドラ\r
69  */\r
70 static const struct NyLPC_TcHttpBasicHeaderParser_Handler _handler=\r
71 {\r
72     NULL,\r
73     urlHandler\r
74 };\r
75 void NyLPC_cHttpRequestPrefixParser_initialize(NyLPC_TcHttpRequestPrefixParser_t* i_inst)\r
76 {\r
77     return;\r
78 }\r
79 \r
80 NyLPC_TBool NyLPC_cHttpRequestPrefixParser_parse(NyLPC_TcHttpRequestPrefixParser_t* i_inst,NyLPC_TiHttpPtrStream_t* i_stream)\r
81 {\r
82     struct THttpHeaderPrefix hout;\r
83     NyLPC_TcHttpBasicHeaderParser_t parser;\r
84     NyLPC_cStr_initialize(&hout.surl,i_inst->_url,NyLPC_TcHttpRequestPrefixParser_MAX_URL_LEN);\r
85     hout.status=NyLPC_TBool_FALSE;\r
86     NyLPC_cHttpBasicHeaderParser_initialize(&parser,&_handler);\r
87     NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&hout.super);\r
88     NyLPC_cHttpBasicHeaderParser_parseStream(&parser,i_stream,&hout.super);//どの道エラー\r
89     NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&hout.super);//どの道エラー\r
90     if(!hout.status){\r
91         NyLPC_OnErrorGoto(Error);\r
92     }\r
93     //Errorで帰ってくるのでparsefinishは不要\r
94     //NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&hout.super);\r
95     i_inst->method=hout.super.startline.req.method;\r
96     NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
97     //この時点では、メソッドとURLの一部がパースされているはず。\r
98     NyLPC_cStr_finalize(&hout.surl);\r
99     //フラグをチェックして返す。\r
100     return NyLPC_TBool_TRUE;\r
101 Error:\r
102     NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
103     NyLPC_cStr_finalize(&hout.surl);\r
104     return NyLPC_TBool_FALSE;\r
105 }\r
106 \r
107 \r
108 \r
109 \r
110 \r
111 \r