1*76404edcSAsim Jamshed #include <stdio.h>
2*76404edcSAsim Jamshed #include <stdlib.h>
3*76404edcSAsim Jamshed #include <ctype.h>
4*76404edcSAsim Jamshed #define _GNU_SOURCE
5*76404edcSAsim Jamshed #include <string.h>
6*76404edcSAsim Jamshed #include <errno.h>
7*76404edcSAsim Jamshed #include "http_parsing.h"
8*76404edcSAsim Jamshed #include "tdate_parse.h"
9*76404edcSAsim Jamshed 
10*76404edcSAsim Jamshed #define SPACE_OR_TAB(x)  ((x) == ' '  || (x) == '\t')
11*76404edcSAsim Jamshed #define CR_OR_NEWLINE(x) ((x) == '\r' || (x) == '\n')
12*76404edcSAsim Jamshed 
13*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
14*76404edcSAsim Jamshed int
find_http_header(char * data,int len)15*76404edcSAsim Jamshed find_http_header(char *data, int len)
16*76404edcSAsim Jamshed {
17*76404edcSAsim Jamshed 	char *temp = data;
18*76404edcSAsim Jamshed 	int hdr_len = 0;
19*76404edcSAsim Jamshed 	char ch = data[len]; /* remember it */
20*76404edcSAsim Jamshed 
21*76404edcSAsim Jamshed 	/* null terminate the string first */
22*76404edcSAsim Jamshed 	data[len] = 0;
23*76404edcSAsim Jamshed 	while (!hdr_len && (temp = strchr(temp, '\n')) != NULL) {
24*76404edcSAsim Jamshed 		temp++;
25*76404edcSAsim Jamshed 		if (*temp == '\n')
26*76404edcSAsim Jamshed 			hdr_len = temp - data + 1;
27*76404edcSAsim Jamshed 		else if (len > 0 && *temp == '\r' && *(temp + 1) == '\n')
28*76404edcSAsim Jamshed 			hdr_len = temp - data + 2;
29*76404edcSAsim Jamshed 	}
30*76404edcSAsim Jamshed 	data[len] = ch; /* put it back */
31*76404edcSAsim Jamshed 
32*76404edcSAsim Jamshed 	/* terminate the header if found */
33*76404edcSAsim Jamshed 	if (hdr_len)
34*76404edcSAsim Jamshed 		data[hdr_len-1] = 0;
35*76404edcSAsim Jamshed 
36*76404edcSAsim Jamshed 	return hdr_len;
37*76404edcSAsim Jamshed }
38*76404edcSAsim Jamshed /*--------------------------------------------------------------------------*/
39*76404edcSAsim Jamshed char *
http_header_str_val(const char * buf,const char * key,const int keylen,char * value,int value_len)40*76404edcSAsim Jamshed http_header_str_val(const char* buf, const char *key, const int keylen,
41*76404edcSAsim Jamshed 		    char* value, int value_len)
42*76404edcSAsim Jamshed {
43*76404edcSAsim Jamshed 	char *temp = (char *) buf;  /* temporarily de-const buf */
44*76404edcSAsim Jamshed 	int i = 0;
45*76404edcSAsim Jamshed 
46*76404edcSAsim Jamshed 	/* find the header field */
47*76404edcSAsim Jamshed 	while (*temp && (temp = strchr(temp, '\n'))) {
48*76404edcSAsim Jamshed 		temp++; /* advance to the next line */
49*76404edcSAsim Jamshed 		if (!strncasecmp(temp, key, keylen))
50*76404edcSAsim Jamshed 			break;
51*76404edcSAsim Jamshed 	}
52*76404edcSAsim Jamshed 	if (temp == NULL || *temp == '\0') {
53*76404edcSAsim Jamshed 		*value = 0;
54*76404edcSAsim Jamshed 		return NULL;
55*76404edcSAsim Jamshed 	}
56*76404edcSAsim Jamshed 
57*76404edcSAsim Jamshed 	/* skip whitespace or tab */
58*76404edcSAsim Jamshed 	temp += keylen;
59*76404edcSAsim Jamshed 	while (*temp && SPACE_OR_TAB(*temp))
60*76404edcSAsim Jamshed 		temp++;
61*76404edcSAsim Jamshed 
62*76404edcSAsim Jamshed 	/* if we reached the end of the line, forget it */
63*76404edcSAsim Jamshed 	if (*temp == '\0' || CR_OR_NEWLINE(*temp)) {
64*76404edcSAsim Jamshed 		*value = 0;
65*76404edcSAsim Jamshed 		return NULL;
66*76404edcSAsim Jamshed 	}
67*76404edcSAsim Jamshed 
68*76404edcSAsim Jamshed 	/* copy value data */
69*76404edcSAsim Jamshed 	while (*temp && !CR_OR_NEWLINE(*temp) && i < value_len-1)
70*76404edcSAsim Jamshed 		value[i++] = *temp++;
71*76404edcSAsim Jamshed 	value[i] = 0;
72*76404edcSAsim Jamshed 	return (i == 0) ? NULL : value;
73*76404edcSAsim Jamshed }
74*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
75*76404edcSAsim Jamshed long int
http_header_long_val(const char * response,const char * key,int key_len)76*76404edcSAsim Jamshed http_header_long_val(const char * response, const char* key, int key_len)
77*76404edcSAsim Jamshed {
78*76404edcSAsim Jamshed #define C_TYPE_LEN 50
79*76404edcSAsim Jamshed 	long int len;
80*76404edcSAsim Jamshed 	char value[C_TYPE_LEN];
81*76404edcSAsim Jamshed 	char *temp = http_header_str_val(response, key, key_len, value, C_TYPE_LEN);
82*76404edcSAsim Jamshed 
83*76404edcSAsim Jamshed 	if (temp == NULL)
84*76404edcSAsim Jamshed 		return -1;
85*76404edcSAsim Jamshed 
86*76404edcSAsim Jamshed 	len = strtol(temp, NULL, 10);
87*76404edcSAsim Jamshed 	if (errno == EINVAL || errno == ERANGE)
88*76404edcSAsim Jamshed 		return -1;
89*76404edcSAsim Jamshed 
90*76404edcSAsim Jamshed 	return len;
91*76404edcSAsim Jamshed }
92*76404edcSAsim Jamshed /*--------------------------------------------------------------------------*/
93*76404edcSAsim Jamshed char*
http_get_url(char * data,int data_len,char * value,int value_len)94*76404edcSAsim Jamshed http_get_url(char * data, int data_len, char* value, int value_len)
95*76404edcSAsim Jamshed {
96*76404edcSAsim Jamshed 	char *ret = data;
97*76404edcSAsim Jamshed 	char *temp;
98*76404edcSAsim Jamshed 	int i = 0;
99*76404edcSAsim Jamshed 
100*76404edcSAsim Jamshed 	if (strncmp(data, HTTP_GET, sizeof(HTTP_GET)-1)) {
101*76404edcSAsim Jamshed 		*value = 0;
102*76404edcSAsim Jamshed 		return NULL;
103*76404edcSAsim Jamshed 	}
104*76404edcSAsim Jamshed 
105*76404edcSAsim Jamshed 	ret += sizeof(HTTP_GET);
106*76404edcSAsim Jamshed 	while (*ret && SPACE_OR_TAB(*ret))
107*76404edcSAsim Jamshed 		ret++;
108*76404edcSAsim Jamshed 
109*76404edcSAsim Jamshed 	temp = ret;
110*76404edcSAsim Jamshed 	while (*temp && *temp != ' ' && i < value_len - 1) {
111*76404edcSAsim Jamshed 		value[i++] = *temp++;
112*76404edcSAsim Jamshed 	}
113*76404edcSAsim Jamshed 	value[i] = 0;
114*76404edcSAsim Jamshed 
115*76404edcSAsim Jamshed 	return ret;
116*76404edcSAsim Jamshed }
117*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
118*76404edcSAsim Jamshed 
119