@ -97,15 +97,17 @@ http_response_set_header(struct http_response *r, const char *k, const char *v,
size_t key_sz = strlen ( k ) ;
size_t key_sz = strlen ( k ) ;
size_t val_sz = strlen ( v ) ;
size_t val_sz = strlen ( v ) ;
if ( copy & HEADER_CHECK_DUPE ) {
for ( i = 0 ; i < r - > header_count ; + + i ) {
for ( i = 0 ; i < r - > header_count ; + + i ) {
if ( strncmp ( r - > headers [ i ] . key , k , key_sz ) = = 0 ) {
if ( strncmp ( r - > headers [ i ] . key , k , key_sz ) = = 0 ) {
pos = i ;
pos = i ;
/* free old value before replacing it. */
/* free old value before replacing it. */
if ( r - > headers [ i ] . copy == HEADER_COPY_KEY ) free ( r - > headers [ i ] . key ) ;
if ( r - > headers [ i ] . copy & HEADER_COPY_KEY ) free ( r - > headers [ i ] . key ) ;
if ( r - > headers [ i ] . copy == HEADER_COPY_VALUE ) free ( r - > headers [ i ] . val ) ;
if ( r - > headers [ i ] . copy & HEADER_COPY_VALUE ) free ( r - > headers [ i ] . val ) ;
break ;
break ;
}
}
}
}
}
/* extend array */
/* extend array */
if ( pos = = r - > headers_array_size ) {
if ( pos = = r - > headers_array_size ) {
@ -117,7 +119,7 @@ http_response_set_header(struct http_response *r, const char *k, const char *v,
r - > header_count + + ;
r - > header_count + + ;
/* copy key if needed */
/* copy key if needed */
if ( copy == HEADER_COPY_KEY ) {
if ( copy & HEADER_COPY_KEY ) {
r - > headers [ pos ] . key = calloc ( key_sz + 1 , 1 ) ;
r - > headers [ pos ] . key = calloc ( key_sz + 1 , 1 ) ;
memcpy ( r - > headers [ pos ] . key , k , key_sz ) ;
memcpy ( r - > headers [ pos ] . key , k , key_sz ) ;
} else {
} else {
@ -126,7 +128,7 @@ http_response_set_header(struct http_response *r, const char *k, const char *v,
r - > headers [ pos ] . key_sz = key_sz ;
r - > headers [ pos ] . key_sz = key_sz ;
/* copy val */
/* copy val */
if ( copy == HEADER_COPY_VALUE ) {
if ( copy & HEADER_COPY_VALUE ) {
r - > headers [ pos ] . val = calloc ( val_sz + 1 , 1 ) ;
r - > headers [ pos ] . val = calloc ( val_sz + 1 , 1 ) ;
memcpy ( r - > headers [ pos ] . val , v , val_sz ) ;
memcpy ( r - > headers [ pos ] . val , v , val_sz ) ;
} else {
} else {
@ -243,9 +245,9 @@ http_response_write(struct http_response *r, int fd) {
if ( r - > code = = 200 & & r - > body ) {
if ( r - > code = = 200 & & r - > body ) {
char content_length [ 22 ] ;
char content_length [ 22 ] ;
sprintf ( content_length , " %zd " , r - > body_len ) ;
sprintf ( content_length , " %zd " , r - > body_len ) ;
http_response_set_header ( r , " Content-Length " , content_length , HEADER_COPY_VALUE ) ;
http_response_set_header ( r , " Content-Length " , content_length , HEADER_COPY_VALUE | HEADER_CHECK_DUPE ) ;
} else {
} else {
http_response_set_header ( r , " Content-Length " , " 0 " , HEADER_COPY_NONE ) ;
http_response_set_header ( r , " Content-Length " , " 0 " , HEADER_COPY_NONE | HEADER_CHECK_DUPE ) ;
}
}
}
}