#include "requestresponse.h" Header* newHeader(char *str){ Header *header = malloc(sizeof(Header)); memset(header, 0, sizeof(Header)); char *position = str; char *end = str + strlen(str) - 1; //Let's loose any trailing whitespace while ( ( *end == '\n' || *end == '\r' ) && end > str ) end--; while ( *position != ':' && position < end ) position++; if ( position == end ){ printf("Header without colon. Not sure what to do\n"); return NULL; } header->name = malloc( sizeof(char) * ( position + 1 - str ) ); memset(header->name, '\0', position + 1 - str ); strncpy( header->name, str, position - str ); //Skip over the colon position++; //Skip over any trailing whitespace while ( *position == '\t' || *position == ' ' ) position++; //Add 2 when allocating so that we have space for a \0 at the end header->value = malloc( sizeof(char) * ( end + 2 - position ) ); memset(header->value, '\0', ( end + 2 - position ) ); strncpy( header->value, position, end + 1 - position ); return header; } void freeHeader(Header *header){ free(header->name); free(header->value); free(header); } void addHeader(HeaderList *headers, char *str){ HeaderList *newListItem = malloc(sizeof(HeaderList)); newListItem->header = newHeader(str); newListItem->next = NULL; HeaderList *last = headers; while ( last->next != NULL ) last = last->next; last->next = newListItem; } void freeHeaderList(HeaderList *headers){ HeaderList *current; while ( headers != NULL ){ current = headers; freeHeader( current->header ); headers = headers->next; free( current ); } } // Will return the first header in a header list with the name matching name // It matches name case insensitively as header names are case insensitive Header* getHeader(HeaderList *headers, char *name){ HeaderList *curr = headers; while ( curr != NULL ){ // Header names are case insensitive if ( strcasecmp( curr->header->name, name) == 0 ){ return curr->header; } curr = curr->next; } return NULL; } unsigned int countHeaders(HeaderList *headers){ unsigned int count = 0; while (headers != NULL){ count++; headers = headers->next; } return count; } unsigned int headerListCharLength(HeaderList *headers){ unsigned int length = 0; while (headers != NULL){ // 4 = colon + space + \r + \n length += strlen(headers->header->name) + strlen(headers->header->value) + 4; headers = headers->next; } return length; } char* headersToString(HeaderList *headers){ int len = headerListCharLength(headers) + 1; //null pointer HeaderList *curr = headers; char *retStr = malloc( len * sizeof(char) ); memset(retStr, '\0', len * sizeof(char) ); while ( curr != NULL ){ strcat( retStr, curr->header->name ); strcat( retStr, ": " ); strcat( retStr, curr->header->value ); strcat( retStr, "\r\n" ); curr = curr->next; } return retStr; }