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:
57:bc4330dfa62f
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
nyatla 1:9f6a78395432 27
nyatla 1:9f6a78395432 28 #include <stdlib.h>
nyatla 37:fc4b4fd6a649 29 #include "NyLPC_utils.h"
nyatla 1:9f6a78395432 30 #include "NyLPC_cHttpBodyWriter.h"
nyatla 1:9f6a78395432 31
nyatla 1:9f6a78395432 32
nyatla 1:9f6a78395432 33
nyatla 1:9f6a78395432 34
nyatla 1:9f6a78395432 35
nyatla 1:9f6a78395432 36
nyatla 37:fc4b4fd6a649 37 /**
nyatla 37:fc4b4fd6a649 38 * PrintHandler
nyatla 37:fc4b4fd6a649 39 */
nyatla 37:fc4b4fd6a649 40 static NyLPC_TBool printHandler(void* i_inst,const void* i_buf,NyLPC_TUInt32 i_len)
nyatla 37:fc4b4fd6a649 41 {
nyatla 37:fc4b4fd6a649 42 //エラー状態ならFALSE
nyatla 37:fc4b4fd6a649 43 if(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error){
nyatla 37:fc4b4fd6a649 44 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 45 }
nyatla 37:fc4b4fd6a649 46 ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_size_of_sent+=i_len;
nyatla 37:fc4b4fd6a649 47 if(!NyLPC_iHttpPtrStream_write(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_ref_stream,i_buf,i_len)){
nyatla 37:fc4b4fd6a649 48 ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error=NyLPC_TUInt8_TRUE;
nyatla 37:fc4b4fd6a649 49 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 50 }
nyatla 37:fc4b4fd6a649 51 return NyLPC_TBool_TRUE;
nyatla 37:fc4b4fd6a649 52 }
nyatla 37:fc4b4fd6a649 53
nyatla 1:9f6a78395432 54
nyatla 1:9f6a78395432 55
nyatla 1:9f6a78395432 56 void NyLPC_cHttpBodyWriter_initialize(NyLPC_TcHttpBodyWriter_t* i_inst,NyLPC_TcHttpStream_t* i_stream)
nyatla 1:9f6a78395432 57 {
nyatla 48:00d211aac2ec 58 i_inst->_ref_stream=&(i_stream->super);
nyatla 1:9f6a78395432 59 i_inst->_is_chunked=NyLPC_TUInt8_FALSE;
nyatla 1:9f6a78395432 60 i_inst->_is_error=NyLPC_TUInt8_FALSE;
nyatla 1:9f6a78395432 61 i_inst->_size_of_sent=0;
nyatla 2:b96c1e90d120 62 i_inst->_content_length=0;
nyatla 1:9f6a78395432 63 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE);
nyatla 1:9f6a78395432 64 }
nyatla 1:9f6a78395432 65
nyatla 1:9f6a78395432 66 void NyLPC_cHttpBodyWriter_setChunked(NyLPC_TcHttpBodyWriter_t* i_inst)
nyatla 1:9f6a78395432 67 {
nyatla 1:9f6a78395432 68 i_inst->_is_chunked=NyLPC_TUInt8_TRUE;
nyatla 1:9f6a78395432 69 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_CHUNKED);
nyatla 1:9f6a78395432 70 }
nyatla 2:b96c1e90d120 71 void NyLPC_cHttpBodyWriter_setContentLength(NyLPC_TcHttpBodyWriter_t* i_inst,NyLPC_TUInt32 i_content_length)
nyatla 2:b96c1e90d120 72 {
nyatla 2:b96c1e90d120 73 i_inst->_is_chunked=NyLPC_TUInt8_FALSE;
nyatla 2:b96c1e90d120 74 i_inst->_content_length=i_content_length;
nyatla 2:b96c1e90d120 75 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE);
nyatla 2:b96c1e90d120 76 }
nyatla 1:9f6a78395432 77
nyatla 1:9f6a78395432 78
nyatla 1:9f6a78395432 79 /**
nyatla 1:9f6a78395432 80 * HttpBodyを書き込みます。
nyatla 1:9f6a78395432 81 * @return
nyatla 1:9f6a78395432 82 * 偽を返した場合は、コネクションを切断してください。
nyatla 1:9f6a78395432 83 */
nyatla 1:9f6a78395432 84 NyLPC_TBool NyLPC_cHttpBodyWriter_write(NyLPC_TcHttpBodyWriter_t* i_inst,const void* i_buf,NyLPC_TUInt32 i_len)
nyatla 1:9f6a78395432 85 {
nyatla 37:fc4b4fd6a649 86 return printHandler(i_inst,i_buf,i_len);
nyatla 1:9f6a78395432 87 }
nyatla 37:fc4b4fd6a649 88
nyatla 1:9f6a78395432 89 /**
nyatla 1:9f6a78395432 90 * HttpBodyの書き込みを完了します。
nyatla 1:9f6a78395432 91 * @return
nyatla 1:9f6a78395432 92 */
nyatla 1:9f6a78395432 93 NyLPC_TBool NyLPC_cHttpBodyWriter_close(NyLPC_TcHttpBodyWriter_t* i_inst)
nyatla 1:9f6a78395432 94 {
nyatla 1:9f6a78395432 95 //エラー状態ならFALSE
nyatla 1:9f6a78395432 96 if(i_inst->_is_error){
nyatla 1:9f6a78395432 97 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 98 }
nyatla 1:9f6a78395432 99 //chunkedの場合、フッタを書き込む
nyatla 1:9f6a78395432 100 if(i_inst->_is_chunked){
nyatla 1:9f6a78395432 101 //エンコーディングを戻す。
nyatla 1:9f6a78395432 102 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE);
nyatla 1:9f6a78395432 103 //フッタを書き込む。
nyatla 1:9f6a78395432 104 if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"0\r\n\r\n",5)){
nyatla 1:9f6a78395432 105 i_inst->_is_error=NyLPC_TUInt8_TRUE;
nyatla 1:9f6a78395432 106 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 107 }
nyatla 1:9f6a78395432 108 }
nyatla 1:9f6a78395432 109 //エラーでないときはストリームをフラッシュ
nyatla 1:9f6a78395432 110 NyLPC_iHttpPtrStream_flush(i_inst->_ref_stream);
nyatla 1:9f6a78395432 111 //クローズのステータスで状態を変える。
nyatla 1:9f6a78395432 112 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 113 }
nyatla 1:9f6a78395432 114
nyatla 1:9f6a78395432 115 /**
nyatla 1:9f6a78395432 116 * printfライクな書式出力を提供します。
nyatla 1:9f6a78395432 117 * @i_fmt
nyatla 1:9f6a78395432 118 * 書式文字列です。%d,%x,%s,%c,%%をサポートします。
nyatla 1:9f6a78395432 119 */
nyatla 1:9f6a78395432 120 NyLPC_TBool NyLPC_cHttpBodyWriter_format(NyLPC_TcHttpBodyWriter_t* i_inst,const NyLPC_TChar* i_fmt,...)
nyatla 1:9f6a78395432 121 {
nyatla 1:9f6a78395432 122 NyLPC_TBool ret;
nyatla 1:9f6a78395432 123 va_list a;
nyatla 1:9f6a78395432 124 //エラー状態ならFALSE
nyatla 1:9f6a78395432 125 if(i_inst->_is_error){
nyatla 1:9f6a78395432 126 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 127 }
nyatla 1:9f6a78395432 128 va_start(a,i_fmt);
nyatla 37:fc4b4fd6a649 129 ret= NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,a);
nyatla 1:9f6a78395432 130 va_end(a);
nyatla 1:9f6a78395432 131 return ret;
nyatla 1:9f6a78395432 132 }
nyatla 1:9f6a78395432 133
nyatla 2:b96c1e90d120 134 NyLPC_TBool NyLPC_cHttpBodyWriter_formatV(NyLPC_TcHttpBodyWriter_t* i_inst,const NyLPC_TChar* i_fmt,va_list i_args)
nyatla 2:b96c1e90d120 135 {
nyatla 2:b96c1e90d120 136 NyLPC_TBool ret;
nyatla 2:b96c1e90d120 137 //エラー状態ならFALSE
nyatla 2:b96c1e90d120 138 if(i_inst->_is_error){
nyatla 2:b96c1e90d120 139 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 140 }
nyatla 37:fc4b4fd6a649 141 ret=NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,i_args);
nyatla 2:b96c1e90d120 142 return ret;
nyatla 2:b96c1e90d120 143 }
nyatla 2:b96c1e90d120 144
nyatla 1:9f6a78395432 145 /**
nyatla 1:9f6a78395432 146 * テスト用のコード。
nyatla 1:9f6a78395432 147 */
nyatla 1:9f6a78395432 148 #define TEST
nyatla 1:9f6a78395432 149 #ifndef TEST
nyatla 1:9f6a78395432 150 //テスト
nyatla 1:9f6a78395432 151 #include "NyLPC_cHttpHeaderWriter.h"
nyatla 1:9f6a78395432 152
nyatla 1:9f6a78395432 153 const char* TP1=
nyatla 1:9f6a78395432 154 "HTTP/0.9 200 OK\r\n"
nyatla 1:9f6a78395432 155 "HOST: 127.0.0.0.0.0.1\r\n"
nyatla 1:9f6a78395432 156 "CONTENt-LENGTH: 1285\r\n"
nyatla 1:9f6a78395432 157 "CONNECTION: CloSe\r\n"
nyatla 1:9f6a78395432 158 "ETAG: nyatla.jp\r\n"
nyatla 1:9f6a78395432 159 "ETAG: nyatla.jp\r\n"
nyatla 1:9f6a78395432 160 "Transfer-Encoding:chunked\r\n"
nyatla 1:9f6a78395432 161 "\r\n";
nyatla 1:9f6a78395432 162 const char* TP2=
nyatla 1:9f6a78395432 163 "GET /nyanyanya!/nyoronnnnnnnnnnnn?m,fpeofjregnoegnr HTTP/1.1\r\n"
nyatla 1:9f6a78395432 164 "HOST: 127.0.0.0.0.0.1\r\n"
nyatla 1:9f6a78395432 165 "CONTENt-LENGTH: 1285\r\n"
nyatla 1:9f6a78395432 166 "CONNECTION: Keep\r\n"
nyatla 1:9f6a78395432 167 "ETAG: nyatla.jp\r\n"
nyatla 1:9f6a78395432 168 "ETAG: nyatla.jp\r\n"
nyatla 1:9f6a78395432 169 "\r\n";
nyatla 1:9f6a78395432 170 const char* DT="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
nyatla 1:9f6a78395432 171
nyatla 1:9f6a78395432 172
nyatla 1:9f6a78395432 173
nyatla 1:9f6a78395432 174
nyatla 1:9f6a78395432 175
nyatla 1:9f6a78395432 176
nyatla 1:9f6a78395432 177 void main()
nyatla 1:9f6a78395432 178 {
nyatla 1:9f6a78395432 179 NyLPC_TcHttpStream_t st;
nyatla 1:9f6a78395432 180 NyLPC_TcHttpBasicHeaderParser_t hp;
nyatla 1:9f6a78395432 181 struct NyLPC_THttpBasicHeader reqheader;
nyatla 1:9f6a78395432 182 NyLPC_TcHttpHeaderWriter_t hw;
nyatla 1:9f6a78395432 183 NyLPC_TcHttpBodyWriter_t bw;
nyatla 1:9f6a78395432 184 NyLPC_TcTcpSocket_t ts;
nyatla 1:9f6a78395432 185 int body_len;
nyatla 1:9f6a78395432 186 NyLPC_cTcpSocket_initialized(NULL,TP2,strlen(TP2));
nyatla 1:9f6a78395432 187
nyatla 1:9f6a78395432 188 //TCPのオープン
nyatla 1:9f6a78395432 189 if(!NyLPC_cHttpStream_initialize(&st,&ts)){
nyatla 1:9f6a78395432 190 //エラー
nyatla 1:9f6a78395432 191 }
nyatla 1:9f6a78395432 192 for(;;){
nyatla 1:9f6a78395432 193 //ヘッダ解析
nyatla 1:9f6a78395432 194 NyLPC_cHttpBasicHeaderParser_initialize(&hp);
nyatla 1:9f6a78395432 195 if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,&st,&reqheader)){
nyatla 1:9f6a78395432 196 //エラー
nyatla 1:9f6a78395432 197 puts("Error");
nyatla 1:9f6a78395432 198 }
nyatla 1:9f6a78395432 199 //ヘッダの内容確認
nyatla 1:9f6a78395432 200 if(reqheader.type!=NyLPC_THttpHeaderType_REQUEST){
nyatla 1:9f6a78395432 201 //BadRequest
nyatla 1:9f6a78395432 202 puts("Error");
nyatla 1:9f6a78395432 203 }
nyatla 1:9f6a78395432 204 if(reqheader.startline.req.method!=NyLPC_THttpMethodType_GET){
nyatla 1:9f6a78395432 205 //リクエストサポートしてない
nyatla 1:9f6a78395432 206 puts("Error");
nyatla 1:9f6a78395432 207 }
nyatla 1:9f6a78395432 208 //
nyatla 1:9f6a78395432 209 NyLPC_cHttpHeaderWriter_initialize(&hw,&st,&reqheader);
nyatla 1:9f6a78395432 210 // NyLPC_cHttpResponseWriter_setClose(&hw);
nyatla 1:9f6a78395432 211 body_len=100;
nyatla 1:9f6a78395432 212 NyLPC_cHttpHeaderWriter_setContentLength(&hw,body_len);
nyatla 57:bc4330dfa62f 213 NyLPC_cHttpHeaderWriter_writeResponseHeader(&hw,500);
nyatla 1:9f6a78395432 214 NyLPC_cHttpHeaderWriter_close(&hw);
nyatla 1:9f6a78395432 215
nyatla 1:9f6a78395432 216 NyLPC_cHttpBodyWriter_initialize(&bw,&st);
nyatla 1:9f6a78395432 217 NyLPC_cHttpBodyWriter_setChunked(&bw);
nyatla 1:9f6a78395432 218 NyLPC_cHttpBodyWriter_write(&bw,"TEST",4);
nyatla 1:9f6a78395432 219 NyLPC_cHttpBodyWriter_printf(&bw,"TEST");
nyatla 1:9f6a78395432 220 NyLPC_cHttpBodyWriter_printf(&bw,"TEST[%s][%d][%c],%%,[%x]","abcde",123,'s',0xff0011);
nyatla 1:9f6a78395432 221 NyLPC_cHttpBodyWriter_close(&bw);
nyatla 1:9f6a78395432 222 NyLPC_cHttpHttpWriter_finalize(&hw);
nyatla 1:9f6a78395432 223 }
nyatla 1:9f6a78395432 224 NyLPC_cHttpStream_finalize(&st);
nyatla 1:9f6a78395432 225 //TCPのクローズ
nyatla 1:9f6a78395432 226 return;
nyatla 1:9f6a78395432 227 }
nyatla 37:fc4b4fd6a649 228 #endif