Changeset 3423

Show
Ignore:
Timestamp:
03/07/09 16:45:20 (8 months ago)
Author:
alo
Message:

Improves header parsing.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • cherokee/trunk/cherokee/header.c

    r3403 r3423  
    723723has_header_request (cherokee_header_t *hdr, cherokee_buffer_t *buffer, cuint_t tail_len) 
    724724{ 
     725        ret_t   ret; 
    725726        char   *start; 
    726727        char   *end; 
     
    745746                 * to the beginning of the buffer. 
    746747                 */ 
    747                 cherokee_buffer_move_to_begin(buffer, (int) crlf_len); 
     748                cherokee_buffer_move_to_begin (buffer, (int) crlf_len); 
    748749        } 
    749750 
     
    764765        /* It could be a partial header, or maybe a POST request 
    765766         */ 
    766         if (unlikely ((end = strstr(start, CRLF_CRLF)) == NULL)) { 
    767                 if ((end = strstr (start, LF_LF)) == NULL) 
    768                         return ret_not_found; 
    769  
    770                 /* Found uncommon / non standard EOH, set header length  
    771                  */ 
    772                 hdr->input_header_len = ((int) (end - buffer->buf)) + CSZLEN(LF_LF); 
    773                 return ret_ok; 
    774         } 
    775  
    776         /* Found standard EOH, set header length  
    777          */ 
    778         hdr->input_header_len = ((int) (end - buffer->buf)) + CSZLEN(CRLF_CRLF); 
    779  
     767        ret = cherokee_find_header_end_cstr (start, 
     768                                             (buffer->buf + buffer->len) - start, 
     769                                             &end, &crlf_len); 
     770        if (ret != ret_ok) { 
     771                return ret_not_found; 
     772        } 
     773         
     774        hdr->input_header_len = ((int) (end - buffer->buf)) + crlf_len; 
     775         
    780776        return ret_ok; 
    781777} 
  • cherokee/trunk/cherokee/util.c

    r3403 r3423  
    15831583 
    15841584ret_t 
    1585 cherokee_find_header_end (cherokee_buffer_t  *buf, 
    1586                           char              **end, 
    1587                           cuint_t            *sep_len) 
     1585cherokee_find_header_end_cstr (char      *c_str, 
     1586                               cint_t     c_len, 
     1587                               char     **end, 
     1588                               cuint_t   *sep_len) 
    15881589{ 
    15891590        char *p; 
    15901591        char *fin; 
    15911592        char *begin; 
    1592         char *limit; 
    1593         int   len; 
    1594  
    1595         if (cherokee_buffer_is_empty (buf)) 
     1593        int   cr_n, lf_n; 
     1594 
     1595        if ((c_str == NULL) || (c_len <= 0)) 
    15961596                return ret_not_found; 
    15971597 
    1598         p     = buf->buf; 
    1599         fin   = buf->buf + buf->len; 
    1600         limit = buf->buf + MAX_HEADER_LEN; 
     1598        p   = c_str; 
     1599        fin = c_str + MIN(c_len, MAX_HEADER_LEN); 
    16011600 
    16021601        while (p < fin) { 
    1603                 if (unlikely (p > limit)) { 
    1604                         return ret_error; 
    1605                 } 
    1606  
    1607                 if ((*p == CHR_CR) || (*p == CHR_LF)) { 
    1608                         len   = 0; 
     1602                if ((*p == CHR_CR) || (*p == CHR_LF)) { 
     1603                        cr_n  = 0; 
     1604                        lf_n  = 0; 
    16091605                        begin = p; 
    1610                         while ((*p == CHR_CR) || (*p == CHR_LF)) { 
     1606 
     1607                        /* Valid scenarios: 
     1608                         * CR_n: [CRLF_CRLF] 0, 1, 1, 2, 2  | [LF_LF] 0, 0 
     1609                         * LF_n:             0, 0, 1, 1, 2  |         1, 2 
     1610                         *  
     1611                         * so, the two forbidden situations are: 
     1612                         * CR_n: 1, 2 
     1613                         * LF_n: 2, 0 
     1614                         */ 
     1615                        while (p < fin) { 
    16111616                                if (*p == CHR_LF) { 
    1612                                         len += 1
    1613                                         if (len == 2) { 
     1617                                        lf_n++
     1618                                        if (lf_n == 2) { 
    16141619                                                *end     = begin; 
    16151620                                                *sep_len = (p - begin) + 1; 
    16161621                                                return ret_ok; 
    16171622                                        } 
     1623 
    16181624                                } else if (*p == CHR_CR) { 
    1619                                         ; 
     1625                                        cr_n++; 
     1626 
    16201627                                } else { 
    16211628                                        break; 
    16221629                                } 
    1623                                 p += 1; 
     1630 
     1631                                if (unlikely (((cr_n == 1) && (lf_n == 2)) || 
     1632                                              ((cr_n == 2) && (lf_n == 0)))) 
     1633                                { 
     1634                                        return ret_error; 
     1635                                } 
     1636 
     1637                                p++; 
    16241638                        } 
    16251639                } 
    1626                 p += 1; 
     1640 
     1641                p++; 
    16271642        } 
    16281643 
    16291644        return ret_not_found; 
     1645} 
     1646 
     1647 
     1648ret_t 
     1649cherokee_find_header_end (cherokee_buffer_t  *buf, 
     1650                          char              **end, 
     1651                          cuint_t            *sep_len) 
     1652{ 
     1653        return cherokee_find_header_end_cstr (buf->buf, buf->len, end, sep_len); 
    16301654} 
    16311655 
  • cherokee/trunk/cherokee/util.h

    r3403 r3423  
    114114                                     cuint_t            *sep_len); 
    115115 
     116ret_t   cherokee_find_header_end_cstr (char      *c_str, 
     117                                       cint_t     c_len, 
     118                                       char     **end, 
     119                                       cuint_t   *sep_len); 
     120 
    116121ret_t   cherokee_parse_host         (cherokee_buffer_t *buf, 
    117122                                     cherokee_buffer_t *host,