annotate http.c @ 876:1f26877717f1

*** empty log message ***
author gabucino
date Fri, 25 May 2001 17:04:11 +0000
parents f641c96e431b
children ede5785faa53
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
870
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
1 #include <stdio.h>
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
2 #include <stdlib.h>
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
3 #include <string.h>
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
4
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
5 #include "http.h"
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
6
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
7 HTTP_header_t *
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
8 http_new_header() {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
9 HTTP_header_t *http_hdr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
10
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
11 http_hdr = (HTTP_header_t*)malloc(sizeof(HTTP_header_t));
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
12 if( http_hdr==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
13 memset( http_hdr, 0, sizeof(HTTP_header_t) );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
14
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
15 return http_hdr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
16 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
17
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
18 void
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
19 http_free( HTTP_header_t *http_hdr ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
20 int i;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
21 if( http_hdr==NULL ) return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
22 if( http_hdr->protocol!=NULL ) free( http_hdr->protocol );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
23 if( http_hdr->method!=NULL ) free( http_hdr->method );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
24 if( http_hdr->uri!=NULL ) free( http_hdr->uri );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
25 if( http_hdr->reason_phrase!=NULL ) free( http_hdr->reason_phrase );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
26 if( http_hdr->body!=NULL ) free( http_hdr->body );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
27 if( http_hdr->field_search!=NULL ) free( http_hdr->field_search );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
28 for( i=0 ; i<http_hdr->field_nb ; i++ )
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
29 if( http_hdr->fields[i]!=NULL ) free( http_hdr->fields[i] );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
30 free( http_hdr );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
31 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
32
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
33 HTTP_header_t *
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
34 http_new_response( char *response, int length ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
35 HTTP_header_t *http_hdr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
36 char *hdr_ptr, *ptr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
37 char *field=NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
38 int pos_hdr_sep, len;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
39 if( response==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
40
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
41 http_hdr = http_new_header();
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
42 if( http_hdr==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
43
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
44 // Get the protocol
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
45 hdr_ptr = strstr( response, " " );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
46 if( hdr_ptr==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
47 printf("Malformed answer\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
48 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
49 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
50 len = hdr_ptr-response;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
51 http_hdr->protocol = (char*)malloc(len+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
52 if( http_hdr->protocol==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
53 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
54 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
55 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
56 strncpy( http_hdr->protocol, response, len );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
57 http_hdr->protocol[len+1]='\0';
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
58 if( !strncasecmp( http_hdr->protocol, "HTTP", 4) ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
59 if( sscanf( http_hdr->protocol+5,"1.%d", &(http_hdr->http_minor_version) )!=1 ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
60 printf("Malformed answer\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
61 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
62 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
63 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
64
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
65 // Get the status code
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
66 if( sscanf( ++hdr_ptr, "%d", &(http_hdr->status_code) )!=1 ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
67 printf("Malformed answer\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
68 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
69 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
70 hdr_ptr += 4;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
71
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
72 // Get the reason phrase
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
73 ptr = strstr( hdr_ptr, "\r\n" );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
74 if( hdr_ptr==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
75 printf("Malformed answer\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
76 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
77 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
78 len = ptr-hdr_ptr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
79 http_hdr->reason_phrase = (char*)malloc(len+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
80 if( http_hdr->reason_phrase==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
81 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
82 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
83 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
84 strncpy( http_hdr->reason_phrase, hdr_ptr, len );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
85 http_hdr->reason_phrase[len]='\0';
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
86
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
87 // Set the position of the header separator: \r\n\r\n
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
88 ptr = strstr(response, "\r\n\r\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
89 if( ptr==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
90 printf("Malformed answer\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
91 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
92 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
93 pos_hdr_sep = ptr-response;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
94
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
95 hdr_ptr = strstr( response, "\r\n" )+2;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
96 do {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
97 ptr = strstr( hdr_ptr, "\r\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
98 if( ptr==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
99 printf("No CRLF found\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
100 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
101 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
102 len = ptr-hdr_ptr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
103 field = (char*)realloc(field, len+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
104 if( field==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
105 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
106 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
107 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
108 strncpy( field, hdr_ptr, len );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
109 field[len]='\0';
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
110 http_set_field( http_hdr, field );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
111 hdr_ptr = ptr+2;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
112 } while( hdr_ptr<(response+pos_hdr_sep) );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
113
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
114 if( field!=NULL ) free( field );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
115
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
116 if( pos_hdr_sep+4<length ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
117 // Response has data!
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
118 int data_length = length-(pos_hdr_sep+4);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
119 http_hdr->body = (char*)malloc( data_length );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
120 if( http_hdr->body==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
121 printf("Failed to allocate memory\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
122 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
123 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
124 memcpy( http_hdr->body, response+pos_hdr_sep+4, data_length );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
125 http_hdr->body_size = data_length;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
126 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
127
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
128 return http_hdr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
129 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
130
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
131 char *
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
132 http_get_request( HTTP_header_t *http_hdr ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
133 char *request;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
134 char *ptr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
135 int i;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
136 if( http_hdr==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
137
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
138 request = (char*)malloc(1024); // FIXME
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
139 if( request==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
140
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
141 if( http_hdr->method==NULL ) http_set_method( http_hdr, "GET");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
142 if( http_hdr->uri==NULL ) http_set_uri( http_hdr, "/");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
143
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
144 ptr = request;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
145 ptr += sprintf( ptr, "%s %s HTTP/1.%d\r\n", http_hdr->method, http_hdr->uri, http_hdr->http_minor_version );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
146 for( i=0 ; i<http_hdr->field_nb ; i++ )
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
147 ptr += sprintf( ptr, "%s\r\n", http_hdr->fields[i] );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
148 ptr += sprintf( ptr, "\r\n" );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
149 if( http_hdr->body!=NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
150 memcpy( ptr, http_hdr->body, http_hdr->body_size );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
151 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
152
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
153 return request;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
154 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
155
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
156 char *
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
157 http_get_field( HTTP_header_t *http_hdr, const char *field_name ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
158 if( http_hdr==NULL || field_name==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
159 http_hdr->search_pos = 0;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
160 if( http_hdr->field_search!=NULL ) free( http_hdr->field_search );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
161 http_hdr->field_search = (char*)malloc(strlen(field_name)+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
162 if( http_hdr->field_search==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
163 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
164 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
165 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
166 strcpy( http_hdr->field_search, field_name );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
167 return http_get_next_field( http_hdr );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
168 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
169
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
170 char *
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
171 http_get_next_field( HTTP_header_t *http_hdr ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
172 char *ptr;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
173 int i;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
174 if( http_hdr==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
175
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
176 for( i=http_hdr->search_pos ; i<http_hdr->field_nb ; i++ ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
177 ptr = strstr( http_hdr->fields[i], ":" );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
178 if( ptr==NULL ) return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
179 if( !strncasecmp( http_hdr->fields[i], http_hdr->field_search, ptr-http_hdr->fields[i] ) ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
180 ptr++; // Skip the column
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
181 while( ptr[0]==' ' ) ptr++; // Skip the spaces if there is some
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
182 http_hdr->search_pos = i+1;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
183 return ptr; // return the value without the field name
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
184 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
185 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
186 return NULL;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
187 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
188
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
189 void
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
190 http_set_field( HTTP_header_t *http_hdr, const char *field ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
191 int pos;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
192 if( http_hdr==NULL || field==NULL ) return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
193
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
194 pos = http_hdr->field_nb;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
195
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
196 http_hdr->fields[pos] = (char*)malloc(strlen(field)+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
197 if( http_hdr->fields[pos]==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
198 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
199 return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
200 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
201 http_hdr->field_nb++;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
202 strcpy( http_hdr->fields[pos], field );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
203 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
204
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
205 void
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
206 http_set_method( HTTP_header_t *http_hdr, const char *method ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
207 if( http_hdr==NULL || method==NULL ) return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
208
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
209 http_hdr->method = (char*)malloc(strlen(method)+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
210 if( http_hdr->method==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
211 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
212 return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
213 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
214 strcpy( http_hdr->method, method );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
215 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
216
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
217 void
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
218 http_set_uri( HTTP_header_t *http_hdr, const char *uri ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
219 if( http_hdr==NULL || uri==NULL ) return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
220
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
221 http_hdr->uri = (char*)malloc(strlen(uri)+1);
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
222 if( http_hdr->uri==NULL ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
223 printf("Memory allocation failed\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
224 return;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
225 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
226 strcpy( http_hdr->uri, uri );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
227 }
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
228
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
229 void
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
230 http_debug_hdr( HTTP_header_t *http_hdr ) {
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
231 int i;
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
232
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
233 printf("protocol: %s\n", http_hdr->protocol );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
234 printf("http minor version: %d\n", http_hdr->http_minor_version );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
235 printf("uri: %s\n", http_hdr->uri );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
236 printf("method: %s\n", http_hdr->method );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
237 printf("status code: %d\n", http_hdr->status_code );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
238 printf("reason phrase: %s\n", http_hdr->reason_phrase );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
239
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
240 printf("Fields:\n");
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
241 for( i=0 ; i<http_hdr->field_nb ; i++ )
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
242 printf(" %d - %s\n", i, http_hdr->fields[i] );
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
243
f641c96e431b Some simple code to handle HTTP requests/responses.
bertrand
parents:
diff changeset
244 }