@ -6,25 +6,22 @@
@@ -6,25 +6,22 @@
# include <stdlib.h>
# include <string.h>
static size_t calc_res_status_sz ( const rpd_res * res ) ;
static size_t calc_res_headers_sz ( const rpd_keyval * res ) ;
static size_t calc_res_headers_sz ( const rpd_res * res ) ;
void rpd_res_init ( rpd_res * dest )
{
dest - > status = rpd_res_st_ok ;
dest - > location = dest - > content_type = NULL ;
dest - > body = NULL ;
rpd_keyval_init ( & dest - > headers , 5 ) ;
dest - > headers . unique = 0 ;
rpd_keyval_init ( & dest - > cookie , 0 ) ;
}
int rpd_res_headers_str ( char * * dest , const rpd_res * src )
{
size_t size , i = 0 ;
size_t size = calc_res_headers_sz ( src ) ;
char * ptr ;
size = calc_res_headers_sz ( & src - > headers ) ;
* dest = ( char * ) malloc ( sizeof ( char ) * size ) ;
if ( ! * dest ) {
perror ( " malloc " ) ;
@ -32,13 +29,12 @@ int rpd_res_headers_str(char **dest, const rpd_res *src)
@@ -32,13 +29,12 @@ int rpd_res_headers_str(char **dest, const rpd_res *src)
}
ptr = * dest ;
while ( i < src - > headers . size ) {
ptr + = sprintf (
ptr ,
" %s: %s \r \n " ,
src - > headers . items [ i ] . key ,
src - > headers . items [ i ] . val ) ;
i + + ;
if ( src - > content_type ) {
ptr + = sprintf ( ptr , " Content-Type: %s \r \n " , src - > content_type ) ;
}
if ( src - > location ) {
ptr + = sprintf ( ptr , " Location: %s \r \n " , src - > location ) ;
}
return 0 ;
@ -48,9 +44,7 @@ int rpd_res_str(char **dest, const rpd_res *res)
@@ -48,9 +44,7 @@ int rpd_res_str(char **dest, const rpd_res *res)
{
size_t headers_size , size ;
char * ptr , * headers ;
size = headers_size = calc_res_headers_sz ( & res - > headers ) ;
size + = calc_res_status_sz ( res ) ;
size = headers_size = calc_res_headers_sz ( res ) ;
if ( res - > body )
size + = 2 + strlen ( res - > body ) ;
@ -84,24 +78,25 @@ int rpd_res_str(char **dest, const rpd_res *res)
@@ -84,24 +78,25 @@ int rpd_res_str(char **dest, const rpd_res *res)
return 0 ;
}
static size_t calc_res_statu s_sz ( const rpd_res * res )
static size_t calc_res_header s_sz ( const rpd_res * res )
{
size_t size = 0 ;
size + = strlen ( " Status: \r \n " ) ;
size + = 3 ; /* plus status code */
return size ;
}
static size_t calc_res_headers_sz ( const rpd_keyval * headers )
{
size_t size = 0 , i = 0 ;
while ( i < headers - > size ) {
size + = strlen ( headers - > items [ i ] . key ) ;
size + = 2 ; /* plus ": " */
size + = strlen ( headers - > items [ i ] . val ) ;
size + = 2 ; /* plus CRLF */
i + + ;
size + = strlen ( " Status: \r \n " ) + 3 ;
if ( res - > location ) {
size + = strlen ( " Location: \r \n " ) + strlen ( res - > location ) ;
}
if ( res - > content_type ) {
size + = strlen ( " Content-Type: \r \n " ) + strlen ( res - > content_type ) ;
}
if ( res - > cookie . size ) {
size + = strlen ( " Set-Cookie: \r \n " ) * res - > cookie . size ;
for ( int i = 0 ; i < res - > cookie . size ; i + + ) {
rpd_keyval_item * item = res - > cookie . items + i ;
size + = strlen ( item - > key ) + strlen ( item - > val ) ;
}
}
return size ;
@ -111,12 +106,22 @@ void rpd_res_cleanup(rpd_res *res)
@@ -111,12 +106,22 @@ void rpd_res_cleanup(rpd_res *res)
{
res - > status = rpd_res_st_ok ;
if ( res - > location ) {
free ( res - > location ) ;
res - > location = NULL ;
}
if ( res - > content_type ) {
free ( res - > content_type ) ;
res - > content_type = NULL ;
}
if ( res - > body ) {
free ( res - > body ) ;
res - > body = NULL ;
}
if ( res - > headers . capacity ) {
rpd_keyval_cleanup ( & res - > headers ) ;
if ( res - > cookie . capacity ) {
rpd_keyval_cleanup ( & res - > cookie ) ;
}
}