enum
{
E_HTTP_CHUNCKED = 0x01,
E_HTTP_CONTENT_LEN = 0x02,
E_HTTP_VERSION = 0x04,
E_HTTP_HEADER_LEN = 0x08,
E_HTTP_COMPLETE = 0x10,
};
typedef struct {
int version; // 1.0, 1.1
int result; // 200,400
int header_length;
int content_length;
kal_uint32 status;
}HTTP_HEAD;
kal_bool mmi_parse_http_head( unsigned char *data, int len, HTTP_HEAD* header)
{
char *soc_data = (char *) data;
char *cmp;
int result;
kal_uint32 status = 0;
char *next_line;
const int HTTP_LINE_LENGTH = 2;
cmp = (char*)"HTTP/";
if(!memcmp(cmp,soc_data,strlen(cmp)) == 0)
return KAL_FALSE;
memset(header,0,sizeof(HTTP_HEAD));
if(sscanf(soc_data,"HTTP/%*[^ ] %d",&result ))
header->result =result;
else
header->result = 0;
status |=E_HTTP_VERSION;
sscanf(soc_data,"HTTP/1.%d",&result);
header->version = 10 + result;
next_line = strstr(soc_data,"\r\n");
while(1){
if(next_line ==NULL)
break;
soc_data = next_line + HTTP_LINE_LENGTH;
next_line = strstr(soc_data,"\r\n");
cmp = "Content-Length:";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
header->content_length = atoi(soc_data+strlen(cmp));
status |= E_HTTP_CONTENT_LEN;
continue;
}
cmp = "Transfer-Encoding:";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
status |= E_HTTP_CHUNCKED;
continue;
}
cmp = "\r\n";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
header->header_length = ((soc_data - (S8*)data ) + HTTP_LINE_LENGTH);
status |= E_HTTP_HEADER_LEN;
break;
}
}
if((status & E_HTTP_CONTENT_LEN) && (status&E_HTTP_HEADER_LEN) ){
if(header->header_length + header->content_length <= len)
status |= E_HTTP_COMPLETE;
}
else if(status &E_HTTP_CHUNCKED){
if(strcmp((S8*)data + len - 5, (S8*)"0\r\n\r\n") == 0) // last chunck
status |= E_HTTP_COMPLETE;
}
header->status = status;
return KAL_TRUE;
}
{
E_HTTP_CHUNCKED = 0x01,
E_HTTP_CONTENT_LEN = 0x02,
E_HTTP_VERSION = 0x04,
E_HTTP_HEADER_LEN = 0x08,
E_HTTP_COMPLETE = 0x10,
};
typedef struct {
int version; // 1.0, 1.1
int result; // 200,400
int header_length;
int content_length;
kal_uint32 status;
}HTTP_HEAD;
kal_bool mmi_parse_http_head( unsigned char *data, int len, HTTP_HEAD* header)
{
char *soc_data = (char *) data;
char *cmp;
int result;
kal_uint32 status = 0;
char *next_line;
const int HTTP_LINE_LENGTH = 2;
cmp = (char*)"HTTP/";
if(!memcmp(cmp,soc_data,strlen(cmp)) == 0)
return KAL_FALSE;
memset(header,0,sizeof(HTTP_HEAD));
if(sscanf(soc_data,"HTTP/%*[^ ] %d",&result ))
header->result =result;
else
header->result = 0;
status |=E_HTTP_VERSION;
sscanf(soc_data,"HTTP/1.%d",&result);
header->version = 10 + result;
next_line = strstr(soc_data,"\r\n");
while(1){
if(next_line ==NULL)
break;
soc_data = next_line + HTTP_LINE_LENGTH;
next_line = strstr(soc_data,"\r\n");
cmp = "Content-Length:";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
header->content_length = atoi(soc_data+strlen(cmp));
status |= E_HTTP_CONTENT_LEN;
continue;
}
cmp = "Transfer-Encoding:";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
status |= E_HTTP_CHUNCKED;
continue;
}
cmp = "\r\n";
if(app_strnicmp((char*)soc_data, (char*)cmp, strlen(cmp)) == 0){
header->header_length = ((soc_data - (S8*)data ) + HTTP_LINE_LENGTH);
status |= E_HTTP_HEADER_LEN;
break;
}
}
if((status & E_HTTP_CONTENT_LEN) && (status&E_HTTP_HEADER_LEN) ){
if(header->header_length + header->content_length <= len)
status |= E_HTTP_COMPLETE;
}
else if(status &E_HTTP_CHUNCKED){
if(strcmp((S8*)data + len - 5, (S8*)"0\r\n\r\n") == 0) // last chunck
status |= E_HTTP_COMPLETE;
}
header->status = status;
return KAL_TRUE;
}