Changeset 1944

Show
Ignore:
Timestamp:
09/04/08 14:44:47 (3 months ago)
Author:
alo
Message:

--

Files:

Legend:

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

    r1942 r1944  
     12008-09-04  Alvaro Lopez Ortega  <alvaro@alobbs.com> 
     2 
     3        * cherokee/connection-protected.h, cherokee/handler_cgi_base.c, 
     4        cherokee/handler_cgi_base.h, cherokee/connection.c: Fixes a 
     5        chunked encoding issue while speeds it up. Now Chunked encoded 
     6        connections are faster than with the first implementation. 
     7 
    182008-09-03  Alvaro Lopez Ortega  <alvaro@alobbs.com> 
    29 
  • cherokee/trunk/cherokee/connection-protected.h

    r1912 r1944  
    169169         */ 
    170170        cherokee_post_t               post; 
     171 
    171172        uint32_t                      keepalive; 
    172173        time_t                        timeout; 
     
    187188        int                           regex_ovector[OVECTOR_LEN]; 
    188189        int                           regex_ovecsize; 
    189  
     190         
     191        /* Content Expiration 
     192         */ 
    190193        cherokee_expiration_t         expiration; 
    191194        time_t                        expiration_time; 
     195 
     196        /* Chunked encoding 
     197         */ 
     198        cherokee_boolean_t            chunked_encoding; 
     199        cherokee_buffer_t             chunked_len; 
    192200}; 
    193201 
  • cherokee/trunk/cherokee/connection.c

    r1912 r1944  
    148148        n->regex_ovecsize = 0; 
    149149 
     150        n->chunked_encoding = false; 
     151        cherokee_buffer_init (&n->chunked_len); 
     152 
    150153        *conn = n; 
    151154        return ret_ok; 
     
    188191        cherokee_buffer_mrproper (&conn->host); 
    189192        cherokee_buffer_mrproper (&conn->self_trace); 
     193        cherokee_buffer_mrproper (&conn->chunked_len); 
    190194 
    191195        if (conn->validator != NULL) { 
     
    252256        conn->expiration           = cherokee_expiration_none; 
    253257        conn->expiration_time      = 0; 
     258        conn->chunked_encoding     = false; 
    254259 
    255260        memset (conn->regex_ovector, OVECTOR_LEN * sizeof(int), 0); 
     
    286291        cherokee_buffer_clean (&conn->query_string); 
    287292        cherokee_buffer_clean (&conn->self_trace); 
     293        cherokee_buffer_clean (&conn->chunked_len); 
    288294         
    289295        if (conn->validator != NULL) { 
     
    527533                cherokee_buffer_add_str (buffer, "Connection: Keep-Alive"CRLF); 
    528534                cherokee_buffer_add_buffer (buffer, &CONN_SRV(conn)->timeout_header); 
    529  
    530         } else if (conn->handler &&  
    531                    HANDLER_SUPPORTS (conn->handler, hsupport_chunked)) { 
    532                 cherokee_buffer_add_str (buffer, "Transfer-Encoding: chunked" CRLF); 
    533  
    534535        } else { 
    535536                cherokee_buffer_add_str (buffer, "Connection: close"CRLF); 
     537        } 
     538 
     539        /* Chunked transfer 
     540         */ 
     541        if (conn->chunked_encoding) { 
     542                cherokee_buffer_add_str (buffer, "Transfer-Encoding: chunked" CRLF); 
    536543        } 
    537544 
     
    614621        } 
    615622 
    616         /* It might need to deactive Keep-Alive 
     623        /* It might need to deactive Keep-Alive after checking the 
     624         * handler headers.. 
    617625         */ 
    618626        if ((conn->keepalive != 0) && 
     627            (conn->chunked_encoding == false) && 
    619628            (http_method_with_body (conn->error_code)))  
    620629        { 
     
    623632                                conn->keepalive = 0; 
    624633                         
    625                 } else if ((! HANDLER_SUPPORTS (conn->handler, hsupport_length)) && 
    626                            (! HANDLER_SUPPORTS (conn->handler, hsupport_chunked))) 
    627                 { 
     634                } else if (! HANDLER_SUPPORTS (conn->handler, hsupport_length)) { 
    628635                        conn->keepalive = 0; 
    629636                } 
     
    687694        bufs[0].iov_base = conn->buffer.buf; 
    688695        bufs[0].iov_len  = conn->buffer.len; 
    689         if (likely( conn->mmaped_len > 0 )) { 
     696        if (likely (conn->mmaped_len > 0)) { 
    690697                bufs[1].iov_base = conn->mmaped; 
    691698                bufs[1].iov_len  = conn->mmaped_len; 
     
    851858        ret_t  ret; 
    852859        size_t sent = 0; 
     860 
     861        /* Use writev to send the chunk-begin mark 
     862         */ 
     863        if ((conn->chunked_encoding) && 
     864            (! cherokee_buffer_is_empty (&conn->chunked_len))) 
     865        { 
     866                struct iovec bufs[2]; 
     867 
     868                bufs[0].iov_base = conn->chunked_len.buf; 
     869                bufs[0].iov_len  = conn->chunked_len.len; 
     870                bufs[1].iov_base = conn->buffer.buf; 
     871                bufs[1].iov_len  = conn->buffer.len; 
     872 
     873                ret = cherokee_socket_writev (&conn->socket, bufs, 2, &sent); 
     874                if (unlikely (ret != ret_ok)) { 
     875                        switch (ret) { 
     876                        case ret_eof: 
     877                        case ret_eagain:  
     878                                return ret; 
     879                                 
     880                        case ret_error: 
     881                                conn->keepalive = 0; 
     882                                return ret_error; 
     883                                 
     884                        default: 
     885                                RET_UNKNOWN(ret); 
     886                                return ret_error; 
     887                        } 
     888                } 
     889 
     890                if (unlikely (sent <= conn->chunked_len.len)) { 
     891                        cherokee_buffer_move_to_begin (&conn->chunked_len, sent); 
     892 
     893                } else { 
     894                        cherokee_buffer_move_to_begin (&conn->buffer, (sent - conn->chunked_len.len)); 
     895                        cherokee_buffer_clean (&conn->chunked_len); 
     896                } 
     897 
     898                return (conn->buffer.len > 0) ? ret_eagain : ret_ok; 
     899        } 
    853900 
    854901        /* Send the buffer content 
     
    17931840        ret = cherokee_header_get_known (&conn->header, header_connection, &ptr, &ptr_len); 
    17941841        if (ret == ret_ok) { 
    1795                 if (strncasecmp (ptr, "close", 5) == 0) { 
     1842                if (strncasecmp (ptr, "Keep-Alive", 10) == 0) {  
     1843                        if (conn->keepalive == 0) { 
     1844                                conn->keepalive = CONN_SRV(conn)->keepalive_max; 
     1845                        } 
     1846                } else { 
    17961847                        conn->keepalive = 0; 
    1797                 } else if (conn->keepalive == 0) { 
    1798                         conn->keepalive = CONN_SRV(conn)->keepalive_max; 
    17991848                } 
    18001849                return; 
  • cherokee/trunk/cherokee/handler_cgi_base.c

    r1941 r1944  
    7272        cgi->content_length      = 0; 
    7373        cgi->content_length_set  = false; 
    74         cgi->chunked             = false; 
    7574        cgi->got_eof             = false; 
    7675        cgi->file_handler        = NULL; 
     
    968967        /* Chunked encoding 
    969968         */ 
    970         cgi->chunked = ((cgi->content_length_set == false) && 
    971                         (HANDLER_CGI_BASE_PROPS(cgi)->allow_chunked) && 
    972                         (conn->header.version == http_version_11)); 
     969        conn->chunked_encoding = ( 
     970                (conn->keepalive > 0) && 
     971                (cgi->content_length_set == false) && 
     972                (conn->header.version == http_version_11) && 
     973                (HANDLER_CGI_BASE_PROPS(cgi)->allow_chunked)); 
    973974         
    974         TRACE (ENTRIES, "Chunked: (not len set)=%d, allowed=%d, version=%d => %d\n", 
     975        TRACE (ENTRIES, "Chunked: Keepalive: %d, len not set=%d, version ok=%d, allowed=%d => %d\n", 
     976               (conn->keepalive > 0), 
    975977               (cgi->content_length_set == false), 
     978               (conn->header.version == http_version_11), 
    976979               (HANDLER_CGI_BASE_PROPS(cgi)->allow_chunked), 
    977                (conn->header.version == http_version_11), 
    978                cgi->chunked); 
    979  
    980         if (cgi->chunked) { 
    981                 cherokee_buffer_add_str (outbuf, "Transfer-Encoding: chunked" CRLF); 
    982         } 
     980               conn->chunked_encoding); 
    983981 
    984982        return ret_ok; 
     
    987985 
    988986ret_t  
    989 cherokee_handler_cgi_base_step (cherokee_handler_cgi_base_t *cgi, cherokee_buffer_t *outbuf) 
    990 
    991         ret_t              ret; 
    992         cherokee_buffer_t *inbuf = &cgi->data;  
     987cherokee_handler_cgi_base_step (cherokee_handler_cgi_base_t *cgi,  
     988                                cherokee_buffer_t           *outbuf) 
     989
     990        ret_t                  ret; 
     991        cherokee_buffer_t     *inbuf = &cgi->data;  
     992        cherokee_connection_t *conn  = HANDLER_CONN(cgi); 
    993993 
    994994        /* Is it replying a "X-Sendfile" request? 
     
    10041004                TRACE (ENTRIES, "sending stored data: %d bytes\n", cgi->data.len); 
    10051005 
    1006                 if (cgi->chunked) 
    1007                         cherokee_buffer_add_buffer_chunked (outbuf, &cgi->data); 
    1008                 else 
    1009                         cherokee_buffer_add_buffer (outbuf, &cgi->data); 
     1006                if (conn->chunked_encoding) { 
     1007                        /* Build the chunk-hader: 
     1008                         * len(str(hex(4294967295))+"\r\n\0") = 13 
     1009                         */ 
     1010                        cherokee_buffer_ensure_size (&conn->chunked_len, 13); 
     1011                        cherokee_buffer_add_ulong16 (&conn->chunked_len, cgi->data.len); 
     1012                        cherokee_buffer_add_str (&conn->chunked_len, CRLF); 
     1013                } 
     1014 
     1015                cherokee_buffer_add_buffer (outbuf, &cgi->data); 
    10101016                cherokee_buffer_clean (&cgi->data); 
    10111017 
    10121018                if (cgi->got_eof) { 
    1013                         if (cgi->chunked) { 
     1019                        if (conn->chunked_encoding) { 
    10141020                                cherokee_buffer_add_str (outbuf, LAST_CHUNK); 
    10151021                        } 
     
    10251031 
    10261032        if (inbuf->len > 0) { 
    1027                 if (cgi->chunked)  
    1028                         cherokee_buffer_add_buffer_chunked (outbuf, inbuf); 
    1029                 else  
    1030                         cherokee_buffer_add_buffer (outbuf, inbuf);                      
     1033                cherokee_buffer_add_buffer (outbuf, inbuf);                      
    10311034                cherokee_buffer_clean (inbuf); 
    1032         } 
    1033  
    1034         if ((cgi->chunked) &&  
    1035             (ret == ret_eof)) 
     1035 
     1036                if (conn->chunked_encoding) { 
     1037                        cherokee_buffer_ensure_size (&conn->chunked_len, 13); 
     1038                        cherokee_buffer_add_ulong16 (&conn->chunked_len, outbuf->len); 
     1039                        cherokee_buffer_add_str (&conn->chunked_len, CRLF); 
     1040                } 
     1041        } 
     1042 
     1043        if ((conn->chunked_encoding) && 
     1044            ((ret == ret_eof) || (ret == ret_eof_have_data))) 
    10361045        { 
    10371046                cherokee_buffer_add_str (outbuf, LAST_CHUNK); 
  • cherokee/trunk/cherokee/handler_cgi_base.h

    r1708 r1944  
    7878        char                              *extra_param; 
    7979 
    80         cherokee_boolean_t                 chunked; 
    8180        cherokee_boolean_t                 content_length_set; 
    8281        size_t                             content_length;