Removed the field number limitation.

We can add as much field as we want.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3040 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
bertrand 2001-11-20 22:14:16 +00:00
parent ba1e011685
commit 9ea246653a
2 changed files with 64 additions and 30 deletions

View File

@ -23,7 +23,7 @@ http_new_header() {
void
http_free( HTTP_header_t *http_hdr ) {
int i;
HTTP_field_t *field, *field2free;
if( http_hdr==NULL ) return;
if( http_hdr->protocol!=NULL ) free( http_hdr->protocol );
if( http_hdr->uri!=NULL ) free( http_hdr->uri );
@ -32,9 +32,14 @@ http_free( HTTP_header_t *http_hdr ) {
if( http_hdr->field_search!=NULL ) free( http_hdr->field_search );
if( http_hdr->method!=NULL ) free( http_hdr->method );
if( http_hdr->buffer!=NULL ) free( http_hdr->buffer );
for( i=0 ; i<http_hdr->field_nb ; i++ )
if( http_hdr->fields[i]!=NULL ) free( http_hdr->fields[i] );
field = http_hdr->first_field;
while( field!=NULL ) {
field2free = field;
field = field->next;
free( field2free );
}
free( http_hdr );
http_hdr = NULL;
}
int
@ -168,8 +173,8 @@ http_response_parse( HTTP_header_t *http_hdr ) {
char *
http_build_request( HTTP_header_t *http_hdr ) {
char *ptr;
int i;
int len;
HTTP_field_t *field;
if( http_hdr==NULL ) return NULL;
if( http_hdr->method==NULL ) http_set_method( http_hdr, "GET");
@ -177,8 +182,11 @@ http_build_request( HTTP_header_t *http_hdr ) {
// Compute the request length
len = strlen(http_hdr->method)+strlen(http_hdr->uri)+12; // Method line
for( i=0 ; i<http_hdr->field_nb ; i++ ) // Fields
len += strlen(http_hdr->fields[i])+2;
field = http_hdr->first_field; // Fields
while( field!=NULL ) {
len += strlen(field->field_name)+2;
field = field->next;
}
len += 2; // CRLF
if( http_hdr->body!=NULL ) {
len += http_hdr->body_size;
@ -196,8 +204,11 @@ http_build_request( HTTP_header_t *http_hdr ) {
ptr = http_hdr->buffer;
ptr += sprintf( ptr, "%s %s HTTP/1.%d\r\n", http_hdr->method, http_hdr->uri, http_hdr->http_minor_version );
for( i=0 ; i<http_hdr->field_nb ; i++ )
ptr += sprintf( ptr, "%s\r\n", http_hdr->fields[i] );
field = http_hdr->first_field;
while( field!=NULL ) {
ptr += sprintf( ptr, "%s\r\n", field->field_name );
field = field->next;
}
ptr += sprintf( ptr, "\r\n" );
if( http_hdr->body!=NULL ) {
memcpy( ptr, http_hdr->body, http_hdr->body_size );
@ -208,9 +219,8 @@ http_build_request( HTTP_header_t *http_hdr ) {
char *
http_get_field( HTTP_header_t *http_hdr, const char *field_name ) {
if( http_hdr==NULL || field_name==NULL ) return NULL;
http_hdr->search_pos = 0;
if( http_hdr->field_search!=NULL ) free( http_hdr->field_search );
http_hdr->field_search = (char*)malloc(strlen(field_name)+1);
http_hdr->field_search_pos = http_hdr->first_field;
http_hdr->field_search = (char*)realloc( http_hdr->field_search, strlen(field_name)+1 );
if( http_hdr->field_search==NULL ) {
printf("Memory allocation failed\n");
return NULL;
@ -223,35 +233,49 @@ char *
http_get_next_field( HTTP_header_t *http_hdr ) {
char *ptr;
int i;
HTTP_field_t *field;
if( http_hdr==NULL ) return NULL;
for( i=http_hdr->search_pos ; i<http_hdr->field_nb ; i++ ) {
ptr = strstr( http_hdr->fields[i], ":" );
field = http_hdr->field_search_pos;
while( field!=NULL ) {
ptr = strstr( field->field_name, ":" );
if( ptr==NULL ) return NULL;
if( !strncasecmp( http_hdr->fields[i], http_hdr->field_search, ptr-http_hdr->fields[i] ) ) {
if( !strncasecmp( field->field_name, http_hdr->field_search, ptr-(field->field_name) ) ) {
ptr++; // Skip the column
while( ptr[0]==' ' ) ptr++; // Skip the spaces if there is some
http_hdr->search_pos = i+1;
http_hdr->field_search_pos = field->next;
return ptr; // return the value without the field name
}
field = field->next;
}
return NULL;
}
void
http_set_field( HTTP_header_t *http_hdr, const char *field ) {
int pos;
if( http_hdr==NULL || field==NULL ) return;
http_set_field( HTTP_header_t *http_hdr, const char *field_name ) {
HTTP_field_t *new_field;
if( http_hdr==NULL || field_name==NULL ) return;
pos = http_hdr->field_nb;
http_hdr->fields[pos] = (char*)malloc(strlen(field)+1);
if( http_hdr->fields[pos]==NULL ) {
new_field = (HTTP_field_t*)malloc(sizeof(HTTP_field_t));
if( new_field==NULL ) {
printf("Memory allocation failed\n");
return;
}
new_field->next = NULL;
new_field->field_name = (char*)malloc(strlen(field_name)+1);
if( new_field->field_name==NULL ) {
printf("Memory allocation failed\n");
return;
}
strcpy( new_field->field_name, field_name );
if( http_hdr->last_field==NULL ) {
http_hdr->first_field = new_field;
} else {
http_hdr->last_field->next = new_field;
}
http_hdr->last_field = new_field;
http_hdr->field_nb++;
strcpy( http_hdr->fields[pos], field );
}
void
@ -280,7 +304,8 @@ http_set_uri( HTTP_header_t *http_hdr, const char *uri ) {
void
http_debug_hdr( HTTP_header_t *http_hdr ) {
int i;
HTTP_field_t *field;
int i = 0;
if( http_hdr==NULL ) return;
printf("protocol: %s\n", http_hdr->protocol );
@ -291,6 +316,9 @@ http_debug_hdr( HTTP_header_t *http_hdr ) {
printf("reason phrase: %s\n", http_hdr->reason_phrase );
printf("Fields:\n");
for( i=0 ; i<http_hdr->field_nb ; i++ )
printf(" %d - %s\n", i, http_hdr->fields[i] );
field = http_hdr->first_field;
while( field!=NULL ) {
printf(" %d - %s\n", i++, field->field_name );
field = field->next;
}
}

View File

@ -7,7 +7,10 @@
#ifndef __HTTP_H
#define __HTTP_H
#define HTTP_FIELD_MAX 20
typedef struct HTTP_field_type {
char *field_name;
struct HTTP_field_type *next;
} HTTP_field_t;
typedef struct {
char *protocol;
@ -16,10 +19,13 @@ typedef struct {
int status_code;
char *reason_phrase;
int http_minor_version;
char *fields[HTTP_FIELD_MAX];
// Field variables
HTTP_field_t *first_field;
HTTP_field_t *last_field;
int field_nb;
char *field_search;
int search_pos;
HTTP_field_t *field_search_pos;
// Body varibles
char *body;
int body_size;
char *buffer;
@ -35,7 +41,7 @@ int http_is_header_entire( HTTP_header_t *http_hdr );
char* http_build_request( HTTP_header_t *http_hdr );
char* http_get_field( HTTP_header_t *http_hdr, const char *field_name );
char* http_get_next_field( HTTP_header_t *http_hdr );
void http_set_field( HTTP_header_t *http_hdr, const char *field );
void http_set_field( HTTP_header_t *http_hdr, const char *field_name );
void http_set_method( HTTP_header_t *http_hdr, const char *method );
void http_set_uri( HTTP_header_t *http_hdr, const char *uri );