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

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Tue Jun 24 09:37:24 2014 +0000
Revision:
79:baa21f8763cf
Parent:
57:bc4330dfa62f
Child:
109:18f12ac01097
MiMic core r375???

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