This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Fork of libMiMic by
core/http/NyLPC_cHttpBodyWriter.c@115:fa79286d8ea4, 2017-02-24 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyatla | 1:9f6a78395432 | 1 | /********************************************************************************* |
nyatla | 1:9f6a78395432 | 2 | * PROJECT: MiMic |
nyatla | 1:9f6a78395432 | 3 | * -------------------------------------------------------------------------------- |
nyatla | 1:9f6a78395432 | 4 | * |
nyatla | 1:9f6a78395432 | 5 | * This file is part of MiMic |
nyatla | 1:9f6a78395432 | 6 | * Copyright (C)2011 Ryo Iizuka |
nyatla | 1:9f6a78395432 | 7 | * |
nyatla | 1:9f6a78395432 | 8 | * MiMic is free software: you can redistribute it and/or modify |
nyatla | 1:9f6a78395432 | 9 | * it under the terms of the GNU Lesser General Public License as published |
nyatla | 1:9f6a78395432 | 10 | * by the Free Software Foundation, either version 3 of the License, or |
nyatla | 1:9f6a78395432 | 11 | * (at your option) any later version. |
nyatla | 1:9f6a78395432 | 12 | * |
nyatla | 1:9f6a78395432 | 13 | * This program is distributed in the hope that it will be useful, |
nyatla | 1:9f6a78395432 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nyatla | 1:9f6a78395432 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nyatla | 1:9f6a78395432 | 16 | * GNU General Public License for more details. |
nyatla | 1:9f6a78395432 | 17 | * |
nyatla | 1:9f6a78395432 | 18 | * You should have received a copy of the GNU Lesser General Public License |
nyatla | 1:9f6a78395432 | 19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
nyatla | 1:9f6a78395432 | 20 | * |
nyatla | 1:9f6a78395432 | 21 | * For further information please contact. |
nyatla | 1:9f6a78395432 | 22 | * http://nyatla.jp/ |
nyatla | 1:9f6a78395432 | 23 | * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp> |
nyatla | 1:9f6a78395432 | 24 | * |
nyatla | 1:9f6a78395432 | 25 | *********************************************************************************/ |
nyatla | 1:9f6a78395432 | 26 | |
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 |