Changeset 1723

Show
Ignore:
Timestamp:
04/09/2007 06:12:43 PM (17 months ago)
Author:
jan
Message:

encode newlines in HTTP headers (fixes #1106)

Location:
branches/lighttpd-1.4.x/src
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/lighttpd-1.4.x/src/buffer.c

    r1371 r1723  
    730730}; 
    731731 
     732const char encoded_chars_http_header[] = { 
     733        /* 
     734        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F 
     735        */ 
     736        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  /*  00 -  0F */ 
     737        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  10 -  1F */ 
     738        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  20 -  2F */ 
     739        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  30 -  3F */ 
     740        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  40 -  4F */ 
     741        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  50 -  5F */ 
     742        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  60 -  6F */ 
     743        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  70 -  7F */ 
     744        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  80 -  8F */ 
     745        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  90 -  9F */ 
     746        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  A0 -  AF */ 
     747        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  B0 -  BF */ 
     748        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  C0 -  CF */ 
     749        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  D0 -  DF */ 
     750        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  E0 -  EF */ 
     751        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /*  F0 -  FF */ 
     752}; 
     753 
     754 
    732755 
    733756int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding) { 
     
    760783                map = encoded_chars_hex; 
    761784                break; 
     785        case ENCODING_HTTP_HEADER: 
     786                map = encoded_chars_http_header; 
     787                break; 
    762788        case ENCODING_UNSET: 
    763789                break; 
     
    778804                                d_len += 6; 
    779805                                break; 
     806                        case ENCODING_HTTP_HEADER: 
    780807                        case ENCODING_HEX: 
    781808                                d_len += 2; 
     
    813840                                d[d_len++] = hex_chars[(*ds) & 0x0F]; 
    814841                                break; 
     842                        case ENCODING_HTTP_HEADER: 
     843                                d[d_len++] = *ds; 
     844                                d[d_len++] = '\t'; 
     845                                break; 
    815846                        case ENCODING_UNSET: 
    816847                                break; 
  • branches/lighttpd-1.4.x/src/buffer.h

    r1371 r1723  
    8888        ENCODING_REL_URI, /* for coding a rel-uri (/with space/and%percent) nicely as part of a href */ 
    8989        ENCODING_REL_URI_PART, /* same as ENC_REL_URL plus coding / too as %2F */ 
    90         ENCODING_HTML,    /* & becomes & and so on */ 
    91         ENCODING_MINIMAL_XML, /* minimal encoding for xml */ 
    92         ENCODING_HEX      /* encode string as hex */ 
     90        ENCODING_HTML,         /* & becomes & and so on */ 
     91        ENCODING_MINIMAL_XML,  /* minimal encoding for xml */ 
     92        ENCODING_HEX,          /* encode string as hex */ 
     93        ENCODING_HTTP_HEADER   /* encode \n with \t\n */ 
    9394} buffer_encoding_t; 
    9495 
  • branches/lighttpd-1.4.x/src/response.c

    r1371 r1723  
    6767                        buffer_append_string_buffer(b, ds->key); 
    6868                        BUFFER_APPEND_STRING_CONST(b, ": "); 
    69                         buffer_append_string_buffer(b, ds->value); 
     69 
     70                        /**  
     71                         * the value might contain newlines, encode them with at least one white-space 
     72                         */ 
     73                        buffer_append_string_encoded(b, CONST_BUF_LEN(ds->value), ENCODING_HTTP_HEADER); 
    7074#if 0 
    7175                        log_error_write(srv, __FILE__, __LINE__, "bb", 
     
    99103                } else { 
    100104                        BUFFER_APPEND_STRING_CONST(b, "\r\nServer: "); 
    101                         buffer_append_string_buffer(b, con->conf.server_tag); 
     105                        buffer_append_string_encoded(b, CONST_BUF_LEN(con->conf.server_tag), ENCODING_HTTP_HEADER); 
    102106                } 
    103107        }