Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of libMiMic by
NyLPC_cHttpBodyWriter.c
00001 /********************************************************************************* 00002 * PROJECT: MiMic 00003 * -------------------------------------------------------------------------------- 00004 * 00005 * This file is part of MiMic 00006 * Copyright (C)2011 Ryo Iizuka 00007 * 00008 * MiMic is free software: you can redistribute it and/or modify 00009 * it under the terms of the GNU Lesser General Public License as published 00010 * by the Free Software Foundation, either version 3 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public License 00019 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00020 * 00021 * For further information please contact. 00022 * http://nyatla.jp/ 00023 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp> 00024 * 00025 *********************************************************************************/ 00026 00027 00028 #include <stdlib.h> 00029 #include "NyLPC_utils.h" 00030 #include "NyLPC_cHttpBodyWriter.h" 00031 00032 00033 00034 00035 00036 00037 /** 00038 * PrintHandler 00039 */ 00040 static NyLPC_TBool printHandler(void* i_inst,const void* i_buf,NyLPC_TUInt32 i_len) 00041 { 00042 //エラー状態ならFALSE 00043 if(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error){ 00044 return NyLPC_TBool_FALSE; 00045 } 00046 ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_size_of_sent+=i_len; 00047 if(!NyLPC_iHttpPtrStream_write(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_ref_stream,i_buf,i_len)){ 00048 ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error=NyLPC_TUInt8_TRUE; 00049 return NyLPC_TBool_FALSE; 00050 } 00051 return NyLPC_TBool_TRUE; 00052 } 00053 00054 00055 00056 void NyLPC_cHttpBodyWriter_initialize(NyLPC_TcHttpBodyWriter_t* i_inst,NyLPC_TcHttpStream_t* i_stream) 00057 { 00058 i_inst->_ref_stream=&(i_stream->super); 00059 i_inst->_is_chunked=NyLPC_TUInt8_FALSE; 00060 i_inst->_is_error=NyLPC_TUInt8_FALSE; 00061 i_inst->_size_of_sent=0; 00062 i_inst->_content_length=0; 00063 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE); 00064 } 00065 00066 void NyLPC_cHttpBodyWriter_setChunked(NyLPC_TcHttpBodyWriter_t* i_inst) 00067 { 00068 i_inst->_is_chunked=NyLPC_TUInt8_TRUE; 00069 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_CHUNKED); 00070 } 00071 void NyLPC_cHttpBodyWriter_setContentLength(NyLPC_TcHttpBodyWriter_t* i_inst,NyLPC_TUInt32 i_content_length) 00072 { 00073 i_inst->_is_chunked=NyLPC_TUInt8_FALSE; 00074 i_inst->_content_length=i_content_length; 00075 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE); 00076 } 00077 00078 00079 /** 00080 * HttpBodyを書き込みます。 00081 * @return 00082 * 偽を返した場合は、コネクションを切断してください。 00083 */ 00084 NyLPC_TBool NyLPC_cHttpBodyWriter_write(NyLPC_TcHttpBodyWriter_t* i_inst,const void* i_buf,NyLPC_TUInt32 i_len) 00085 { 00086 return printHandler(i_inst,i_buf,i_len); 00087 } 00088 00089 /** 00090 * HttpBodyの書き込みを完了します。 00091 * @return 00092 */ 00093 NyLPC_TBool NyLPC_cHttpBodyWriter_close(NyLPC_TcHttpBodyWriter_t* i_inst) 00094 { 00095 //エラー状態ならFALSE 00096 if(i_inst->_is_error){ 00097 return NyLPC_TBool_FALSE; 00098 } 00099 //chunkedの場合、フッタを書き込む 00100 if(i_inst->_is_chunked){ 00101 //エンコーディングを戻す。 00102 NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE); 00103 //フッタを書き込む。 00104 if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"0\r\n\r\n",5)){ 00105 i_inst->_is_error=NyLPC_TUInt8_TRUE; 00106 return NyLPC_TBool_FALSE; 00107 } 00108 } 00109 //エラーでないときはストリームをフラッシュ 00110 NyLPC_iHttpPtrStream_flush(i_inst->_ref_stream); 00111 //クローズのステータスで状態を変える。 00112 return NyLPC_TBool_TRUE; 00113 } 00114 00115 /** 00116 * printfライクな書式出力を提供します。 00117 * @i_fmt 00118 * 書式文字列です。%d,%x,%s,%c,%%をサポートします。 00119 */ 00120 NyLPC_TBool NyLPC_cHttpBodyWriter_format(NyLPC_TcHttpBodyWriter_t* i_inst,const NyLPC_TChar* i_fmt,...) 00121 { 00122 NyLPC_TBool ret; 00123 va_list a; 00124 //エラー状態ならFALSE 00125 if(i_inst->_is_error){ 00126 return NyLPC_TBool_FALSE; 00127 } 00128 va_start(a,i_fmt); 00129 ret= NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,a); 00130 va_end(a); 00131 return ret; 00132 } 00133 00134 NyLPC_TBool NyLPC_cHttpBodyWriter_formatV(NyLPC_TcHttpBodyWriter_t* i_inst,const NyLPC_TChar* i_fmt,va_list i_args) 00135 { 00136 NyLPC_TBool ret; 00137 //エラー状態ならFALSE 00138 if(i_inst->_is_error){ 00139 return NyLPC_TBool_FALSE; 00140 } 00141 ret=NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,i_args); 00142 return ret; 00143 } 00144 00145 /** 00146 * テスト用のコード。 00147 */ 00148 #define TEST 00149 #ifndef TEST 00150 //テスト 00151 #include "NyLPC_cHttpHeaderWriter.h" 00152 00153 const char* TP1= 00154 "HTTP/0.9 200 OK\r\n" 00155 "HOST: 127.0.0.0.0.0.1\r\n" 00156 "CONTENt-LENGTH: 1285\r\n" 00157 "CONNECTION: CloSe\r\n" 00158 "ETAG: nyatla.jp\r\n" 00159 "ETAG: nyatla.jp\r\n" 00160 "Transfer-Encoding:chunked\r\n" 00161 "\r\n"; 00162 const char* TP2= 00163 "GET /nyanyanya!/nyoronnnnnnnnnnnn?m,fpeofjregnoegnr HTTP/1.1\r\n" 00164 "HOST: 127.0.0.0.0.0.1\r\n" 00165 "CONTENt-LENGTH: 1285\r\n" 00166 "CONNECTION: Keep\r\n" 00167 "ETAG: nyatla.jp\r\n" 00168 "ETAG: nyatla.jp\r\n" 00169 "\r\n"; 00170 const char* DT="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; 00171 00172 00173 00174 00175 00176 00177 void main() 00178 { 00179 NyLPC_TcHttpStream_t st; 00180 NyLPC_TcHttpBasicHeaderParser_t hp; 00181 struct NyLPC_THttpBasicHeader reqheader; 00182 NyLPC_TcHttpHeaderWriter_t hw; 00183 NyLPC_TcHttpBodyWriter_t bw; 00184 NyLPC_TcTcpSocket_t ts; 00185 int body_len; 00186 NyLPC_cTcpSocket_initialized(NULL,TP2,strlen(TP2)); 00187 00188 //TCPのオープン 00189 if(!NyLPC_cHttpStream_initialize(&st,&ts)){ 00190 //エラー 00191 } 00192 for(;;){ 00193 //ヘッダ解析 00194 NyLPC_cHttpBasicHeaderParser_initialize(&hp); 00195 if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,&st,&reqheader)){ 00196 //エラー 00197 puts("Error"); 00198 } 00199 //ヘッダの内容確認 00200 if(reqheader.type!=NyLPC_THttpHeaderType_REQUEST){ 00201 //BadRequest 00202 puts("Error"); 00203 } 00204 if(reqheader.startline.req.method!=NyLPC_THttpMethodType_GET){ 00205 //リクエストサポートしてない 00206 puts("Error"); 00207 } 00208 // 00209 NyLPC_cHttpHeaderWriter_initialize(&hw,&st,&reqheader); 00210 // NyLPC_cHttpResponseWriter_setClose(&hw); 00211 body_len=100; 00212 NyLPC_cHttpHeaderWriter_setContentLength(&hw,body_len); 00213 NyLPC_cHttpHeaderWriter_writeResponseHeader(&hw,500); 00214 NyLPC_cHttpHeaderWriter_close(&hw); 00215 00216 NyLPC_cHttpBodyWriter_initialize(&bw,&st); 00217 NyLPC_cHttpBodyWriter_setChunked(&bw); 00218 NyLPC_cHttpBodyWriter_write(&bw,"TEST",4); 00219 NyLPC_cHttpBodyWriter_printf(&bw,"TEST"); 00220 NyLPC_cHttpBodyWriter_printf(&bw,"TEST[%s][%d][%c],%%,[%x]","abcde",123,'s',0xff0011); 00221 NyLPC_cHttpBodyWriter_close(&bw); 00222 NyLPC_cHttpHttpWriter_finalize(&hw); 00223 } 00224 NyLPC_cHttpStream_finalize(&st); 00225 //TCPのクローズ 00226 return; 00227 } 00228 #endif
Generated on Tue Jul 12 2022 16:22:57 by
1.7.2
