Changeset 1967

Show
Ignore:
Timestamp:
09/08/08 16:18:31 (4 months ago)
Author:
alo
Message:

--

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • cherokee/trunk/ChangeLog

    r1966 r1967  
    112008-09-08  Alvaro Lopez Ortega  <alvaro@alobbs.com> 
     2 
     3        * cherokee/connection.c, cherokee/connection-protected.h, 
     4        cherokee/util.c: Improves the Chunked encoding performance. 
    25 
    36        * cherokee/handler_dirlist.c, cherokee/handler_dirlist.h: Adds a 
  • cherokee/trunk/cherokee/connection-protected.h

    r1947 r1967  
    197197         */ 
    198198        cherokee_boolean_t            chunked_encoding; 
     199        cherokee_boolean_t            chunked_last_package; 
    199200        cherokee_buffer_t             chunked_len; 
    200201        size_t                        chunked_sent; 
  • cherokee/trunk/cherokee/connection.c

    r1958 r1967  
    148148        n->regex_ovecsize = 0; 
    149149 
    150         n->chunked_encoding = false; 
    151         n->chunked_sent     = 0; 
     150        n->chunked_encoding     = false; 
     151        n->chunked_sent         = 0; 
     152        n->chunked_last_package = false; 
    152153        cherokee_buffer_init (&n->chunked_len); 
    153154 
     
    259260        conn->chunked_encoding     = false; 
    260261        conn->chunked_sent         = 0; 
     262        conn->chunked_last_package = false; 
    261263 
    262264        memset (conn->regex_ovector, OVECTOR_LEN * sizeof(int), 0); 
     
    879881                tmp[1].iov_base = conn->buffer.buf; 
    880882                tmp[1].iov_len  = conn->buffer.len; 
    881                 tmp[2].iov_base = CRLF; 
    882                 tmp[2].iov_len  = 2; 
     883 
     884                if (conn->chunked_last_package) { 
     885                        tmp[2].iov_base = CRLF "0" CRLF CRLF; 
     886                        tmp[2].iov_len  = 7; 
     887                } else { 
     888                        tmp[2].iov_base = CRLF; 
     889                        tmp[2].iov_len  = 2; 
     890                } 
    883891 
    884892                cherokee_iovec_skip_sent (tmp, 3,  
     
    908916                 * has been sent. 
    909917                 */ 
    910                 if (cherokee_iovec_was_sent (tmp, 3, conn->chunked_sent)) { 
     918                ret = cherokee_iovec_was_sent (tmp, 3, conn->chunked_sent); 
     919                if (ret == ret_ok) { 
    911920                        cherokee_buffer_clean (&conn->chunked_len); 
    912921                        cherokee_buffer_clean (&conn->buffer); 
     
    10671076         */ 
    10681077        if (conn->chunked_encoding) { 
    1069                 /* In case it is the last package, turn the chunked 
    1070                  * encoding off and send the final mark. 
    1071                  */ 
    1072                 if ((step_ret == ret_eof) || 
    1073                     (step_ret == ret_eof_have_data)) 
     1078                /* On EOF: Turn off chunked and send the trailer 
     1079                 */ 
     1080                if (step_ret == ret_eof) { 
     1081                        conn->chunked_encoding = false; 
     1082                        cherokee_buffer_add_str (&conn->buffer, "0" CRLF CRLF); 
     1083 
     1084                        return ret_eof_have_data; 
     1085                } 
     1086                 
     1087                /* On last package: point cherokee_connection_send 
     1088                 * about it.  It will add the trailer. 
     1089                 */ 
     1090                if (step_ret == ret_eof_have_data) 
    10741091                { 
    1075                         cherokee_buffer_add_str (&conn->buffer, "0" CRLF CRLF); 
    1076                         conn->chunked_encoding = false; 
    1077  
    1078                         step_ret = ret_eof_have_data; 
    1079  
    1080                 } else { 
    1081                         /* Build the Chunked package header:  
    1082                          * len(str(hex(4294967295))+"\r\n\0") = 13 
    1083                          */ 
    1084                         cherokee_buffer_clean       (&conn->chunked_len); 
    1085                         cherokee_buffer_ensure_size (&conn->chunked_len, 13); 
    1086                         cherokee_buffer_add_ulong16 (&conn->chunked_len, conn->buffer.len); 
    1087                         cherokee_buffer_add_str     (&conn->chunked_len, CRLF); 
    1088  
    1089                         conn->chunked_sent = 0; 
    1090                 } 
     1092                        conn->chunked_last_package = true; 
     1093                } 
     1094 
     1095                /* Build the Chunked package header:  
     1096                 * len(str(hex(4294967295))+"\r\n\0") = 13 
     1097                 */ 
     1098                cherokee_buffer_clean       (&conn->chunked_len); 
     1099                cherokee_buffer_ensure_size (&conn->chunked_len, 13); 
     1100                cherokee_buffer_add_ulong16 (&conn->chunked_len, conn->buffer.len); 
     1101                cherokee_buffer_add_str     (&conn->chunked_len, CRLF); 
     1102                 
     1103                conn->chunked_sent = 0; 
    10911104        } 
    10921105         
  • cherokee/trunk/cherokee/util.c

    r1956 r1967  
    14721472        for (i=0; i<orig_len; i++) { 
    14731473                total += orig[i].iov_len; 
    1474                 if (total > sent) { 
     1474                if (total >= sent) { 
    14751475                        return 0; 
    14761476                }