From fe846caaa5a0fbfa417fba266b6192ae4c13aec0 Mon Sep 17 00:00:00 2001 From: lishu Date: Wed, 5 Dec 2018 19:26:56 +0800 Subject: create http project --- src/HTTP_Common.c | 269 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/HTTP_Common.c (limited to 'src/HTTP_Common.c') diff --git a/src/HTTP_Common.c b/src/HTTP_Common.c new file mode 100644 index 0000000..e409477 --- /dev/null +++ b/src/HTTP_Common.c @@ -0,0 +1,269 @@ +#include +//#define _GNU_SOURCE +#include +#include +#include "HTTP_Common.h" +#include "HTTP_Message.h" + + +void http_freeBuf(int thread_seq, char **buf, uint32 *buflen) +{ + if(*buf!=NULL) + { + dictator_free(thread_seq,*buf); + *buf = NULL; + *buflen = 0; + } + return; +} + +char* double_memchr(const char* before, uint32 before_len, const char* this_data, uint32 this_len, char c) +{ + /*before only find last two char*/ + if(before_len>=1) + { + if(*(before+(before_len-1))==c) return (char*)(before+(before_len-1)); + } + if(before_len>=2) + { + if(*(before+(before_len-2))==c) return (char*)(before+(before_len-2)); + } + return (char*)memchr(this_data,c,this_len); +} + +/* +char* double_memchr(const char* before, uint32 before_len, const char* this_data, uint32 this_len, char c) +{ + char*pos=(char*)memchr(before,c,before_len); + if(pos!=NULL) + { + return pos; + } + pos=(char*)memchr(this_data,c,this_len); + return pos; +} +*/ +char* double_memread(const char*before,uint32 before_len,const char* this_data,uint32 this_len,const char*pos,uint32 offset) +{ + const char* v_target=pos+offset; + if((pos>=before&&pos=this_data&&pos=this_data&&p=before&&p='A'&&ch<='Z') return ch+'a'-'A'; + return ch; +} + +/********************************************************** + * 功能:去掉data前面的空行,空格,制表符。 + * offset:返回值,第一个不是空行,空格,制表符数据在当前数据的偏移量。 + * data:当前数据。 + * data_len:当前数据的长度。 +***********************************************************/ +void http_deleteEmptyRow(uint32 *offset, char* data, uint32 data_len) +{ + if(NULL==data||data_len==0) return; + while(*offset=0) + { + if(HTTP_CR!=*(data+(*offset)) && HTTP_NULL!=*(data+(*offset)) && HTTP_LF!=*(data+(*offset)) && HTTP_SP!=*(data+(*offset)) && HTTP_HT!=*(data+(*offset))) + break; + if(HTTP_CR==*(data+(*offset)) || HTTP_NULL==*(data+(*offset)) || HTTP_LF==*(data+(*offset)) || HTTP_SP==*(data+(*offset)) || HTTP_HT==*(data+(*offset))) + (*offset)++; + } +} + +void http_deleteEmptyRow_chunk(uint32 *offset, char* data, uint32 data_len) +{ + if(NULL==data||data_len==0) return; + while(*offset=0) + { + if(HTTP_CR!=*(data+(*offset)) && HTTP_LF!=*(data+(*offset))&& HTTP_SP!=*(data+(*offset)) && HTTP_HT!=*(data+(*offset)) && 0!=*(data+(*offset))) + break; + if(HTTP_CR==*(data+(*offset)) || HTTP_LF==*(data+(*offset))|| HTTP_SP==*(data+(*offset)) || HTTP_HT==*(data+(*offset)) || 0==*(data+(*offset))) + (*offset)++; + } + return; +} + +/********************************************************** + * 功能:删除data前面的折叠符。 + * offset:返回值,第一个不是空行,空格,制表符数据在当前数据的偏移量。 + * data:当前数据。 + * data_len:当前数据的长度。 +***********************************************************/ +void http_deleteSPHT(uint32 *offset, char* data, uint32 data_len) +{ + while(*offset=0) + { + if(HTTP_SP!=*(data+(*offset)) && HTTP_HT!=*(data+(*offset))) + break; + (*offset)++; + } +}/*http_deleteSPHTCRLFAtLast*/ + +/********************************************************** + * 功能:删除data后面的空格,空行,制表符。 + * del_data_len:删除后数据的长度。 + * data:当前数据。 + * data_len:当前数据的长度。 +***********************************************************/ +void http_deleteSPHTCRLFAtLast(uint32 *del_data_len, char* data, uint32 data_len) +{ + if(data==NULL||data_len==0) return ; + *del_data_len = data_len - 1; + if(0==*del_data_len) + { + if(HTTP_CR==*(data+*del_data_len) || HTTP_HT==*(data+*del_data_len) || + HTTP_SP==*(data+*del_data_len) || HTTP_LF==*(data+*del_data_len)) + return ; + } + while(*del_data_len>=0) + { + if(HTTP_CR!=*(data+*del_data_len) && HTTP_HT!=*(data+*del_data_len) && + HTTP_SP!=*(data+*del_data_len) && HTTP_LF!=*(data+*del_data_len)) + break; + if(HTTP_CR==*(data+*del_data_len) || HTTP_HT==*(data+*del_data_len) || + HTTP_SP==*(data+*del_data_len) || HTTP_LF==*(data+*del_data_len)) + (*del_data_len)--; + + if((*del_data_len)<=0) + break; + } + (*del_data_len)++; +} + +/********************************************************** + * 功能:寻找all_data缓存中CRLF的位置。 + * res:输出值,通过该参数判定是否读到\r\n + * all_data:已有数据缓存区。 + **********************************************************/ +char* http_findCRLF(char *all_data, uint32 len) +{ + if(NULL==all_data||0==len) return NULL; + char *s_cr=NULL; + s_cr=(char*)memchr(all_data,'\r',len); + /*读到\r*/ + if(NULL!=s_cr) + { + return s_cr; + } + /*没读到\r*/ + return NULL; +} + +char* http_findCRLF_Chunk(char *all_data, uint32 len, uint32* end_flag_size) +{ + if(all_data==NULL || len==0) return NULL; + + char *s_cr=NULL; + char *s_lf=NULL; + char *p_ret=NULL; + uint32 rf = 2; + s_cr=(char*)memchr(all_data, '\r',len); + s_lf=(char*)memmem(all_data, len, (void*)"\0\n", rf); + if(NULL!=s_cr && NULL!=s_lf) + { + p_ret = MIN(s_cr, s_lf); + *end_flag_size = (p_ret == s_cr)? 1:2; + } + else if(NULL == s_cr && NULL == s_lf) + { + } + else + { + p_ret = (s_lf != NULL)?s_lf:s_cr; + *end_flag_size = (s_lf != NULL)? 2:1; + } + return p_ret; +} + +void stringA_to_stringa(char* str, uint32 l_str) +{ + uint16 m =0; + for(m=0;m