This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Fork of libMiMic by Ryo Iizuka

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?

UserRevisionLine numberNew 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