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:
110:257739f9b31e
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 2:b96c1e90d120 1 #include "NyLPC_cHttpdConnection_protected.h"
nyatla 2:b96c1e90d120 2 #include "NyLPC_http.h"
nyatla 109:18f12ac01097 3 #include "NyLPC_netif.h"
nyatla 41:2389bd6b6f74 4 #include "NyLPC_cHttpdUtils.h"
nyatla 2:b96c1e90d120 5 #include "./NyLPC_cHttpd_protected.h"
nyatla 2:b96c1e90d120 6
nyatla 2:b96c1e90d120 7
nyatla 2:b96c1e90d120 8
nyatla 109:18f12ac01097 9 NyLPC_TBool NyLPC_cHttpdConnection_initialize(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TcHttpd_t* i_parent_httpd)
nyatla 2:b96c1e90d120 10 {
nyatla 110:257739f9b31e 11 i_inst->_socket=NyLPC_cNet_createTcpSocketEx(NyLPC_TSocketType_TCP_HTTP);
nyatla 109:18f12ac01097 12 if(i_inst->_socket==NULL){
nyatla 109:18f12ac01097 13 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 14 }
nyatla 2:b96c1e90d120 15 NyLPC_cHttpRequestPrefixParser_initialize(&(i_inst->_pparser));
nyatla 2:b96c1e90d120 16 i_inst->_parent_httpd=i_parent_httpd;
nyatla 2:b96c1e90d120 17 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_CLOSED;
nyatla 2:b96c1e90d120 18 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_LISTEN;
nyatla 109:18f12ac01097 19 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 20 }
nyatla 2:b96c1e90d120 21
nyatla 2:b96c1e90d120 22 void NyLPC_cHttpdConnection_finalize(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 23 {
nyatla 2:b96c1e90d120 24 NyLPC_cHttpdConnection_closeResponse(i_inst);
nyatla 2:b96c1e90d120 25 NyLPC_cHttpdConnection_closeSocket(i_inst);
nyatla 2:b96c1e90d120 26 NyLPC_cHttpRequestPrefixParser_finalize(i_inst);
nyatla 109:18f12ac01097 27 NyLPC_iTcpSocket_finalize(i_inst->_socket);
nyatla 2:b96c1e90d120 28 }
nyatla 2:b96c1e90d120 29
nyatla 2:b96c1e90d120 30 const NyLPC_TChar* NyLPC_cHttpdConnection_getUrlPrefix(const NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 31 {
nyatla 2:b96c1e90d120 32 return NyLPC_cHttpRequestPrefixParser_getUrlPrefix(&i_inst->_pparser);
nyatla 2:b96c1e90d120 33 }
nyatla 2:b96c1e90d120 34 void NyLPC_cHttpdConnection_setReqStatusParsed(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 35 {
nyatla 2:b96c1e90d120 36 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_END;
nyatla 2:b96c1e90d120 37 }
nyatla 2:b96c1e90d120 38
nyatla 2:b96c1e90d120 39 #define NyLPC_cHttpHeaderWriter_CONTENT_LENGTH_UNLIMITED 0xFFFFFFFF
nyatla 41:2389bd6b6f74 40
nyatla 41:2389bd6b6f74 41
nyatla 41:2389bd6b6f74 42 NyLPC_TBool NyLPC_cHttpdConnection_send100Continue(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 41:2389bd6b6f74 43 {
nyatla 41:2389bd6b6f74 44 //状態の確認
nyatla 41:2389bd6b6f74 45 if(i_inst->_res_status!=NyLPC_cHttpdConnection_ResStatus_HEAD)
nyatla 41:2389bd6b6f74 46 {
nyatla 41:2389bd6b6f74 47 NyLPC_OnErrorGoto(Error_Status);
nyatla 41:2389bd6b6f74 48 }
nyatla 41:2389bd6b6f74 49 //ステータスラインの記述
nyatla 48:00d211aac2ec 50 if(!NyLPC_iHttpPtrStream_write(&(i_inst->_in_stream.super),"HTTP/1.1 100 Continue\r\n\r\n",25)){
nyatla 41:2389bd6b6f74 51 NyLPC_OnErrorGoto(Error);
nyatla 41:2389bd6b6f74 52 }
nyatla 41:2389bd6b6f74 53 return NyLPC_TBool_TRUE;
nyatla 41:2389bd6b6f74 54 Error:
nyatla 41:2389bd6b6f74 55 Error_Status:
nyatla 41:2389bd6b6f74 56 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_ERROR;
nyatla 41:2389bd6b6f74 57 return NyLPC_TBool_FALSE;
nyatla 41:2389bd6b6f74 58 }
nyatla 41:2389bd6b6f74 59
nyatla 2:b96c1e90d120 60 /**
nyatla 2:b96c1e90d120 61 * レスポンスヘッダを送信します。
nyatla 2:b96c1e90d120 62 */
nyatla 2:b96c1e90d120 63 NyLPC_TBool NyLPC_cHttpdConnection_sendResponseHeader(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TUInt16 i_response_code,const NyLPC_TChar* i_content_type,const NyLPC_TChar* i_additional_header)
nyatla 2:b96c1e90d120 64 {
nyatla 2:b96c1e90d120 65 return NyLPC_cHttpdConnection_sendResponseHeader2(i_inst,i_response_code,i_content_type,NyLPC_cHttpHeaderWriter_CONTENT_LENGTH_UNLIMITED,i_additional_header);
nyatla 2:b96c1e90d120 66 }
nyatla 2:b96c1e90d120 67
nyatla 2:b96c1e90d120 68 NyLPC_TBool NyLPC_cHttpdConnection_sendResponseHeader2(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TUInt16 i_response_code,const NyLPC_TChar* i_content_type,NyLPC_TUInt32 i_content_length,const NyLPC_TChar* i_additional_header)
nyatla 2:b96c1e90d120 69 {
nyatla 2:b96c1e90d120 70 NyLPC_TcHttpHeaderWriter_t* h=&(i_inst->_head_writer);
nyatla 2:b96c1e90d120 71 //状態の確認
nyatla 2:b96c1e90d120 72 if(i_inst->_res_status!=NyLPC_cHttpdConnection_ResStatus_HEAD)
nyatla 2:b96c1e90d120 73 {
nyatla 2:b96c1e90d120 74 NyLPC_OnErrorGoto(Error_Status);
nyatla 2:b96c1e90d120 75 }
nyatla 2:b96c1e90d120 76 //ヘッダ送信
nyatla 48:00d211aac2ec 77 if(!NyLPC_cHttpHeaderWriter_initialize(h,&(i_inst->_in_stream.super),NULL)){
nyatla 2:b96c1e90d120 78 NyLPC_OnErrorGoto(ERROR_SEND);
nyatla 2:b96c1e90d120 79 }
nyatla 2:b96c1e90d120 80 //Headerの転送モードセット
nyatla 2:b96c1e90d120 81 if(i_content_length==NyLPC_cHttpHeaderWriter_CONTENT_LENGTH_UNLIMITED){
nyatla 2:b96c1e90d120 82 NyLPC_cHttpHeaderWriter_setChunked(h);
nyatla 2:b96c1e90d120 83 }else{
nyatla 2:b96c1e90d120 84 NyLPC_cHttpHeaderWriter_setContentLength(h,i_content_length);
nyatla 2:b96c1e90d120 85 }
nyatla 2:b96c1e90d120 86 //continueにセットされていたらcloseをFALSEに
nyatla 2:b96c1e90d120 87 NyLPC_cHttpHeaderWriter_setConnectionClose(h,(i_inst->_connection_message_mode!=NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE));
nyatla 2:b96c1e90d120 88
nyatla 57:bc4330dfa62f 89 if(!NyLPC_cHttpHeaderWriter_writeResponseHeader(h,i_response_code)){
nyatla 2:b96c1e90d120 90 NyLPC_OnErrorGoto(ERROR_SEND);
nyatla 2:b96c1e90d120 91 }
nyatla 2:b96c1e90d120 92 if(!NyLPC_cHttpHeaderWriter_writeMessage(h,"Content-type",i_content_type)){
nyatla 2:b96c1e90d120 93 NyLPC_OnErrorGoto(ERROR_SEND);
nyatla 2:b96c1e90d120 94 }
nyatla 2:b96c1e90d120 95 if(i_additional_header!=NULL){
nyatla 2:b96c1e90d120 96 if(!NyLPC_cHttpHeaderWriter_writeRawMessage(h,i_additional_header)){
nyatla 2:b96c1e90d120 97 NyLPC_OnErrorGoto(ERROR_SEND);
nyatla 2:b96c1e90d120 98 }
nyatla 2:b96c1e90d120 99 }
nyatla 2:b96c1e90d120 100 NyLPC_cHttpHeaderWriter_close(h);
nyatla 2:b96c1e90d120 101 NyLPC_cHttpHeaderWriter_finalize(h);
nyatla 2:b96c1e90d120 102 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_BODY;
nyatla 2:b96c1e90d120 103 //BodyWriter生成
nyatla 2:b96c1e90d120 104 NyLPC_cHttpBodyWriter_initialize(&(i_inst->_body_writer),&(i_inst->_in_stream));
nyatla 2:b96c1e90d120 105 //bodyのchunkedもセット
nyatla 2:b96c1e90d120 106 if(i_content_length==NyLPC_cHttpHeaderWriter_CONTENT_LENGTH_UNLIMITED){
nyatla 2:b96c1e90d120 107 NyLPC_cHttpBodyWriter_setChunked(&(i_inst->_body_writer));
nyatla 2:b96c1e90d120 108 }else{
nyatla 2:b96c1e90d120 109 NyLPC_cHttpBodyWriter_setContentLength(&(i_inst->_body_writer),i_content_length);
nyatla 2:b96c1e90d120 110 }
nyatla 2:b96c1e90d120 111 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 112 ERROR_SEND:
nyatla 2:b96c1e90d120 113 NyLPC_cHttpHeaderWriter_finalize(&(i_inst->_head_writer));
nyatla 2:b96c1e90d120 114 Error_Status:
nyatla 2:b96c1e90d120 115 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_ERROR;
nyatla 2:b96c1e90d120 116 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 117 }
nyatla 2:b96c1e90d120 118
nyatla 2:b96c1e90d120 119
nyatla 2:b96c1e90d120 120 /**
nyatla 2:b96c1e90d120 121 * レスポンスBodyを送信します。
nyatla 2:b96c1e90d120 122 * 関数を実行後、_res_statusはBODYかERRORに遷移します。
nyatla 2:b96c1e90d120 123 */
nyatla 2:b96c1e90d120 124 NyLPC_TBool NyLPC_cHttpdConnection_sendResponseBody(NyLPC_TcHttpdConnection_t* i_inst,const void* i_data,NyLPC_TUInt32 i_size)
nyatla 2:b96c1e90d120 125 {
nyatla 2:b96c1e90d120 126 if(i_inst->_res_status!=NyLPC_cHttpdConnection_ResStatus_BODY)
nyatla 2:b96c1e90d120 127 {
nyatla 2:b96c1e90d120 128 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 129 }
nyatla 2:b96c1e90d120 130 //Bodyの書込み
nyatla 2:b96c1e90d120 131 if(!NyLPC_cHttpBodyWriter_write(&(i_inst->_body_writer),i_data,i_size)){
nyatla 2:b96c1e90d120 132 NyLPC_OnErrorGoto(Error_Send);
nyatla 2:b96c1e90d120 133 }
nyatla 2:b96c1e90d120 134 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 135 Error_Send:
nyatla 2:b96c1e90d120 136 NyLPC_cHttpBodyWriter_finalize(&(i_inst->_in_stream));
nyatla 2:b96c1e90d120 137 Error:
nyatla 2:b96c1e90d120 138 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_ERROR;
nyatla 2:b96c1e90d120 139 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 140 }
nyatla 2:b96c1e90d120 141 /**
nyatla 2:b96c1e90d120 142 * レスポンスBodyを書式出力して送信します。
nyatla 2:b96c1e90d120 143 * 関数を実行後、_res_statusはBODYかERRORに遷移します。
nyatla 2:b96c1e90d120 144 */
nyatla 2:b96c1e90d120 145 NyLPC_TBool NyLPC_cHttpdConnection_sendResponseBodyF(NyLPC_TcHttpdConnection_t* i_inst,const char* i_fmt,...)
nyatla 2:b96c1e90d120 146 {
nyatla 2:b96c1e90d120 147 va_list a;
nyatla 2:b96c1e90d120 148 if(i_inst->_res_status!=NyLPC_cHttpdConnection_ResStatus_BODY)
nyatla 2:b96c1e90d120 149 {
nyatla 2:b96c1e90d120 150 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 151 }
nyatla 2:b96c1e90d120 152 //Bodyの書込み
nyatla 2:b96c1e90d120 153 va_start(a,i_fmt);
nyatla 2:b96c1e90d120 154 if(!NyLPC_cHttpBodyWriter_formatV(&(i_inst->_body_writer),i_fmt,a)){
nyatla 2:b96c1e90d120 155 NyLPC_OnErrorGoto(Error_Send);
nyatla 2:b96c1e90d120 156 }
nyatla 2:b96c1e90d120 157 va_end(a);
nyatla 2:b96c1e90d120 158 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 159 Error_Send:
nyatla 2:b96c1e90d120 160 va_end(a);
nyatla 2:b96c1e90d120 161 NyLPC_cHttpBodyWriter_finalize(&(i_inst->_in_stream));
nyatla 2:b96c1e90d120 162 Error:
nyatla 2:b96c1e90d120 163 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_ERROR;
nyatla 2:b96c1e90d120 164 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 165 }
nyatla 2:b96c1e90d120 166
nyatla 2:b96c1e90d120 167 /**
nyatla 2:b96c1e90d120 168 * ヘッダのみのErrorレスポンスを送信する。
nyatla 2:b96c1e90d120 169 * この関数はワーク用のHeaderWriterを使います。
nyatla 2:b96c1e90d120 170 */
nyatla 2:b96c1e90d120 171 static void sendErrorResponse(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TInt16 i_status)
nyatla 2:b96c1e90d120 172 {
nyatla 2:b96c1e90d120 173 NyLPC_TcHttpHeaderWriter_t* h=&(i_inst->_head_writer);
nyatla 48:00d211aac2ec 174 if(NyLPC_cHttpHeaderWriter_initialize(h,&i_inst->_in_stream.super,NULL)){
nyatla 2:b96c1e90d120 175 //ヘッダを送信
nyatla 2:b96c1e90d120 176 NyLPC_cHttpHeaderWriter_setConnectionClose(h,NyLPC_TBool_TRUE);
nyatla 57:bc4330dfa62f 177 NyLPC_cHttpHeaderWriter_writeResponseHeader(h,i_status);
nyatla 2:b96c1e90d120 178 NyLPC_cHttpHeaderWriter_close(h);
nyatla 2:b96c1e90d120 179 NyLPC_cHttpHeaderWriter_finalize(h);
nyatla 2:b96c1e90d120 180 }
nyatla 2:b96c1e90d120 181 }
nyatla 2:b96c1e90d120 182 /**
nyatla 2:b96c1e90d120 183 * 関数を実行後、_res_statusはCLOSEDかHEADかERRORに遷移する。
nyatla 2:b96c1e90d120 184 */
nyatla 2:b96c1e90d120 185 NyLPC_TBool NyLPC_cHttpdConnection_closeResponse(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 186 {
nyatla 2:b96c1e90d120 187 NyLPC_TcHttpBodyWriter_t* b;
nyatla 2:b96c1e90d120 188 switch(i_inst->_res_status){
nyatla 2:b96c1e90d120 189 case NyLPC_cHttpdConnection_ResStatus_CLOSED:
nyatla 2:b96c1e90d120 190 case NyLPC_cHttpdConnection_ResStatus_ERROR:
nyatla 2:b96c1e90d120 191 //何もせずにコネクションをクローズする。
nyatla 2:b96c1e90d120 192 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 193 case NyLPC_cHttpdConnection_ResStatus_HEAD:
nyatla 2:b96c1e90d120 194 //エラー500を送信してクローズする。
nyatla 2:b96c1e90d120 195 sendErrorResponse(i_inst,500);
nyatla 2:b96c1e90d120 196 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_CLOSED;
nyatla 2:b96c1e90d120 197 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 198 case NyLPC_cHttpdConnection_ResStatus_BODY:
nyatla 2:b96c1e90d120 199 //正常終了。BODYをクローズし、終了する。
nyatla 2:b96c1e90d120 200 b=&(i_inst->_body_writer);
nyatla 2:b96c1e90d120 201 NyLPC_cHttpBodyWriter_close(b);
nyatla 2:b96c1e90d120 202 NyLPC_cHttpBodyWriter_finalize(&b);
nyatla 2:b96c1e90d120 203 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_HEAD;
nyatla 2:b96c1e90d120 204 if(i_inst->_connection_message_mode!=NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE)
nyatla 2:b96c1e90d120 205 {
nyatla 2:b96c1e90d120 206 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_CLOSED;
nyatla 2:b96c1e90d120 207 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 208 }
nyatla 2:b96c1e90d120 209 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 210 default:
nyatla 2:b96c1e90d120 211 NyLPC_Abort();
nyatla 2:b96c1e90d120 212 }
nyatla 2:b96c1e90d120 213 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 214 }
nyatla 2:b96c1e90d120 215
nyatla 2:b96c1e90d120 216 /**
nyatla 2:b96c1e90d120 217 * コネクションのプリフェッチデータをヘッダパーサへpushします。
nyatla 2:b96c1e90d120 218 */
nyatla 2:b96c1e90d120 219 NyLPC_TBool NyLPC_cHttpdConnection_pushPrefetchInfo(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TcHttpBasicHeaderParser_t* i_header_parser,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 220 {
nyatla 14:4618692ec239 221 const char* method=NyLPC_THttpMethodType_toString(i_inst->_pparser.method);
nyatla 2:b96c1e90d120 222 if(NyLPC_cHttpBasicHeaderParser_parseChar(i_header_parser,method,strlen(method),o_out)<0){
nyatla 2:b96c1e90d120 223 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 224 }
nyatla 2:b96c1e90d120 225 if(NyLPC_cHttpBasicHeaderParser_parseChar(i_header_parser," ",1,o_out)<0){
nyatla 2:b96c1e90d120 226 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 227 }
nyatla 2:b96c1e90d120 228 if(NyLPC_cHttpBasicHeaderParser_parseChar(i_header_parser,i_inst->_pparser._url,strlen(i_inst->_pparser._url),o_out)<0){
nyatla 2:b96c1e90d120 229 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 230 }
nyatla 2:b96c1e90d120 231 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 232 Error:
nyatla 2:b96c1e90d120 233 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 234 }
nyatla 2:b96c1e90d120 235
nyatla 2:b96c1e90d120 236 #define NyLPC_cHttpdConnection_TIMEOUT_ACCEPT 3000
nyatla 2:b96c1e90d120 237 #define NyLPC_cHttpdConnection_TIMEOUT_CLOSE 5000
nyatla 2:b96c1e90d120 238 #define NyLPC_cHttpdConnection_TIMEOUT_LISTEN 5000
nyatla 2:b96c1e90d120 239
nyatla 2:b96c1e90d120 240
nyatla 2:b96c1e90d120 241 /**
nyatla 2:b96c1e90d120 242 * listenerでConnectionのソケットに接続を待ちます。
nyatla 2:b96c1e90d120 243 */
nyatla 109:18f12ac01097 244 NyLPC_TBool NyLPC_cHttpdConnection_listenSocket(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TiTcpListener_t* i_listener)
nyatla 2:b96c1e90d120 245 {
nyatla 2:b96c1e90d120 246 NyLPC_Assert(i_inst->_req_status==NyLPC_cHttpdConnection_ReqStatus_LISTEN);
nyatla 2:b96c1e90d120 247 //リスニング
nyatla 109:18f12ac01097 248 if(!NyLPC_iTcpListener_listen(i_listener,i_inst->_socket,NyLPC_cHttpdConnection_TIMEOUT_LISTEN)){
nyatla 2:b96c1e90d120 249 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 250 }
nyatla 2:b96c1e90d120 251 //成功したらステータス遷移
nyatla 2:b96c1e90d120 252 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_ACCEPT;
nyatla 2:b96c1e90d120 253 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 254 }
nyatla 2:b96c1e90d120 255
nyatla 2:b96c1e90d120 256 /**
nyatla 2:b96c1e90d120 257 * コネクションのソケットをacceptします。
nyatla 2:b96c1e90d120 258 */
nyatla 2:b96c1e90d120 259 NyLPC_TBool NyLPC_cHttpdConnection_acceptSocket(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 260 {
nyatla 2:b96c1e90d120 261 NyLPC_Assert(i_inst->_req_status==NyLPC_cHttpdConnection_ReqStatus_ACCEPT);
nyatla 41:2389bd6b6f74 262
nyatla 109:18f12ac01097 263 if(!NyLPC_iTcpSocket_accept(i_inst->_socket,NyLPC_cHttpdConnection_TIMEOUT_ACCEPT)){
nyatla 2:b96c1e90d120 264 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 265 }
nyatla 2:b96c1e90d120 266 //HttpStreamの生成
nyatla 109:18f12ac01097 267 if(!NyLPC_cHttpStream_initialize(&i_inst->_in_stream,i_inst->_socket)){
nyatla 2:b96c1e90d120 268 NyLPC_OnErrorGoto(Error_Connected);
nyatla 2:b96c1e90d120 269 }
nyatla 2:b96c1e90d120 270 //初回だけHEADに遷移
nyatla 2:b96c1e90d120 271 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_HEAD;
nyatla 2:b96c1e90d120 272 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_PREFETCH;
nyatla 43:a182f2b5ff41 273 i_inst->_connection_message_mode=NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE;
nyatla 2:b96c1e90d120 274 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 275 Error_Connected:
nyatla 109:18f12ac01097 276 NyLPC_iTcpSocket_close(i_inst->_socket,NyLPC_cHttpdConnection_TIMEOUT_CLOSE);
nyatla 2:b96c1e90d120 277 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_LISTEN;
nyatla 2:b96c1e90d120 278 Error:
nyatla 2:b96c1e90d120 279 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 280 }
nyatla 2:b96c1e90d120 281
nyatla 2:b96c1e90d120 282 NyLPC_TBool NyLPC_cHttpdConnection_prefetch(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 283 {
nyatla 2:b96c1e90d120 284 NyLPC_Assert(i_inst->_req_status==NyLPC_cHttpdConnection_ReqStatus_PREFETCH);
nyatla 2:b96c1e90d120 285
nyatla 2:b96c1e90d120 286 //Prefetchを実行
nyatla 48:00d211aac2ec 287 if(!NyLPC_cHttpRequestPrefixParser_parse(&i_inst->_pparser,&i_inst->_in_stream.super)){
nyatla 2:b96c1e90d120 288 //400エラー
nyatla 2:b96c1e90d120 289 sendErrorResponse(i_inst,400);
nyatla 2:b96c1e90d120 290 NyLPC_OnErrorGoto(Error_Prefetch);
nyatla 2:b96c1e90d120 291 }
nyatla 2:b96c1e90d120 292 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_REQPARSE;
nyatla 2:b96c1e90d120 293 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 294 Error_Prefetch:
nyatla 109:18f12ac01097 295 NyLPC_iTcpSocket_close(i_inst->_socket,NyLPC_cHttpdConnection_TIMEOUT_CLOSE);
nyatla 2:b96c1e90d120 296 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_LISTEN;
nyatla 2:b96c1e90d120 297 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 298 }
nyatla 2:b96c1e90d120 299
nyatla 2:b96c1e90d120 300
nyatla 2:b96c1e90d120 301
nyatla 2:b96c1e90d120 302
nyatla 2:b96c1e90d120 303
nyatla 2:b96c1e90d120 304
nyatla 2:b96c1e90d120 305
nyatla 2:b96c1e90d120 306 NyLPC_TBool NyLPC_cHttpdConnection_prevNextPrefetch(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 307 {
nyatla 2:b96c1e90d120 308 NyLPC_TcHttpNullRequestHeaderParser_t parser;
nyatla 2:b96c1e90d120 309 switch(i_inst->_req_status)
nyatla 2:b96c1e90d120 310 {
nyatla 2:b96c1e90d120 311 case NyLPC_cHttpdConnection_ReqStatus_REQPARSE:
nyatla 2:b96c1e90d120 312 //リクエストパース待ちなら前段のリクエストを吸収しておく。
nyatla 2:b96c1e90d120 313 NyLPC_cHttpNullRequestHeaderParser_initialize(&parser);
nyatla 2:b96c1e90d120 314 //プリフェッチしたデータを流す
nyatla 2:b96c1e90d120 315 NyLPC_cHttpNullRequestHeaderParser_parseInit(&parser);
nyatla 2:b96c1e90d120 316 NyLPC_cHttpNullRequestHeaderParser_parseChar(&parser,"GET ",4);//決め打ち
nyatla 2:b96c1e90d120 317 NyLPC_cHttpNullRequestHeaderParser_parseChar(&parser,i_inst->_pparser._url,strlen(i_inst->_pparser._url));
nyatla 2:b96c1e90d120 318 //後続をストリームから取り込む
nyatla 48:00d211aac2ec 319 if(NyLPC_cHttpNullRequestHeaderParser_parseStream(&parser,&(i_inst->_in_stream.super))){
nyatla 2:b96c1e90d120 320 if(NyLPC_cHttpNullRequestHeaderParser_parseFinish(&parser)){
nyatla 2:b96c1e90d120 321 NyLPC_cHttpNullRequestHeaderParser_finalize(&parser);
nyatla 2:b96c1e90d120 322 //OK:403
nyatla 2:b96c1e90d120 323 sendErrorResponse(i_inst,403);
nyatla 2:b96c1e90d120 324 break;//OK
nyatla 2:b96c1e90d120 325 }
nyatla 2:b96c1e90d120 326 }
nyatla 2:b96c1e90d120 327
nyatla 2:b96c1e90d120 328 NyLPC_cHttpNullRequestHeaderParser_finalize(&parser);
nyatla 2:b96c1e90d120 329 //NG:400 Bad Request
nyatla 2:b96c1e90d120 330 sendErrorResponse(i_inst,400);
nyatla 2:b96c1e90d120 331 return NyLPC_TBool_FALSE;//吸収失敗
nyatla 2:b96c1e90d120 332 case NyLPC_cHttpdConnection_ReqStatus_END:
nyatla 2:b96c1e90d120 333 //リクエストがパース済みならprefetchに戻す。
nyatla 2:b96c1e90d120 334 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_PREFETCH;
nyatla 2:b96c1e90d120 335 default:
nyatla 2:b96c1e90d120 336 NyLPC_Abort();
nyatla 2:b96c1e90d120 337 }
nyatla 2:b96c1e90d120 338 //吸収成功
nyatla 2:b96c1e90d120 339 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 340 }
nyatla 2:b96c1e90d120 341
nyatla 2:b96c1e90d120 342 void NyLPC_cHttpdConnection_closeSocket(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 343 {
nyatla 2:b96c1e90d120 344 switch(i_inst->_req_status)
nyatla 2:b96c1e90d120 345 {
nyatla 2:b96c1e90d120 346 case NyLPC_cHttpdConnection_ReqStatus_LISTEN:
nyatla 2:b96c1e90d120 347 //何も出来ない。
nyatla 2:b96c1e90d120 348 break;
nyatla 2:b96c1e90d120 349 case NyLPC_cHttpdConnection_ReqStatus_END:
nyatla 2:b96c1e90d120 350 case NyLPC_cHttpdConnection_ReqStatus_REQPARSE:
nyatla 2:b96c1e90d120 351 case NyLPC_cHttpdConnection_ReqStatus_PREFETCH:
nyatla 2:b96c1e90d120 352 NyLPC_cHttpStream_finalize(&i_inst->_in_stream);
nyatla 2:b96c1e90d120 353 case NyLPC_cHttpdConnection_ReqStatus_ACCEPT:
nyatla 109:18f12ac01097 354 NyLPC_iTcpSocket_close(i_inst->_socket,NyLPC_cHttpdConnection_TIMEOUT_CLOSE);
nyatla 2:b96c1e90d120 355 default:
nyatla 2:b96c1e90d120 356 break;
nyatla 2:b96c1e90d120 357 }
nyatla 2:b96c1e90d120 358 i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_LISTEN;
nyatla 2:b96c1e90d120 359 i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_CLOSED;
nyatla 2:b96c1e90d120 360 }
nyatla 2:b96c1e90d120 361
nyatla 2:b96c1e90d120 362 /**
nyatla 2:b96c1e90d120 363 * Httpd全体で唯一のロックを取得する。
nyatla 2:b96c1e90d120 364 */
nyatla 2:b96c1e90d120 365 void NyLPC_cHttpdConnection_lock(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 366 {
nyatla 2:b96c1e90d120 367 NyLPC_cHttpd_lock((NyLPC_TcHttpd_t*)(i_inst->_parent_httpd));
nyatla 2:b96c1e90d120 368 }
nyatla 2:b96c1e90d120 369 /**
nyatla 2:b96c1e90d120 370 * Httpd全体で唯一のロックを開放する。
nyatla 2:b96c1e90d120 371 */
nyatla 2:b96c1e90d120 372 void NyLPC_cHttpdConnection_unlock(NyLPC_TcHttpdConnection_t* i_inst)
nyatla 2:b96c1e90d120 373 {
nyatla 2:b96c1e90d120 374 NyLPC_cHttpd_unlock((NyLPC_TcHttpd_t*)(i_inst->_parent_httpd));
nyatla 41:2389bd6b6f74 375 }