This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Fork of libMiMic by
core/http/NyLPC_cHttpBasicHeaderParser.c@115:fa79286d8ea4, 2017-02-24 (annotated)
- Committer:
- furutani
- Date:
- Fri Feb 24 04:43:41 2017 +0000
- Revision:
- 115:fa79286d8ea4
- Parent:
- 58:03b89038b21a
Delete missing include line.; Add parameter "timeout" to TCPSocket::connect(), precv().; Fix to send ARP request to default gateway when connecting to IP address of different segment.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyatla | 1:9f6a78395432 | 1 | /********************************************************************************* |
nyatla | 1:9f6a78395432 | 2 | * PROJECT: MiMic |
nyatla | 1:9f6a78395432 | 3 | * -------------------------------------------------------------------------------- |
nyatla | 1:9f6a78395432 | 4 | * |
nyatla | 1:9f6a78395432 | 5 | * This file is part of MiMic |
nyatla | 1:9f6a78395432 | 6 | * Copyright (C)2011 Ryo Iizuka |
nyatla | 1:9f6a78395432 | 7 | * |
nyatla | 1:9f6a78395432 | 8 | * MiMic is free software: you can redistribute it and/or modify |
nyatla | 1:9f6a78395432 | 9 | * it under the terms of the GNU Lesser General Public License as published |
nyatla | 1:9f6a78395432 | 10 | * by the Free Software Foundation, either version 3 of the License, or |
nyatla | 1:9f6a78395432 | 11 | * (at your option) any later version. |
nyatla | 1:9f6a78395432 | 12 | * |
nyatla | 1:9f6a78395432 | 13 | * This program is distributed in the hope that it will be useful, |
nyatla | 1:9f6a78395432 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nyatla | 1:9f6a78395432 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nyatla | 1:9f6a78395432 | 16 | * GNU General Public License for more details. |
nyatla | 1:9f6a78395432 | 17 | * |
nyatla | 1:9f6a78395432 | 18 | * You should have received a copy of the GNU Lesser General Public License |
nyatla | 1:9f6a78395432 | 19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
nyatla | 1:9f6a78395432 | 20 | * |
nyatla | 1:9f6a78395432 | 21 | * For further information please contact. |
nyatla | 1:9f6a78395432 | 22 | * http://nyatla.jp/ |
nyatla | 1:9f6a78395432 | 23 | * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp> |
nyatla | 1:9f6a78395432 | 24 | * |
nyatla | 1:9f6a78395432 | 25 | *********************************************************************************/ |
nyatla | 1:9f6a78395432 | 26 | #include "NyLPC_cHttpBasicHeaderParser_protected.h" |
nyatla | 1:9f6a78395432 | 27 | #include <stdlib.h> |
nyatla | 1:9f6a78395432 | 28 | |
nyatla | 58:03b89038b21a | 29 | #define HTTP_TIMEOUT NyLPC_TiHttpPtrStream_DEFAULT_HTTP_TIMEOUT |
nyatla | 58:03b89038b21a | 30 | |
nyatla | 48:00d211aac2ec | 31 | static const struct NyLPC_TTextIdTbl method_id_table[]= |
nyatla | 48:00d211aac2ec | 32 | { |
nyatla | 48:00d211aac2ec | 33 | //HTTP STANDARD |
nyatla | 48:00d211aac2ec | 34 | {"GET",NyLPC_THttpMethodType_GET}, |
nyatla | 48:00d211aac2ec | 35 | {"POST",NyLPC_THttpMethodType_POST}, |
nyatla | 48:00d211aac2ec | 36 | {"HEAD",NyLPC_THttpMethodType_HEAD}, |
nyatla | 48:00d211aac2ec | 37 | //SSDP |
nyatla | 48:00d211aac2ec | 38 | {"M-SEARCH",NyLPC_THttpMethodType_M_SEARCH}, |
nyatla | 48:00d211aac2ec | 39 | {"NOTIFY",NyLPC_THttpMethodType_NOTIFY}, |
nyatla | 48:00d211aac2ec | 40 | {NULL,NyLPC_THttpMethodType_NULL} |
nyatla | 48:00d211aac2ec | 41 | }; |
nyatla | 48:00d211aac2ec | 42 | /*-------------------------------------------------------------------------------- |
nyatla | 48:00d211aac2ec | 43 | * |
nyatla | 48:00d211aac2ec | 44 | * NyLPC_THttpMethodType |
nyatla | 48:00d211aac2ec | 45 | * |
nyatla | 48:00d211aac2ec | 46 | --------------------------------------------------------------------------------*/ |
nyatla | 14:4618692ec239 | 47 | const char* NyLPC_THttpMethodType_toString(NyLPC_THttpMethodType i_method) |
nyatla | 14:4618692ec239 | 48 | { |
nyatla | 48:00d211aac2ec | 49 | const char* ret=NyLPC_TTextIdTbl_getTextById(i_method,method_id_table); |
nyatla | 48:00d211aac2ec | 50 | if(ret==NULL){ |
nyatla | 14:4618692ec239 | 51 | NyLPC_Abort(); |
nyatla | 14:4618692ec239 | 52 | } |
nyatla | 48:00d211aac2ec | 53 | return ret; |
nyatla | 14:4618692ec239 | 54 | } |
nyatla | 14:4618692ec239 | 55 | |
nyatla | 48:00d211aac2ec | 56 | static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out) |
nyatla | 48:00d211aac2ec | 57 | { |
nyatla | 48:00d211aac2ec | 58 | //解析処理 |
nyatla | 48:00d211aac2ec | 59 | *o_out=NyLPC_TTextIdTbl_getMatchIdIgnoreCase(NyLPC_cStr_str(i_str),method_id_table); |
nyatla | 48:00d211aac2ec | 60 | if(*o_out==NyLPC_THttpMethodType_NULL){ |
nyatla | 48:00d211aac2ec | 61 | NyLPC_OnErrorGoto(ERROR); |
nyatla | 48:00d211aac2ec | 62 | } |
nyatla | 48:00d211aac2ec | 63 | return NyLPC_TBool_TRUE; |
nyatla | 48:00d211aac2ec | 64 | ERROR: |
nyatla | 48:00d211aac2ec | 65 | return NyLPC_TBool_FALSE; |
nyatla | 48:00d211aac2ec | 66 | } |
nyatla | 48:00d211aac2ec | 67 | /*-------------------------------------------------------------------------------- |
nyatla | 48:00d211aac2ec | 68 | * |
nyatla | 48:00d211aac2ec | 69 | * NyLPC_THttpBasicHeader |
nyatla | 48:00d211aac2ec | 70 | * |
nyatla | 48:00d211aac2ec | 71 | --------------------------------------------------------------------------------*/ |
nyatla | 14:4618692ec239 | 72 | |
nyatla | 1:9f6a78395432 | 73 | NyLPC_TBool NyLPC_THttpBasicHeader_isPersistent(const struct NyLPC_THttpBasicHeader* i_struct) |
nyatla | 1:9f6a78395432 | 74 | { |
nyatla | 1:9f6a78395432 | 75 | switch(i_struct->type) |
nyatla | 1:9f6a78395432 | 76 | { |
nyatla | 1:9f6a78395432 | 77 | case NyLPC_THttpHeaderType_REQUEST: |
nyatla | 1:9f6a78395432 | 78 | return (i_struct->connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE)&&(i_struct->startline.req.version==NyLPC_THttpVersion_11); |
nyatla | 1:9f6a78395432 | 79 | case NyLPC_THttpHeaderType_RESPONSE: |
nyatla | 1:9f6a78395432 | 80 | default: |
nyatla | 1:9f6a78395432 | 81 | break; |
nyatla | 1:9f6a78395432 | 82 | } |
nyatla | 1:9f6a78395432 | 83 | return NyLPC_TBool_FALSE; |
nyatla | 1:9f6a78395432 | 84 | } |
nyatla | 1:9f6a78395432 | 85 | |
nyatla | 1:9f6a78395432 | 86 | |
nyatla | 1:9f6a78395432 | 87 | |
nyatla | 1:9f6a78395432 | 88 | |
nyatla | 2:b96c1e90d120 | 89 | |
nyatla | 1:9f6a78395432 | 90 | |
nyatla | 1:9f6a78395432 | 91 | |
nyatla | 1:9f6a78395432 | 92 | |
nyatla | 1:9f6a78395432 | 93 | /* |
nyatla | 1:9f6a78395432 | 94 | 文字コードの定義 |
nyatla | 1:9f6a78395432 | 95 | */ |
nyatla | 1:9f6a78395432 | 96 | #define HTTP_SP 0x20 |
nyatla | 1:9f6a78395432 | 97 | #define HTTP_LF 0x0A |
nyatla | 1:9f6a78395432 | 98 | #define HTTP_CR 0x0D |
nyatla | 1:9f6a78395432 | 99 | #define HTTP_DM ':' |
nyatla | 1:9f6a78395432 | 100 | |
nyatla | 1:9f6a78395432 | 101 | |
nyatla | 2:b96c1e90d120 | 102 | |
nyatla | 1:9f6a78395432 | 103 | |
nyatla | 1:9f6a78395432 | 104 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 105 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 106 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 107 | static NyLPC_TcHttpBasicHeaderParser_ST parseVersion(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,NyLPC_TcHttpBasicHeaderParser_ST i_next,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 108 | static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 109 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 110 | static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 111 | static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 112 | static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c); |
nyatla | 1:9f6a78395432 | 113 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out); |
nyatla | 1:9f6a78395432 | 114 | |
nyatla | 1:9f6a78395432 | 115 | |
nyatla | 1:9f6a78395432 | 116 | static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out); |
nyatla | 1:9f6a78395432 | 117 | static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out); |
nyatla | 1:9f6a78395432 | 118 | |
nyatla | 1:9f6a78395432 | 119 | static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error); |
nyatla | 1:9f6a78395432 | 120 | |
nyatla | 1:9f6a78395432 | 121 | |
nyatla | 1:9f6a78395432 | 122 | /** |
nyatla | 1:9f6a78395432 | 123 | * デフォルトハンドラ |
nyatla | 1:9f6a78395432 | 124 | */ |
nyatla | 1:9f6a78395432 | 125 | static const struct NyLPC_TcHttpBasicHeaderParser_Handler _default_handler= |
nyatla | 1:9f6a78395432 | 126 | { |
nyatla | 48:00d211aac2ec | 127 | NULL,NULL |
nyatla | 1:9f6a78395432 | 128 | }; |
nyatla | 1:9f6a78395432 | 129 | |
nyatla | 1:9f6a78395432 | 130 | |
nyatla | 1:9f6a78395432 | 131 | |
nyatla | 1:9f6a78395432 | 132 | /*---------------------------------------- |
nyatla | 1:9f6a78395432 | 133 | Public/Protected関数 |
nyatla | 1:9f6a78395432 | 134 | ----------------------------------------*/ |
nyatla | 1:9f6a78395432 | 135 | |
nyatla | 1:9f6a78395432 | 136 | |
nyatla | 2:b96c1e90d120 | 137 | void NyLPC_cHttpBasicHeaderParser_initialize(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const struct NyLPC_TcHttpBasicHeaderParser_Handler* i_handler) |
nyatla | 1:9f6a78395432 | 138 | { |
nyatla | 1:9f6a78395432 | 139 | NyLPC_cStr_initialize(&(i_inst->_wsb),i_inst->_wsb_buf,NyLPC_cHttpBasicHeaderParser_SIZE_OF_WBS); |
nyatla | 57:bc4330dfa62f | 140 | i_inst->_handler=((i_handler==NULL)?&_default_handler:i_handler); |
nyatla | 2:b96c1e90d120 | 141 | } |
nyatla | 2:b96c1e90d120 | 142 | |
nyatla | 2:b96c1e90d120 | 143 | /** |
nyatla | 2:b96c1e90d120 | 144 | * parserの初期化 |
nyatla | 2:b96c1e90d120 | 145 | */ |
nyatla | 2:b96c1e90d120 | 146 | void NyLPC_cHttpBasicHeaderParser_parseInit(NyLPC_TcHttpBasicHeaderParser_t* i_inst,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 2:b96c1e90d120 | 147 | { |
nyatla | 2:b96c1e90d120 | 148 | //出力構造体を初期化 |
nyatla | 2:b96c1e90d120 | 149 | o_out->connection=NyLPC_THttpMessgeHeader_Connection_NONE; |
nyatla | 2:b96c1e90d120 | 150 | o_out->content_length=NyLPC_THttpContentLength_INVALID_LENGTH; |
nyatla | 2:b96c1e90d120 | 151 | o_out->transfer_encoding=NyLPC_THttpMessgeHeader_TransferEncoding_NONE; |
nyatla | 2:b96c1e90d120 | 152 | i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_START; |
nyatla | 2:b96c1e90d120 | 153 | } |
nyatla | 2:b96c1e90d120 | 154 | /** |
nyatla | 2:b96c1e90d120 | 155 | * parseCharがNyLPC_TcHttpBasicHeaderParser_ST_EOHを返却したらコールすること。 |
nyatla | 2:b96c1e90d120 | 156 | */ |
nyatla | 2:b96c1e90d120 | 157 | NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parseFinish(NyLPC_TcHttpBasicHeaderParser_t* i_inst,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 2:b96c1e90d120 | 158 | { |
nyatla | 2:b96c1e90d120 | 159 | if(i_inst->_st!=NyLPC_TcHttpBasicHeaderParser_ST_EOH) |
nyatla | 2:b96c1e90d120 | 160 | { |
nyatla | 2:b96c1e90d120 | 161 | return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 162 | } |
nyatla | 2:b96c1e90d120 | 163 | //整合性チェック |
nyatla | 2:b96c1e90d120 | 164 | if(!testHeader(o_out,&i_inst->_rcode)){ |
nyatla | 2:b96c1e90d120 | 165 | i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 2:b96c1e90d120 | 166 | return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 167 | } |
nyatla | 2:b96c1e90d120 | 168 | return NyLPC_TBool_TRUE; |
nyatla | 1:9f6a78395432 | 169 | } |
nyatla | 2:b96c1e90d120 | 170 | /** |
nyatla | 2:b96c1e90d120 | 171 | * 文字列をパースします。 |
nyatla | 2:b96c1e90d120 | 172 | * コール前にNyLPC_cHttpBasicHeaderParser_parseInitでパーサを開始してください。 |
nyatla | 2:b96c1e90d120 | 173 | * @return |
nyatla | 2:b96c1e90d120 | 174 | * パースした文字列の長さ。-1の場合はエラー。 |
nyatla | 2:b96c1e90d120 | 175 | * TRUEの場合、NyLPC_cHttpBasicHeaderParser_getParseStatus関数で状態をチェックして、後続の処理を選択してください。 |
nyatla | 2:b96c1e90d120 | 176 | */ |
nyatla | 2:b96c1e90d120 | 177 | NyLPC_TInt32 NyLPC_cHttpBasicHeaderParser_parseChar(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_c,NyLPC_TInt32 i_size,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 2:b96c1e90d120 | 178 | { |
nyatla | 2:b96c1e90d120 | 179 | int i; |
nyatla | 2:b96c1e90d120 | 180 | NyLPC_TChar c; |
nyatla | 2:b96c1e90d120 | 181 | //Errorチェック |
nyatla | 2:b96c1e90d120 | 182 | if(NyLPC_TcHttpBasicHeaderParser_ST_ERROR==i_inst->_st) |
nyatla | 2:b96c1e90d120 | 183 | { |
nyatla | 2:b96c1e90d120 | 184 | return 0; |
nyatla | 2:b96c1e90d120 | 185 | } |
nyatla | 2:b96c1e90d120 | 186 | for(i=0;i<i_size;i++){ |
nyatla | 2:b96c1e90d120 | 187 | c=*(i_c+i); |
nyatla | 2:b96c1e90d120 | 188 | switch(i_inst->_st) |
nyatla | 2:b96c1e90d120 | 189 | { |
nyatla | 2:b96c1e90d120 | 190 | case NyLPC_TcHttpBasicHeaderParser_ST_START: |
nyatla | 2:b96c1e90d120 | 191 | i_inst->_st=parseStartLine(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 192 | break; |
nyatla | 2:b96c1e90d120 | 193 | case NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM: |
nyatla | 2:b96c1e90d120 | 194 | i_inst->_st=parseMessageParam(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 195 | break; |
nyatla | 2:b96c1e90d120 | 196 | case NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD: |
nyatla | 2:b96c1e90d120 | 197 | i_inst->_st=parseMessage1(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 198 | break; |
nyatla | 2:b96c1e90d120 | 199 | case NyLPC_TcHttpBasicHeaderParser_ST_RL_URL: |
nyatla | 2:b96c1e90d120 | 200 | i_inst->_st=parseRequestUrl(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 201 | break; |
nyatla | 2:b96c1e90d120 | 202 | case NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION: |
nyatla | 2:b96c1e90d120 | 203 | i_inst->_st=parseVersion(i_inst,c,NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD,o_out); |
nyatla | 2:b96c1e90d120 | 204 | break; |
nyatla | 2:b96c1e90d120 | 205 | case NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE: |
nyatla | 2:b96c1e90d120 | 206 | i_inst->_st=parseStatusCode(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 207 | break; |
nyatla | 2:b96c1e90d120 | 208 | case NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON: |
nyatla | 2:b96c1e90d120 | 209 | i_inst->_st=parseReason(i_inst,c); |
nyatla | 2:b96c1e90d120 | 210 | break; |
nyatla | 2:b96c1e90d120 | 211 | case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH: |
nyatla | 2:b96c1e90d120 | 212 | i_inst->_st=parseMessage_ContentLength(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 213 | break; |
nyatla | 2:b96c1e90d120 | 214 | case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION: |
nyatla | 2:b96c1e90d120 | 215 | i_inst->_st=parseMessage_Connection(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 216 | break; |
nyatla | 2:b96c1e90d120 | 217 | case NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING: |
nyatla | 2:b96c1e90d120 | 218 | i_inst->_st=parseMessage_TransferEncoding(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 219 | break; |
nyatla | 2:b96c1e90d120 | 220 | default: |
nyatla | 2:b96c1e90d120 | 221 | i_inst->_rcode=500; |
nyatla | 2:b96c1e90d120 | 222 | i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 2:b96c1e90d120 | 223 | } |
nyatla | 2:b96c1e90d120 | 224 | if(NyLPC_TcHttpBasicHeaderParser_ST_isError(i_inst->_st)){ |
nyatla | 2:b96c1e90d120 | 225 | //エラー起こしたら終了。 |
nyatla | 2:b96c1e90d120 | 226 | return i; |
nyatla | 2:b96c1e90d120 | 227 | }else if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){ |
nyatla | 2:b96c1e90d120 | 228 | //ヘッダ終端なら終了。 |
nyatla | 2:b96c1e90d120 | 229 | return i+1; |
nyatla | 2:b96c1e90d120 | 230 | } |
nyatla | 2:b96c1e90d120 | 231 | } |
nyatla | 2:b96c1e90d120 | 232 | return i_size; |
nyatla | 2:b96c1e90d120 | 233 | } |
nyatla | 2:b96c1e90d120 | 234 | |
nyatla | 2:b96c1e90d120 | 235 | |
nyatla | 1:9f6a78395432 | 236 | |
nyatla | 1:9f6a78395432 | 237 | /** |
nyatla | 1:9f6a78395432 | 238 | * ストリームから読み出して、パースします。 |
nyatla | 2:b96c1e90d120 | 239 | * コール前にNyLPC_cHttpBasicHeaderParser_parseInitでパーサを開始してください。 |
nyatla | 2:b96c1e90d120 | 240 | * @return |
nyatla | 2:b96c1e90d120 | 241 | * FALSE-失敗/TRUE-成功 |
nyatla | 2:b96c1e90d120 | 242 | * 関数が成功した場合、NyLPC_cHttpBasicHeaderParser_parseFinishでパーサを閉じることが出来ます。 |
nyatla | 1:9f6a78395432 | 243 | */ |
nyatla | 48:00d211aac2ec | 244 | NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parseStream(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TiHttpPtrStream_t* i_stream,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 245 | { |
nyatla | 1:9f6a78395432 | 246 | const char* rp_base; |
nyatla | 1:9f6a78395432 | 247 | NyLPC_TInt32 rsize; |
nyatla | 1:9f6a78395432 | 248 | for(;;){ |
nyatla | 1:9f6a78395432 | 249 | //タイムアウト付でストリームから読み出し。 |
nyatla | 58:03b89038b21a | 250 | rsize=NyLPC_iHttpPtrStream_pread(i_stream,(const void**)(&rp_base),HTTP_TIMEOUT); |
nyatla | 1:9f6a78395432 | 251 | if(rsize<=0){ |
nyatla | 1:9f6a78395432 | 252 | return NyLPC_TBool_FALSE; |
nyatla | 1:9f6a78395432 | 253 | } |
nyatla | 2:b96c1e90d120 | 254 | rsize=NyLPC_cHttpBasicHeaderParser_parseChar(i_inst,rp_base,rsize,o_out); |
nyatla | 2:b96c1e90d120 | 255 | if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_ERROR){ |
nyatla | 2:b96c1e90d120 | 256 | //パース失敗 |
nyatla | 2:b96c1e90d120 | 257 | NyLPC_iHttpPtrStream_rseek(i_stream,rsize); |
nyatla | 2:b96c1e90d120 | 258 | return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 259 | } |
nyatla | 2:b96c1e90d120 | 260 | if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){ |
nyatla | 1:9f6a78395432 | 261 | //パース成功 |
nyatla | 2:b96c1e90d120 | 262 | NyLPC_iHttpPtrStream_rseek(i_stream,rsize); |
nyatla | 2:b96c1e90d120 | 263 | return NyLPC_TBool_TRUE; |
nyatla | 1:9f6a78395432 | 264 | } |
nyatla | 1:9f6a78395432 | 265 | NyLPC_iHttpPtrStream_rseek(i_stream,(NyLPC_TUInt16)rsize); |
nyatla | 1:9f6a78395432 | 266 | } |
nyatla | 1:9f6a78395432 | 267 | return NyLPC_TBool_FALSE; |
nyatla | 1:9f6a78395432 | 268 | } |
nyatla | 1:9f6a78395432 | 269 | |
nyatla | 1:9f6a78395432 | 270 | |
nyatla | 2:b96c1e90d120 | 271 | ///** |
nyatla | 2:b96c1e90d120 | 272 | // * ストリームから読み出して、パースします。 |
nyatla | 2:b96c1e90d120 | 273 | // */ |
nyatla | 2:b96c1e90d120 | 274 | //NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parse(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TcHttpStream_t* i_stream,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 2:b96c1e90d120 | 275 | //{ |
nyatla | 2:b96c1e90d120 | 276 | // NyLPC_TcHttpBasicHeaderParser_ST st; |
nyatla | 2:b96c1e90d120 | 277 | // const char* rp_base; |
nyatla | 2:b96c1e90d120 | 278 | // NyLPC_TInt32 rsize; |
nyatla | 2:b96c1e90d120 | 279 | // char c; |
nyatla | 2:b96c1e90d120 | 280 | // int i; |
nyatla | 2:b96c1e90d120 | 281 | // |
nyatla | 2:b96c1e90d120 | 282 | // //出力構造体を初期化 |
nyatla | 2:b96c1e90d120 | 283 | // st=NyLPC_TcHttpBasicHeaderParser_ST_START; |
nyatla | 2:b96c1e90d120 | 284 | // o_out->connection=NyLPC_THttpMessgeHeader_Connection_NONE; |
nyatla | 2:b96c1e90d120 | 285 | // o_out->content_length=NyLPC_THttpContentLength_INVALID_LENGTH; |
nyatla | 2:b96c1e90d120 | 286 | // o_out->transfer_encoding=NyLPC_THttpMessgeHeader_TransferEncoding_NONE; |
nyatla | 2:b96c1e90d120 | 287 | // |
nyatla | 2:b96c1e90d120 | 288 | // for(;;){ |
nyatla | 2:b96c1e90d120 | 289 | // //タイムアウト付でストリームから読み出し。 |
nyatla | 2:b96c1e90d120 | 290 | // rsize=NyLPC_iHttpPtrStream_pread(i_stream,(const void**)(&rp_base)); |
nyatla | 2:b96c1e90d120 | 291 | // if(rsize<=0){ |
nyatla | 2:b96c1e90d120 | 292 | // return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 293 | // } |
nyatla | 2:b96c1e90d120 | 294 | // for(i=0;i<rsize;i++){ |
nyatla | 2:b96c1e90d120 | 295 | // c=*(rp_base+i); |
nyatla | 2:b96c1e90d120 | 296 | // switch(st) |
nyatla | 2:b96c1e90d120 | 297 | // { |
nyatla | 2:b96c1e90d120 | 298 | // case NyLPC_TcHttpBasicHeaderParser_ST_START: |
nyatla | 2:b96c1e90d120 | 299 | // st=parseStartLine(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 300 | // break; |
nyatla | 2:b96c1e90d120 | 301 | // case NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM: |
nyatla | 2:b96c1e90d120 | 302 | // st=parseMessageParam(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 303 | // break; |
nyatla | 2:b96c1e90d120 | 304 | // case NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD: |
nyatla | 2:b96c1e90d120 | 305 | // st=parseMessage1(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 306 | // break; |
nyatla | 2:b96c1e90d120 | 307 | // case NyLPC_TcHttpBasicHeaderParser_ST_RL_URL: |
nyatla | 2:b96c1e90d120 | 308 | // st=parseRequestUrl(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 309 | // break; |
nyatla | 2:b96c1e90d120 | 310 | // case NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION: |
nyatla | 2:b96c1e90d120 | 311 | // st=parseVersion(i_inst,c,NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD,o_out); |
nyatla | 2:b96c1e90d120 | 312 | // break; |
nyatla | 2:b96c1e90d120 | 313 | // case NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE: |
nyatla | 2:b96c1e90d120 | 314 | // st=parseStatusCode(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 315 | // break; |
nyatla | 2:b96c1e90d120 | 316 | // case NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON: |
nyatla | 2:b96c1e90d120 | 317 | // st=parseReason(i_inst,c); |
nyatla | 2:b96c1e90d120 | 318 | // break; |
nyatla | 2:b96c1e90d120 | 319 | // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH: |
nyatla | 2:b96c1e90d120 | 320 | // st=parseMessage_ContentLength(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 321 | // break; |
nyatla | 2:b96c1e90d120 | 322 | // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION: |
nyatla | 2:b96c1e90d120 | 323 | // st=parseMessage_Connection(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 324 | // break; |
nyatla | 2:b96c1e90d120 | 325 | // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING: |
nyatla | 2:b96c1e90d120 | 326 | // st=parseMessage_TransferEncoding(i_inst,c,o_out); |
nyatla | 2:b96c1e90d120 | 327 | // break; |
nyatla | 2:b96c1e90d120 | 328 | // default: |
nyatla | 2:b96c1e90d120 | 329 | // i_inst->_rcode=500; |
nyatla | 2:b96c1e90d120 | 330 | // st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 2:b96c1e90d120 | 331 | // } |
nyatla | 2:b96c1e90d120 | 332 | // //エラー起こしたら終了。 |
nyatla | 2:b96c1e90d120 | 333 | // if(NyLPC_TcHttpBasicHeaderParser_ST_isError(st)){ |
nyatla | 2:b96c1e90d120 | 334 | // return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 335 | // } |
nyatla | 2:b96c1e90d120 | 336 | // //パース成功 |
nyatla | 2:b96c1e90d120 | 337 | // if(st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){ |
nyatla | 2:b96c1e90d120 | 338 | // //整合性チェック |
nyatla | 2:b96c1e90d120 | 339 | // if(!testHeader(o_out,&i_inst->_rcode)){ |
nyatla | 2:b96c1e90d120 | 340 | // st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 2:b96c1e90d120 | 341 | // return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 342 | // } |
nyatla | 2:b96c1e90d120 | 343 | // //シーク |
nyatla | 2:b96c1e90d120 | 344 | // NyLPC_iHttpPtrStream_rseek(i_stream,i+1); |
nyatla | 2:b96c1e90d120 | 345 | // return NyLPC_TBool_TRUE; |
nyatla | 2:b96c1e90d120 | 346 | // } |
nyatla | 2:b96c1e90d120 | 347 | // } |
nyatla | 2:b96c1e90d120 | 348 | // //シーク |
nyatla | 2:b96c1e90d120 | 349 | // NyLPC_iHttpPtrStream_rseek(i_stream,(NyLPC_TUInt16)rsize); |
nyatla | 2:b96c1e90d120 | 350 | // } |
nyatla | 2:b96c1e90d120 | 351 | // return NyLPC_TBool_FALSE; |
nyatla | 2:b96c1e90d120 | 352 | //} |
nyatla | 2:b96c1e90d120 | 353 | |
nyatla | 2:b96c1e90d120 | 354 | |
nyatla | 1:9f6a78395432 | 355 | |
nyatla | 1:9f6a78395432 | 356 | /*---------------------------------------- |
nyatla | 1:9f6a78395432 | 357 | private関数 |
nyatla | 1:9f6a78395432 | 358 | ----------------------------------------*/ |
nyatla | 1:9f6a78395432 | 359 | /** |
nyatla | 1:9f6a78395432 | 360 | ヘッダの整合性をとる。 |
nyatla | 1:9f6a78395432 | 361 | */ |
nyatla | 1:9f6a78395432 | 362 | static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error) |
nyatla | 1:9f6a78395432 | 363 | { |
nyatla | 1:9f6a78395432 | 364 | switch(i_header->startline.req.version){ |
nyatla | 1:9f6a78395432 | 365 | case NyLPC_THttpVersion_09: |
nyatla | 1:9f6a78395432 | 366 | if(i_header->type==NyLPC_THttpHeaderType_REQUEST){ |
nyatla | 1:9f6a78395432 | 367 | //Requestの時だけmethodチェック |
nyatla | 1:9f6a78395432 | 368 | //GETだけ |
nyatla | 1:9f6a78395432 | 369 | if(i_header->startline.req.method!=NyLPC_THttpMethodType_GET){ |
nyatla | 1:9f6a78395432 | 370 | *o_error=400; |
nyatla | 1:9f6a78395432 | 371 | break; |
nyatla | 1:9f6a78395432 | 372 | } |
nyatla | 1:9f6a78395432 | 373 | } |
nyatla | 1:9f6a78395432 | 374 | //TEは受け付けない。 |
nyatla | 1:9f6a78395432 | 375 | if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){ |
nyatla | 1:9f6a78395432 | 376 | *o_error=400; |
nyatla | 1:9f6a78395432 | 377 | break; |
nyatla | 1:9f6a78395432 | 378 | } |
nyatla | 1:9f6a78395432 | 379 | //ContentLength=0,Connection=Closedに修正。 |
nyatla | 1:9f6a78395432 | 380 | i_header->content_length=0; |
nyatla | 1:9f6a78395432 | 381 | i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE; |
nyatla | 1:9f6a78395432 | 382 | return NyLPC_TBool_TRUE; |
nyatla | 1:9f6a78395432 | 383 | case NyLPC_THttpVersion_10: |
nyatla | 1:9f6a78395432 | 384 | //TEは受け付けない。 |
nyatla | 1:9f6a78395432 | 385 | if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){ |
nyatla | 1:9f6a78395432 | 386 | *o_error=406; |
nyatla | 1:9f6a78395432 | 387 | break; |
nyatla | 1:9f6a78395432 | 388 | } |
nyatla | 1:9f6a78395432 | 389 | //ContentLengthが無いときは0 |
nyatla | 1:9f6a78395432 | 390 | if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){ |
nyatla | 1:9f6a78395432 | 391 | i_header->content_length=0; |
nyatla | 1:9f6a78395432 | 392 | } |
nyatla | 1:9f6a78395432 | 393 | //Connection=Closedに修正。(1.0のKeepaliveは難しいから無視) |
nyatla | 1:9f6a78395432 | 394 | i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE; |
nyatla | 1:9f6a78395432 | 395 | return NyLPC_TBool_TRUE; |
nyatla | 1:9f6a78395432 | 396 | case NyLPC_THttpVersion_11: |
nyatla | 1:9f6a78395432 | 397 | if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){ |
nyatla | 1:9f6a78395432 | 398 | //Contentlength無しのChunked指定はOK |
nyatla | 1:9f6a78395432 | 399 | if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED){ |
nyatla | 1:9f6a78395432 | 400 | //Chunkedが無い場合はContent-Lengthは0と仮定 |
nyatla | 1:9f6a78395432 | 401 | i_header->content_length=0; |
nyatla | 41:2389bd6b6f74 | 402 | }else{ |
nyatla | 41:2389bd6b6f74 | 403 | //content-length無し && Chunked有 |
nyatla | 41:2389bd6b6f74 | 404 | //OK |
nyatla | 1:9f6a78395432 | 405 | } |
nyatla | 41:2389bd6b6f74 | 406 | }else if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){ |
nyatla | 41:2389bd6b6f74 | 407 | //ContentLengthあるのにChunkedとは何事 |
nyatla | 1:9f6a78395432 | 408 | *o_error=400; |
nyatla | 1:9f6a78395432 | 409 | break; |
nyatla | 1:9f6a78395432 | 410 | } |
nyatla | 1:9f6a78395432 | 411 | return NyLPC_TBool_TRUE; |
nyatla | 1:9f6a78395432 | 412 | case NyLPC_THttpVersion_UNKNOWN: |
nyatla | 1:9f6a78395432 | 413 | //おい馬鹿やめろ |
nyatla | 1:9f6a78395432 | 414 | *o_error=505; |
nyatla | 1:9f6a78395432 | 415 | break; |
nyatla | 1:9f6a78395432 | 416 | default: |
nyatla | 1:9f6a78395432 | 417 | *o_error=500; |
nyatla | 1:9f6a78395432 | 418 | break; |
nyatla | 1:9f6a78395432 | 419 | } |
nyatla | 1:9f6a78395432 | 420 | return NyLPC_TBool_FALSE; |
nyatla | 1:9f6a78395432 | 421 | } |
nyatla | 1:9f6a78395432 | 422 | |
nyatla | 1:9f6a78395432 | 423 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 424 | { |
nyatla | 1:9f6a78395432 | 425 | |
nyatla | 1:9f6a78395432 | 426 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 427 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0){ |
nyatla | 1:9f6a78395432 | 428 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 429 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし |
nyatla | 1:9f6a78395432 | 430 | } |
nyatla | 1:9f6a78395432 | 431 | } |
nyatla | 1:9f6a78395432 | 432 | if(i_c==HTTP_CR){ |
nyatla | 1:9f6a78395432 | 433 | //CRの無視 |
nyatla | 1:9f6a78395432 | 434 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし |
nyatla | 1:9f6a78395432 | 435 | }else if(i_c==HTTP_LF){ |
nyatla | 1:9f6a78395432 | 436 | //大文字化 |
nyatla | 1:9f6a78395432 | 437 | NyLPC_cStr_toUpper(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 438 | //close? |
nyatla | 1:9f6a78395432 | 439 | o_out->transfer_encoding=NyLPC_cStr_isEqual(&(i_inst->_wsb),"CHUNKED")?NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:NyLPC_THttpMessgeHeader_TransferEncoding_UNKNOWN; |
nyatla | 1:9f6a78395432 | 440 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 441 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD; |
nyatla | 1:9f6a78395432 | 442 | } |
nyatla | 1:9f6a78395432 | 443 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 444 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 445 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 446 | } |
nyatla | 1:9f6a78395432 | 447 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし; |
nyatla | 1:9f6a78395432 | 448 | Error: |
nyatla | 1:9f6a78395432 | 449 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 450 | } |
nyatla | 1:9f6a78395432 | 451 | |
nyatla | 1:9f6a78395432 | 452 | |
nyatla | 1:9f6a78395432 | 453 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 454 | { |
nyatla | 57:bc4330dfa62f | 455 | const static NyLPC_TUInt8 id[]={ |
nyatla | 57:bc4330dfa62f | 456 | NyLPC_THttpMessgeHeader_Connection_CLOSE, |
nyatla | 57:bc4330dfa62f | 457 | NyLPC_THttpMessgeHeader_Connection_KEEPALIVE, |
nyatla | 57:bc4330dfa62f | 458 | NyLPC_THttpMessgeHeader_Connection_UPGRADE, |
nyatla | 57:bc4330dfa62f | 459 | NyLPC_THttpMessgeHeader_Connection_UNKNOWN |
nyatla | 57:bc4330dfa62f | 460 | }; |
nyatla | 57:bc4330dfa62f | 461 | const static NyLPC_TChar* str[]={ |
nyatla | 57:bc4330dfa62f | 462 | "CLOSE", |
nyatla | 57:bc4330dfa62f | 463 | "KEEP-ALIVE", |
nyatla | 57:bc4330dfa62f | 464 | "UPGRADE" |
nyatla | 57:bc4330dfa62f | 465 | }; |
nyatla | 57:bc4330dfa62f | 466 | NyLPC_TUInt8 i; |
nyatla | 1:9f6a78395432 | 467 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 468 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0){ |
nyatla | 1:9f6a78395432 | 469 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 470 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし |
nyatla | 1:9f6a78395432 | 471 | } |
nyatla | 1:9f6a78395432 | 472 | } |
nyatla | 1:9f6a78395432 | 473 | if(i_c==HTTP_CR){ |
nyatla | 1:9f6a78395432 | 474 | //CRの無視 |
nyatla | 1:9f6a78395432 | 475 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし |
nyatla | 1:9f6a78395432 | 476 | }else if(i_c==HTTP_LF){ |
nyatla | 1:9f6a78395432 | 477 | //大文字化 |
nyatla | 1:9f6a78395432 | 478 | NyLPC_cStr_toUpper(&(i_inst->_wsb)); |
nyatla | 57:bc4330dfa62f | 479 | //Convert to ID |
nyatla | 57:bc4330dfa62f | 480 | o_out->connection=NyLPC_THttpMessgeHeader_Connection_UNKNOWN; |
nyatla | 57:bc4330dfa62f | 481 | for(i=0;id[i]!=NyLPC_THttpMessgeHeader_Connection_UNKNOWN;i++){ |
nyatla | 57:bc4330dfa62f | 482 | if(NyLPC_cStr_isEqual(&(i_inst->_wsb),str[i])){ |
nyatla | 57:bc4330dfa62f | 483 | o_out->connection=id[i]; |
nyatla | 57:bc4330dfa62f | 484 | break; |
nyatla | 57:bc4330dfa62f | 485 | } |
nyatla | 1:9f6a78395432 | 486 | } |
nyatla | 1:9f6a78395432 | 487 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 488 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD; |
nyatla | 1:9f6a78395432 | 489 | } |
nyatla | 1:9f6a78395432 | 490 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 491 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 492 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 493 | } |
nyatla | 1:9f6a78395432 | 494 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし; |
nyatla | 1:9f6a78395432 | 495 | Error: |
nyatla | 1:9f6a78395432 | 496 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 497 | } |
nyatla | 1:9f6a78395432 | 498 | |
nyatla | 1:9f6a78395432 | 499 | |
nyatla | 1:9f6a78395432 | 500 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 501 | { |
nyatla | 1:9f6a78395432 | 502 | char* e; |
nyatla | 1:9f6a78395432 | 503 | char* p; |
nyatla | 1:9f6a78395432 | 504 | |
nyatla | 1:9f6a78395432 | 505 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 506 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0) |
nyatla | 1:9f6a78395432 | 507 | { |
nyatla | 1:9f6a78395432 | 508 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 509 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし |
nyatla | 1:9f6a78395432 | 510 | } |
nyatla | 1:9f6a78395432 | 511 | } |
nyatla | 1:9f6a78395432 | 512 | if(i_c==HTTP_CR){ |
nyatla | 1:9f6a78395432 | 513 | //CRの無視 |
nyatla | 1:9f6a78395432 | 514 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし |
nyatla | 1:9f6a78395432 | 515 | }else if(i_c==HTTP_LF){ |
nyatla | 1:9f6a78395432 | 516 | p=NyLPC_cStr_str(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 517 | o_out->content_length=strtol(p,&e,10); |
nyatla | 1:9f6a78395432 | 518 | if(e==p){ |
nyatla | 1:9f6a78395432 | 519 | i_inst->_rcode=400; |
nyatla | 1:9f6a78395432 | 520 | NyLPC_OnErrorGoto(Error);//ギャー |
nyatla | 1:9f6a78395432 | 521 | } |
nyatla | 1:9f6a78395432 | 522 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 523 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD; |
nyatla | 1:9f6a78395432 | 524 | } |
nyatla | 1:9f6a78395432 | 525 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 526 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 527 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 528 | } |
nyatla | 1:9f6a78395432 | 529 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし; |
nyatla | 1:9f6a78395432 | 530 | Error: |
nyatla | 1:9f6a78395432 | 531 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 532 | } |
nyatla | 1:9f6a78395432 | 533 | |
nyatla | 1:9f6a78395432 | 534 | static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 535 | { |
nyatla | 1:9f6a78395432 | 536 | NyLPC_TcStr_t* ws=&(i_inst->_wsb); |
nyatla | 1:9f6a78395432 | 537 | char* e; |
nyatla | 1:9f6a78395432 | 538 | char* p; |
nyatla | 1:9f6a78395432 | 539 | |
nyatla | 1:9f6a78395432 | 540 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 541 | if(NyLPC_cStr_len(ws)==0) |
nyatla | 1:9f6a78395432 | 542 | { |
nyatla | 1:9f6a78395432 | 543 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 544 | return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし |
nyatla | 1:9f6a78395432 | 545 | } |
nyatla | 1:9f6a78395432 | 546 | } |
nyatla | 1:9f6a78395432 | 547 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 548 | //SPで終了 |
nyatla | 1:9f6a78395432 | 549 | p=NyLPC_cStr_str(ws); |
nyatla | 1:9f6a78395432 | 550 | o_out->startline.res.status=(strtol(p,&e,10)); |
nyatla | 1:9f6a78395432 | 551 | if(e==p){ |
nyatla | 1:9f6a78395432 | 552 | i_inst->_rcode=400; |
nyatla | 1:9f6a78395432 | 553 | NyLPC_OnErrorGoto(Error);//ギャー |
nyatla | 1:9f6a78395432 | 554 | } |
nyatla | 1:9f6a78395432 | 555 | NyLPC_cStr_clear(ws); |
nyatla | 1:9f6a78395432 | 556 | return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON; |
nyatla | 1:9f6a78395432 | 557 | } |
nyatla | 1:9f6a78395432 | 558 | if(!NyLPC_cStr_put(ws,i_c)){ |
nyatla | 1:9f6a78395432 | 559 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 560 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 561 | } |
nyatla | 1:9f6a78395432 | 562 | return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし; |
nyatla | 1:9f6a78395432 | 563 | Error: |
nyatla | 1:9f6a78395432 | 564 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 565 | } |
nyatla | 1:9f6a78395432 | 566 | static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c) |
nyatla | 1:9f6a78395432 | 567 | { |
nyatla | 1:9f6a78395432 | 568 | NyLPC_TcStr_t* ws=&(i_inst->_wsb); |
nyatla | 1:9f6a78395432 | 569 | //LFくるまで飛ばす。 |
nyatla | 1:9f6a78395432 | 570 | switch(i_c){ |
nyatla | 1:9f6a78395432 | 571 | case HTTP_LF: |
nyatla | 1:9f6a78395432 | 572 | NyLPC_cStr_clear(ws); |
nyatla | 1:9f6a78395432 | 573 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD; |
nyatla | 1:9f6a78395432 | 574 | default: |
nyatla | 1:9f6a78395432 | 575 | break; |
nyatla | 1:9f6a78395432 | 576 | } |
nyatla | 1:9f6a78395432 | 577 | //URLパーサへ通知 |
nyatla | 1:9f6a78395432 | 578 | return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON;//変化なし |
nyatla | 1:9f6a78395432 | 579 | } |
nyatla | 1:9f6a78395432 | 580 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 581 | { |
nyatla | 1:9f6a78395432 | 582 | NyLPC_TcStr_t* ws=&(i_inst->_wsb); |
nyatla | 1:9f6a78395432 | 583 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 584 | if(NyLPC_cStr_len(ws)==0){ |
nyatla | 1:9f6a78395432 | 585 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 586 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし |
nyatla | 1:9f6a78395432 | 587 | }else{ |
nyatla | 1:9f6a78395432 | 588 | NyLPC_cStr_put(ws,'C');//開始フラグ |
nyatla | 1:9f6a78395432 | 589 | } |
nyatla | 1:9f6a78395432 | 590 | } |
nyatla | 1:9f6a78395432 | 591 | switch(i_c){ |
nyatla | 1:9f6a78395432 | 592 | case HTTP_CR: |
nyatla | 1:9f6a78395432 | 593 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし |
nyatla | 1:9f6a78395432 | 594 | case HTTP_LF: |
nyatla | 1:9f6a78395432 | 595 | //メッセージフィールドの終端を通知 |
nyatla | 48:00d211aac2ec | 596 | if(i_inst->_handler->messageHandler!=NULL){ |
nyatla | 48:00d211aac2ec | 597 | if(!i_inst->_handler->messageHandler(i_inst,NULL,0,o_out)){ |
nyatla | 48:00d211aac2ec | 598 | i_inst->_rcode=500; |
nyatla | 48:00d211aac2ec | 599 | NyLPC_OnErrorGoto(Error); |
nyatla | 48:00d211aac2ec | 600 | } |
nyatla | 1:9f6a78395432 | 601 | } |
nyatla | 1:9f6a78395432 | 602 | NyLPC_cStr_clear(ws); |
nyatla | 1:9f6a78395432 | 603 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD; |
nyatla | 1:9f6a78395432 | 604 | default: |
nyatla | 1:9f6a78395432 | 605 | //メッセージフィールドの追記 |
nyatla | 48:00d211aac2ec | 606 | if(i_inst->_handler->messageHandler!=NULL){ |
nyatla | 48:00d211aac2ec | 607 | if(!i_inst->_handler->messageHandler(i_inst,NULL,i_c,o_out)){ |
nyatla | 48:00d211aac2ec | 608 | i_inst->_rcode=500; |
nyatla | 48:00d211aac2ec | 609 | NyLPC_OnErrorGoto(Error); |
nyatla | 48:00d211aac2ec | 610 | } |
nyatla | 1:9f6a78395432 | 611 | } |
nyatla | 1:9f6a78395432 | 612 | break; |
nyatla | 1:9f6a78395432 | 613 | } |
nyatla | 1:9f6a78395432 | 614 | //URLパーサへ通知 |
nyatla | 1:9f6a78395432 | 615 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし |
nyatla | 1:9f6a78395432 | 616 | Error: |
nyatla | 1:9f6a78395432 | 617 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 618 | } |
nyatla | 1:9f6a78395432 | 619 | |
nyatla | 1:9f6a78395432 | 620 | static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 621 | { |
nyatla | 1:9f6a78395432 | 622 | const static char* KNOWN_MSG[]={"CONNECTION","CONTENT-LENGTH","TRANSFER-ENCODING",NULL}; |
nyatla | 1:9f6a78395432 | 623 | int i; |
nyatla | 1:9f6a78395432 | 624 | |
nyatla | 1:9f6a78395432 | 625 | switch(i_c){ |
nyatla | 1:9f6a78395432 | 626 | case HTTP_DM: |
nyatla | 1:9f6a78395432 | 627 | //メッセージの名前確定。遷移先判定 |
nyatla | 1:9f6a78395432 | 628 | //ヘッダ名を大文字にする。 |
nyatla | 1:9f6a78395432 | 629 | NyLPC_cStr_toUpper(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 630 | for(i=0;KNOWN_MSG[i]!=NULL;i++){ |
nyatla | 1:9f6a78395432 | 631 | if(NyLPC_cStr_isEqual(&(i_inst->_wsb),KNOWN_MSG[i])){ |
nyatla | 1:9f6a78395432 | 632 | //確定。 |
nyatla | 1:9f6a78395432 | 633 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 634 | switch(i){ |
nyatla | 1:9f6a78395432 | 635 | case 0://CONNECTION |
nyatla | 1:9f6a78395432 | 636 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION; |
nyatla | 1:9f6a78395432 | 637 | case 1://CONTENT-LENGTH |
nyatla | 1:9f6a78395432 | 638 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH; |
nyatla | 1:9f6a78395432 | 639 | case 2://TRANSFER-ENCODING |
nyatla | 1:9f6a78395432 | 640 | return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING; |
nyatla | 1:9f6a78395432 | 641 | default://エラー |
nyatla | 1:9f6a78395432 | 642 | break; |
nyatla | 1:9f6a78395432 | 643 | } |
nyatla | 1:9f6a78395432 | 644 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 645 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 646 | } |
nyatla | 1:9f6a78395432 | 647 | } |
nyatla | 1:9f6a78395432 | 648 | //メッセージフィールドの名前を通知 |
nyatla | 48:00d211aac2ec | 649 | if(i_inst->_handler->messageHandler!=NULL){ |
nyatla | 48:00d211aac2ec | 650 | if(!i_inst->_handler->messageHandler(i_inst,NyLPC_cStr_str(&(i_inst->_wsb)),0,o_out)){ |
nyatla | 48:00d211aac2ec | 651 | i_inst->_rcode=500; |
nyatla | 48:00d211aac2ec | 652 | NyLPC_OnErrorGoto(Error); |
nyatla | 48:00d211aac2ec | 653 | } |
nyatla | 57:bc4330dfa62f | 654 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 655 | } |
nyatla | 1:9f6a78395432 | 656 | //カスタムヘッダ解析へ。 |
nyatla | 1:9f6a78395432 | 657 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM; |
nyatla | 1:9f6a78395432 | 658 | case HTTP_CR: |
nyatla | 1:9f6a78395432 | 659 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし |
nyatla | 1:9f6a78395432 | 660 | case HTTP_LF: |
nyatla | 1:9f6a78395432 | 661 | //1文字で終了ならパースエンド。バリデーションチェックへ |
nyatla | 1:9f6a78395432 | 662 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0){ |
nyatla | 1:9f6a78395432 | 663 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 664 | return NyLPC_TcHttpBasicHeaderParser_ST_EOH; |
nyatla | 1:9f6a78395432 | 665 | } |
nyatla | 1:9f6a78395432 | 666 | //これはひどい。 |
nyatla | 1:9f6a78395432 | 667 | i_inst->_rcode=400; |
nyatla | 1:9f6a78395432 | 668 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 669 | default: |
nyatla | 1:9f6a78395432 | 670 | break; |
nyatla | 1:9f6a78395432 | 671 | } |
nyatla | 1:9f6a78395432 | 672 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 673 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 674 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 675 | } |
nyatla | 1:9f6a78395432 | 676 | return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし; |
nyatla | 1:9f6a78395432 | 677 | Error: |
nyatla | 1:9f6a78395432 | 678 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 679 | } |
nyatla | 1:9f6a78395432 | 680 | |
nyatla | 1:9f6a78395432 | 681 | static NyLPC_TcHttpBasicHeaderParser_ST parseVersion(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,NyLPC_TcHttpBasicHeaderParser_ST i_next,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 682 | { |
nyatla | 1:9f6a78395432 | 683 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 684 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0){ |
nyatla | 1:9f6a78395432 | 685 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 686 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし |
nyatla | 1:9f6a78395432 | 687 | } |
nyatla | 1:9f6a78395432 | 688 | } |
nyatla | 1:9f6a78395432 | 689 | if(i_c==HTTP_CR){ |
nyatla | 1:9f6a78395432 | 690 | //CRの無視 |
nyatla | 1:9f6a78395432 | 691 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし |
nyatla | 1:9f6a78395432 | 692 | }else if(i_c==HTTP_LF){ |
nyatla | 1:9f6a78395432 | 693 | //LFで確定 |
nyatla | 1:9f6a78395432 | 694 | if(!parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.req.version))){ |
nyatla | 1:9f6a78395432 | 695 | i_inst->_rcode=505; |
nyatla | 1:9f6a78395432 | 696 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 697 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 698 | } |
nyatla | 1:9f6a78395432 | 699 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 700 | return i_next;//遷移(エラーの時はそのままエラーコードが渡る。) |
nyatla | 1:9f6a78395432 | 701 | } |
nyatla | 1:9f6a78395432 | 702 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 703 | //追記処理しっぱい |
nyatla | 1:9f6a78395432 | 704 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 705 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 706 | } |
nyatla | 1:9f6a78395432 | 707 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし |
nyatla | 1:9f6a78395432 | 708 | Error: |
nyatla | 1:9f6a78395432 | 709 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 710 | } |
nyatla | 1:9f6a78395432 | 711 | |
nyatla | 1:9f6a78395432 | 712 | /** |
nyatla | 1:9f6a78395432 | 713 | URLパーサ。登録した関数に転送する? |
nyatla | 1:9f6a78395432 | 714 | */ |
nyatla | 1:9f6a78395432 | 715 | static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 716 | { |
nyatla | 1:9f6a78395432 | 717 | //先頭のスペース除外 |
nyatla | 1:9f6a78395432 | 718 | if(NyLPC_cStr_len(&(i_inst->_wsb))==0){ |
nyatla | 1:9f6a78395432 | 719 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 720 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし |
nyatla | 1:9f6a78395432 | 721 | }else{ |
nyatla | 1:9f6a78395432 | 722 | NyLPC_cStr_put(&(i_inst->_wsb),'C');//開始フラグ |
nyatla | 1:9f6a78395432 | 723 | } |
nyatla | 1:9f6a78395432 | 724 | } |
nyatla | 1:9f6a78395432 | 725 | //次のスペースがくるまで。 |
nyatla | 1:9f6a78395432 | 726 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 727 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 728 | //URLハンドラへ通知 |
nyatla | 48:00d211aac2ec | 729 | if(i_inst->_handler->urlHandler!=NULL){ |
nyatla | 48:00d211aac2ec | 730 | if(!i_inst->_handler->urlHandler(i_inst,0,o_out)){ |
nyatla | 48:00d211aac2ec | 731 | i_inst->_rcode=500; |
nyatla | 48:00d211aac2ec | 732 | NyLPC_OnErrorGoto(Error); |
nyatla | 48:00d211aac2ec | 733 | } |
nyatla | 1:9f6a78395432 | 734 | } |
nyatla | 1:9f6a78395432 | 735 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION; |
nyatla | 1:9f6a78395432 | 736 | } |
nyatla | 1:9f6a78395432 | 737 | //URLパーサへ通知 |
nyatla | 48:00d211aac2ec | 738 | if(i_inst->_handler->urlHandler!=NULL){ |
nyatla | 48:00d211aac2ec | 739 | if(!i_inst->_handler->urlHandler(i_inst,i_c,o_out)){ |
nyatla | 48:00d211aac2ec | 740 | i_inst->_rcode=500; |
nyatla | 48:00d211aac2ec | 741 | NyLPC_OnErrorGoto(Error); |
nyatla | 48:00d211aac2ec | 742 | } |
nyatla | 1:9f6a78395432 | 743 | } |
nyatla | 1:9f6a78395432 | 744 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし |
nyatla | 1:9f6a78395432 | 745 | Error: |
nyatla | 1:9f6a78395432 | 746 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 747 | } |
nyatla | 1:9f6a78395432 | 748 | |
nyatla | 1:9f6a78395432 | 749 | /** |
nyatla | 1:9f6a78395432 | 750 | Methodパーサ |
nyatla | 1:9f6a78395432 | 751 | [:HTTPMETHOD:]を得る。 |
nyatla | 1:9f6a78395432 | 752 | */ |
nyatla | 1:9f6a78395432 | 753 | static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out) |
nyatla | 1:9f6a78395432 | 754 | { |
nyatla | 1:9f6a78395432 | 755 | if(i_c==HTTP_SP){ |
nyatla | 1:9f6a78395432 | 756 | //SPがデリミタ |
nyatla | 1:9f6a78395432 | 757 | //HTTPステータスを試す。 |
nyatla | 1:9f6a78395432 | 758 | if(parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.res.version))){ |
nyatla | 1:9f6a78395432 | 759 | //これはHTTPステータス |
nyatla | 1:9f6a78395432 | 760 | o_out->type=NyLPC_THttpHeaderType_RESPONSE; |
nyatla | 1:9f6a78395432 | 761 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 762 | return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE; |
nyatla | 1:9f6a78395432 | 763 | } |
nyatla | 1:9f6a78395432 | 764 | //HTTPリクエストを試す。 |
nyatla | 1:9f6a78395432 | 765 | if(!parseRequestMethodStr(&(i_inst->_wsb),&(o_out->startline.req.method))){ |
nyatla | 1:9f6a78395432 | 766 | i_inst->_rcode=400; |
nyatla | 1:9f6a78395432 | 767 | NyLPC_OnErrorGoto(ERROR); |
nyatla | 1:9f6a78395432 | 768 | } |
nyatla | 1:9f6a78395432 | 769 | //これはHTTPリクエスト |
nyatla | 1:9f6a78395432 | 770 | o_out->type=NyLPC_THttpHeaderType_REQUEST; |
nyatla | 1:9f6a78395432 | 771 | NyLPC_cStr_clear(&(i_inst->_wsb)); |
nyatla | 1:9f6a78395432 | 772 | return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL; |
nyatla | 1:9f6a78395432 | 773 | } |
nyatla | 1:9f6a78395432 | 774 | if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){ |
nyatla | 1:9f6a78395432 | 775 | i_inst->_rcode=500; |
nyatla | 1:9f6a78395432 | 776 | NyLPC_OnErrorGoto(ERROR); |
nyatla | 1:9f6a78395432 | 777 | } |
nyatla | 1:9f6a78395432 | 778 | return NyLPC_TcHttpBasicHeaderParser_ST_START;//変化なし |
nyatla | 1:9f6a78395432 | 779 | ERROR: |
nyatla | 1:9f6a78395432 | 780 | return NyLPC_TcHttpBasicHeaderParser_ST_ERROR; |
nyatla | 1:9f6a78395432 | 781 | } |
nyatla | 1:9f6a78395432 | 782 | |
nyatla | 1:9f6a78395432 | 783 | |
nyatla | 1:9f6a78395432 | 784 | |
nyatla | 1:9f6a78395432 | 785 | |
nyatla | 1:9f6a78395432 | 786 | |
nyatla | 1:9f6a78395432 | 787 | static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out) |
nyatla | 1:9f6a78395432 | 788 | { |
nyatla | 1:9f6a78395432 | 789 | NyLPC_TChar* p; |
nyatla | 1:9f6a78395432 | 790 | char* e; |
nyatla | 1:9f6a78395432 | 791 | long ma,mi; |
nyatla | 1:9f6a78395432 | 792 | |
nyatla | 1:9f6a78395432 | 793 | p=NyLPC_cStr_str(i_str); |
nyatla | 1:9f6a78395432 | 794 | if(NyLPC_cStr_len(i_str)<6){ |
nyatla | 1:9f6a78395432 | 795 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 796 | } |
nyatla | 1:9f6a78395432 | 797 | if(strncmp(p,"HTTP/",5)!=0){ |
nyatla | 1:9f6a78395432 | 798 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 799 | } |
nyatla | 1:9f6a78395432 | 800 | p+=5; |
nyatla | 1:9f6a78395432 | 801 | ma=strtol(p,&e,10); |
nyatla | 1:9f6a78395432 | 802 | if(p==e){ |
nyatla | 1:9f6a78395432 | 803 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 804 | } |
nyatla | 1:9f6a78395432 | 805 | p=e;//.をチェック |
nyatla | 1:9f6a78395432 | 806 | if(*p!='.'){ |
nyatla | 1:9f6a78395432 | 807 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 808 | } |
nyatla | 1:9f6a78395432 | 809 | p++; |
nyatla | 1:9f6a78395432 | 810 | mi=strtoul(p,&e,10); |
nyatla | 1:9f6a78395432 | 811 | if(p==e){ |
nyatla | 1:9f6a78395432 | 812 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 813 | } |
nyatla | 1:9f6a78395432 | 814 | if(ma<0 ||mi<0){ |
nyatla | 1:9f6a78395432 | 815 | NyLPC_OnErrorGoto(Error); |
nyatla | 1:9f6a78395432 | 816 | } |
nyatla | 1:9f6a78395432 | 817 | switch(ma){ |
nyatla | 1:9f6a78395432 | 818 | case 0: |
nyatla | 1:9f6a78395432 | 819 | if(mi>=9){ |
nyatla | 1:9f6a78395432 | 820 | //HTTP0.9相当 |
nyatla | 1:9f6a78395432 | 821 | *o_out=NyLPC_THttpVersion_09; |
nyatla | 1:9f6a78395432 | 822 | } |
nyatla | 1:9f6a78395432 | 823 | break; |
nyatla | 1:9f6a78395432 | 824 | case 1: |
nyatla | 1:9f6a78395432 | 825 | if(mi==0){ |
nyatla | 1:9f6a78395432 | 826 | //HTTP1.0 |
nyatla | 1:9f6a78395432 | 827 | *o_out=NyLPC_THttpVersion_10; |
nyatla | 1:9f6a78395432 | 828 | }else if(mi>=1){ |
nyatla | 1:9f6a78395432 | 829 | //HTTP1.1 |
nyatla | 1:9f6a78395432 | 830 | *o_out=NyLPC_THttpVersion_11; |
nyatla | 1:9f6a78395432 | 831 | }else{ |
nyatla | 1:9f6a78395432 | 832 | *o_out=NyLPC_THttpVersion_UNKNOWN; |
nyatla | 1:9f6a78395432 | 833 | } |
nyatla | 1:9f6a78395432 | 834 | break; |
nyatla | 1:9f6a78395432 | 835 | default: |
nyatla | 1:9f6a78395432 | 836 | //お前など知らん |
nyatla | 1:9f6a78395432 | 837 | *o_out=NyLPC_THttpVersion_UNKNOWN; |
nyatla | 1:9f6a78395432 | 838 | break; |
nyatla | 1:9f6a78395432 | 839 | } |
nyatla | 1:9f6a78395432 | 840 | return NyLPC_TBool_TRUE;//変化なし |
nyatla | 1:9f6a78395432 | 841 | Error: |
nyatla | 1:9f6a78395432 | 842 | return NyLPC_TBool_FALSE; |
nyatla | 1:9f6a78395432 | 843 | } |
nyatla | 14:4618692ec239 | 844 |