summaryrefslogtreecommitdiff
path: root/src/HTTP_Common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/HTTP_Common.c')
-rw-r--r--src/HTTP_Common.c269
1 files changed, 269 insertions, 0 deletions
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 <stdio.h>
+//#define _GNU_SOURCE
+#include <string.h>
+#include <ctype.h>
+#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<before+before_len)||(pos>=this_data&&pos<this_data+this_len))
+ {
+ if(before<=v_target&&v_target<before+before_len)
+ {
+ return (char*)v_target;
+ }
+ if(this_data<=v_target&&v_target<this_data+this_len)
+ {
+ return (char*)v_target;
+ }
+ if(this_data<=(this_data+offset-(before+before_len-pos))&&(this_data+offset-(before+before_len-pos))<this_data+this_len)
+ {
+ return (char*)(this_data+offset-(before+before_len-pos));
+ }
+ }
+ return NULL;
+}
+
+uint32 double_mem_offset(const char*before,uint32 before_len,const char* this_data,uint32 this_len,const char* p)
+{
+ if(p>=this_data&&p<this_data+this_len)
+ {
+ return before_len+(p-this_data);
+ }
+ if(p>=before&&p<before+before_len)
+ {
+ return p-before;
+ }
+ return -1;
+}
+
+char A_to_a(char ch)
+{
+ if(ch>='A'&&ch<='Z') return ch+'a'-'A';
+ return ch;
+}
+
+/**********************************************************
+ * ���ܣ�ȥ��dataǰ��Ŀ��У��ո��Ʊ�����
+ * offset:����ֵ����һ�����ǿ��У��ո��Ʊ��������ڵ�ǰ���ݵ�ƫ������
+ * data����ǰ���ݡ�
+ * data_len:��ǰ���ݵij��ȡ�
+***********************************************************/
+void http_deleteEmptyRow(uint32 *offset, char* data, uint32 data_len)
+{
+ if(NULL==data||data_len==0) return;
+ while(*offset<data_len && *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<data_len && *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����ǰ���ݵij��ȡ�
+***********************************************************/
+void http_deleteSPHT(uint32 *offset, char* data, uint32 data_len)
+{
+ while(*offset<data_len && *offset>=0)
+ {
+ if(HTTP_SP!=*(data+(*offset)) && HTTP_HT!=*(data+(*offset)))
+ break;
+ (*offset)++;
+ }
+}/*http_deleteSPHTCRLFAtLast*/
+
+/**********************************************************
+ * ���ܣ�ɾ��data����Ŀո񣬿��У��Ʊ�����
+ * del_data_len��ɾ�������ݵij��ȡ�
+ * data����ǰ���ݡ�
+ * data_len����ǰ���ݵij��ȡ�
+***********************************************************/
+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<l_str;m++)
+ {
+ str[m] = A_to_a(str[m]);
+ }
+}
+
+/* this function is copy from other system. */
+char *memcasemem(const char *strsrc,int len1,const char *substr,int len2)
+{
+
+ char *p1,*p2,*pend;
+ char *p;
+ char *substrS;
+ int i,lenth;
+
+ if((strsrc==NULL)||substr==NULL)
+ return NULL;
+ if(len1<len2) return NULL;
+
+ lenth=len2;
+ substrS=(char *)malloc(sizeof(char)*(lenth+1));
+ if(substrS==NULL)
+ return NULL;
+ for(i=0;i<lenth;i++)
+ {
+ substrS[i]=tolower(*(substr+i));
+ }
+ substrS[lenth]=0;
+
+ lenth=len1;
+ pend =(char *)strsrc + lenth;
+ for(p1 =(char *) strsrc; p1 != pend;p1++)
+ {
+ for(p2 = p1,p = substrS;*p != '\0'&& p2 != pend;p++,p2++)
+ {
+ if(tolower(*p2) != *p)
+ break;
+ }
+ if(*p == '\0')
+ {
+ free(substrS);
+ return p1;
+ }
+ }
+
+ free(substrS);
+ return NULL;
+}
+
+long long rdtsc(void)
+{
+long long l;
+long long h;
+
+__asm__ volatile("rdtsc" : "=a"(l), "=d"(h));
+return (long long )l | ((long long )h<<32);
+}
+