* along with this program. If not, see <http://www.gnu.org/licenses/>.\r
*\r
* For further information please contact.\r
- * http://nyatla.jp/\r
- * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * http://nyatla.jp/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
*\r
*********************************************************************************/\r
#include <stdlib.h>\r
*/\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_initialize(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TiHttpPtrStream_t* i_ref_stream,const struct NyLPC_THttpBasicHeader* i_req_header)\r
{\r
- i_inst->_is_chunked=NyLPC_TUInt8_FALSE;\r
- i_inst->_content_length=0;\r
- i_inst->_ref_stream=i_ref_stream;\r
- i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
- //書込エンコーディングをなしにセット\r
- NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE);\r
- //必要に応じてリクエストの内容をパース\r
- if(i_req_header!=NULL){\r
- if(i_req_header->type!=NyLPC_THttpHeaderType_REQUEST){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //コネクションの持続性を決定\r
- if((i_req_header->connection==NyLPC_THttpMessgeHeader_Connection_CLOSE)||\r
- (i_req_header->startline.req.version!=NyLPC_THttpVersion_11))\r
- {\r
- i_inst->_is_close=NyLPC_TUInt8_TRUE;\r
- }else{\r
- i_inst->_is_close=NyLPC_TUInt8_FALSE;\r
- }\r
- }else{\r
- i_inst->_is_close=NyLPC_TUInt8_TRUE;\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ i_inst->_is_chunked=NyLPC_TUInt8_FALSE;\r
+ i_inst->_content_length=0;\r
+ i_inst->_ref_stream=i_ref_stream;\r
+ i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
+ //書込エンコーディングをなしにセット\r
+ NyLPC_iHttpPtrStream_setWriteEncoding(i_inst->_ref_stream,NyLPC_TiHttpPtrStream_ET_NONE);\r
+ //必要に応じてリクエストの内容をパース\r
+ if(i_req_header!=NULL){\r
+ if(i_req_header->type!=NyLPC_THttpHeaderType_REQUEST){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ //コネクションの持続性を決定\r
+ if((i_req_header->connection==NyLPC_THttpMessgeHeader_Connection_CLOSE)||\r
+ (i_req_header->startline.req.version!=NyLPC_THttpVersion_11))\r
+ {\r
+ i_inst->_is_close=NyLPC_TUInt8_TRUE;\r
+ }else{\r
+ i_inst->_is_close=NyLPC_TUInt8_FALSE;\r
+ }\r
+ }else{\r
+ i_inst->_is_close=NyLPC_TUInt8_TRUE;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
}\r
\r
#define NyLPC_cHttpHttpWriter_finalize(i)\r
\r
void NyLPC_cHttpHeaderWriter_setChunked(NyLPC_TcHttpHeaderWriter_t* i_inst)\r
{\r
- i_inst->_is_chunked=NyLPC_TUInt8_TRUE;\r
- return;\r
+ i_inst->_is_chunked=NyLPC_TUInt8_TRUE;\r
+ return;\r
}\r
void NyLPC_cHttpHeaderWriter_setContentLength(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TUInt32 i_content_length)\r
{\r
- i_inst->_content_length=i_content_length;\r
- return;\r
+ i_inst->_content_length=i_content_length;\r
+ return;\r
}\r
void NyLPC_cHttpHeaderWriter_setConnectionClose(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TBool i_is_close)\r
{\r
- i_inst->_is_close=i_is_close;\r
- return;\r
+ i_inst->_is_close=i_is_close;\r
+ return;\r
}\r
\r
\r
\r
const static struct{\r
- NyLPC_TUInt16 code;\r
- const NyLPC_TChar* message;\r
+ NyLPC_TUInt16 code;\r
+ const NyLPC_TChar* message;\r
}status_line_tbl[]={\r
- {200,"OK"},\r
- {301,"Moved Permanently"},\r
- {302,"Moved Temporarily"},\r
- {400,"Bad Request"},\r
- {403,"Forbidden"},\r
- {404,"Not Found"},\r
- {405,"Method Not Allowed"},\r
- {500,"Internal Server Error"},\r
- {0,NULL}//これ最後にしてね。\r
+ {200,"OK"},\r
+ {301,"Moved Permanently"},\r
+ {302,"Moved Temporarily"},\r
+ {400,"Bad Request"},\r
+ {403,"Forbidden"},\r
+ {404,"Not Found"},\r
+ {405,"Method Not Allowed"},\r
+ {500,"Internal Server Error"},\r
+ {0,NULL}//これ最後にしてね。\r
};\r
const static char* getStatusMessage(NyLPC_TUInt16 i_status)\r
{\r
- int i=0;\r
- while(status_line_tbl[i].code!=0){\r
- if(i_status==status_line_tbl[i].code){\r
- return status_line_tbl[i].message;\r
- }\r
- i++;\r
- }\r
- return NULL;\r
+ int i=0;\r
+ while(status_line_tbl[i].code!=0){\r
+ if(i_status==status_line_tbl[i].code){\r
+ return status_line_tbl[i].message;\r
+ }\r
+ i++;\r
+ }\r
+ return NULL;\r
}\r
\r
static NyLPC_TBool writeln(NyLPC_TiHttpPtrStream_t* i_inst,const void* i_data,NyLPC_TInt16 i_length)\r
{\r
- if(NyLPC_iHttpPtrStream_write(i_inst,i_data,i_length)){\r
- if(NyLPC_iHttpPtrStream_write(i_inst,"\r\n",2)){\r
- return NyLPC_TBool_TRUE;\r
- }\r
- }\r
- return NyLPC_TBool_FALSE;\r
+ if(NyLPC_iHttpPtrStream_write(i_inst,i_data,i_length)){\r
+ if(NyLPC_iHttpPtrStream_write(i_inst,"\r\n",2)){\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ }\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_writeRequestHeader(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_THttpMethodType i_method,const struct NyLPC_TIPv4Addr* i_host,NyLPC_TUInt16 i_port,const NyLPC_TChar* i_path)\r
{\r
- const NyLPC_TChar* t;\r
- NyLPC_TChar v[16];\r
- //エラー状態ならなにもしない。\r
- if(i_inst->_is_error){\r
- return NyLPC_TBool_FALSE;\r
- }\r
+ const NyLPC_TChar* t;\r
+ NyLPC_TChar v[16];\r
+ //エラー状態ならなにもしない。\r
+ if(i_inst->_is_error){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
\r
- t=NyLPC_THttpMethodType_toString(i_method);\r
- if(t==NULL){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //リクエストラインの記述\r
- //Method\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,t,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," ",1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- //Path\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_path,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," HTTP/1.1\r\n",11)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- //HOSTの記述\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Host: ",6)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- NyLPC_TIPv4Addr_toString(i_host,v);\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,v,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,":",1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- NyLPC_uitoa(i_port,v,10);\r
- if(!writeln(i_inst->_ref_stream,v,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
+ t=NyLPC_THttpMethodType_toString(i_method);\r
+ if(t==NULL){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ //リクエストラインの記述\r
+ //Method\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,t,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," ",1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ //Path\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_path,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," HTTP/1.1\r\n",11)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ //HOSTの記述\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Host: ",6)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ NyLPC_TIPv4Addr_toString(i_host,v);\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,v,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,":",1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ NyLPC_uitoa(i_port,v,10);\r
+ if(!writeln(i_inst->_ref_stream,v,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
\r
- //close\r
- if(i_inst->_is_close){\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Connection: CLOSE\r\n",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }\r
+ //close\r
+ if(i_inst->_is_close){\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Connection: CLOSE\r\n",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }\r
\r
- //chunked\r
- if(i_inst->_is_chunked){\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Transfer-Encoding: chunked\r\n",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }else{\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Content-Length: ",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- NyLPC_uitoa(i_inst->_content_length,v,10);\r
- if(!writeln(i_inst->_ref_stream,v,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }\r
- //送信サイズをリセット\r
- i_inst->_size_of_sent=0;\r
- return NyLPC_TBool_TRUE;\r
+ //chunked\r
+ if(i_inst->_is_chunked){\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Transfer-Encoding: chunked\r\n",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }else{\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Content-Length: ",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ NyLPC_uitoa(i_inst->_content_length,v,10);\r
+ if(!writeln(i_inst->_ref_stream,v,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }\r
+ //送信サイズをリセット\r
+ i_inst->_size_of_sent=0;\r
+ return NyLPC_TBool_TRUE;\r
Error:\r
- i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
- return NyLPC_TBool_FALSE;\r
+ i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
+ return NyLPC_TBool_FALSE;\r
\r
}\r
\r
*/\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_writeResponseHeader(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TUInt16 i_status)\r
{\r
- NyLPC_TChar v[12];\r
- const char* m=getStatusMessage(i_status);\r
- //エラー状態ならなにもしない。\r
- if(i_inst->_is_error){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //検索に失敗したら500番に変更\r
- if(m==NULL){\r
- i_status=500;\r
- m=getStatusMessage(500);\r
- }\r
- //ステータスラインの記述\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"HTTP/1.1 ",9)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- NyLPC_itoa(i_status,v,10);\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,v,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," ",1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!writeln(i_inst->_ref_stream,m,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Server: " NyLPC_cHttpdConfig_SERVER "\r\n",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(i_inst->_is_close){\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Connection: CLOSE\r\n",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }\r
- //ヘッダの記述\r
- if(i_inst->_is_chunked){\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Transfer-Encoding: chunked\r\n",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }else{\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Content-Length: ",-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- NyLPC_uitoa(i_inst->_content_length,v,10);\r
- if(!writeln(i_inst->_ref_stream,v,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- }\r
- //送信サイズをリセット\r
- i_inst->_size_of_sent=0;\r
- return NyLPC_TBool_TRUE;\r
+ NyLPC_TChar v[12];\r
+ const char* m=getStatusMessage(i_status);\r
+ //エラー状態ならなにもしない。\r
+ if(i_inst->_is_error){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ //検索に失敗したら500番に変更\r
+ if(m==NULL){\r
+ i_status=500;\r
+ m=getStatusMessage(500);\r
+ }\r
+ //ステータスラインの記述\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"HTTP/1.1 ",9)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ NyLPC_itoa(i_status,v,10);\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,v,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream," ",1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!writeln(i_inst->_ref_stream,m,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Server: " NyLPC_cHttpdConfig_SERVER "\r\n",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(i_inst->_is_close){\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Connection: CLOSE\r\n",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }\r
+ //ヘッダの記述\r
+ if(i_inst->_is_chunked){\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Transfer-Encoding: chunked\r\n",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }else{\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"Content-Length: ",-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ NyLPC_uitoa(i_inst->_content_length,v,10);\r
+ if(!writeln(i_inst->_ref_stream,v,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ }\r
+ //送信サイズをリセット\r
+ i_inst->_size_of_sent=0;\r
+ return NyLPC_TBool_TRUE;\r
Error:\r
- i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
- return NyLPC_TBool_FALSE;\r
+ i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
/**\r
*/\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_writeMessage(NyLPC_TcHttpHeaderWriter_t* i_inst,const NyLPC_TChar* i_name,const NyLPC_TChar* i_field)\r
{\r
- //エラー状態ならなにもしない。\r
- if(i_inst->_is_error){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_name,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,": ",2)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- if(!writeln(i_inst->_ref_stream,i_field,-1)){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ //エラー状態ならなにもしない。\r
+ if(i_inst->_is_error){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_name,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,": ",2)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(!writeln(i_inst->_ref_stream,i_field,-1)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
Error:\r
- i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
- return NyLPC_TBool_FALSE;\r
+ i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_writeRawMessage(NyLPC_TcHttpHeaderWriter_t* i_inst,const NyLPC_TChar* i_additional_header)\r
{\r
- //エラー状態ならなにもしない。\r
- if(i_inst->_is_error){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_additional_header,strlen(i_additional_header))){\r
- NyLPC_OnErrorGoto(Error);\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ //エラー状態ならなにもしない。\r
+ if(i_inst->_is_error){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_additional_header,strlen(i_additional_header))){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
Error:\r
- i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
- return NyLPC_TBool_FALSE;\r
+ i_inst->_is_error=NyLPC_TUInt8_FALSE;\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
/**\r
*/\r
NyLPC_TBool NyLPC_cHttpHeaderWriter_close(NyLPC_TcHttpHeaderWriter_t* i_inst)\r
{\r
- //エラー状態ならなにもしない。\r
- if(i_inst->_is_error){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- if(NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"\r\n",2)){\r
- if( NyLPC_iHttpPtrStream_flush(i_inst->_ref_stream)){\r
- return NyLPC_TBool_TRUE;\r
- }\r
- }\r
- return NyLPC_TBool_FALSE;\r
+ //エラー状態ならなにもしない。\r
+ if(i_inst->_is_error){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ if(NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,"\r\n",2)){\r
+ if( NyLPC_iHttpPtrStream_flush(i_inst->_ref_stream)){\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ }\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r