Changeset 1944
- Timestamp:
- 09/04/08 14:44:47 (3 months ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/connection-protected.h (modified) (2 diffs)
- cherokee/trunk/cherokee/connection.c (modified) (10 diffs)
- cherokee/trunk/cherokee/handler_cgi_base.c (modified) (5 diffs)
- cherokee/trunk/cherokee/handler_cgi_base.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r1942 r1944 1 2008-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 1 8 2008-09-03 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 9 cherokee/trunk/cherokee/connection-protected.h
r1912 r1944 169 169 */ 170 170 cherokee_post_t post; 171 171 172 uint32_t keepalive; 172 173 time_t timeout; … … 187 188 int regex_ovector[OVECTOR_LEN]; 188 189 int regex_ovecsize; 189 190 191 /* Content Expiration 192 */ 190 193 cherokee_expiration_t expiration; 191 194 time_t expiration_time; 195 196 /* Chunked encoding 197 */ 198 cherokee_boolean_t chunked_encoding; 199 cherokee_buffer_t chunked_len; 192 200 }; 193 201 cherokee/trunk/cherokee/connection.c
r1912 r1944 148 148 n->regex_ovecsize = 0; 149 149 150 n->chunked_encoding = false; 151 cherokee_buffer_init (&n->chunked_len); 152 150 153 *conn = n; 151 154 return ret_ok; … … 188 191 cherokee_buffer_mrproper (&conn->host); 189 192 cherokee_buffer_mrproper (&conn->self_trace); 193 cherokee_buffer_mrproper (&conn->chunked_len); 190 194 191 195 if (conn->validator != NULL) { … … 252 256 conn->expiration = cherokee_expiration_none; 253 257 conn->expiration_time = 0; 258 conn->chunked_encoding = false; 254 259 255 260 memset (conn->regex_ovector, OVECTOR_LEN * sizeof(int), 0); … … 286 291 cherokee_buffer_clean (&conn->query_string); 287 292 cherokee_buffer_clean (&conn->self_trace); 293 cherokee_buffer_clean (&conn->chunked_len); 288 294 289 295 if (conn->validator != NULL) { … … 527 533 cherokee_buffer_add_str (buffer, "Connection: Keep-Alive"CRLF); 528 534 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 534 535 } else { 535 536 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); 536 543 } 537 544 … … 614 621 } 615 622 616 /* It might need to deactive Keep-Alive 623 /* It might need to deactive Keep-Alive after checking the 624 * handler headers.. 617 625 */ 618 626 if ((conn->keepalive != 0) && 627 (conn->chunked_encoding == false) && 619 628 (http_method_with_body (conn->error_code))) 620 629 { … … 623 632 conn->keepalive = 0; 624 633 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)) { 628 635 conn->keepalive = 0; 629 636 } … … 687 694 bufs[0].iov_base = conn->buffer.buf; 688 695 bufs[0].iov_len = conn->buffer.len; 689 if (likely ( conn->mmaped_len > 0)) {696 if (likely (conn->mmaped_len > 0)) { 690 697 bufs[1].iov_base = conn->mmaped; 691 698 bufs[1].iov_len = conn->mmaped_len; … … 851 858 ret_t ret; 852 859 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 } 853 900 854 901 /* Send the buffer content … … 1793 1840 ret = cherokee_header_get_known (&conn->header, header_connection, &ptr, &ptr_len); 1794 1841 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 { 1796 1847 conn->keepalive = 0; 1797 } else if (conn->keepalive == 0) {1798 conn->keepalive = CONN_SRV(conn)->keepalive_max;1799 1848 } 1800 1849 return; cherokee/trunk/cherokee/handler_cgi_base.c
r1941 r1944 72 72 cgi->content_length = 0; 73 73 cgi->content_length_set = false; 74 cgi->chunked = false;75 74 cgi->got_eof = false; 76 75 cgi->file_handler = NULL; … … 968 967 /* Chunked encoding 969 968 */ 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)); 973 974 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), 975 977 (cgi->content_length_set == false), 978 (conn->header.version == http_version_11), 976 979 (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); 983 981 984 982 return ret_ok; … … 987 985 988 986 ret_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; 987 cherokee_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); 993 993 994 994 /* Is it replying a "X-Sendfile" request? … … 1004 1004 TRACE (ENTRIES, "sending stored data: %d bytes\n", cgi->data.len); 1005 1005 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); 1010 1016 cherokee_buffer_clean (&cgi->data); 1011 1017 1012 1018 if (cgi->got_eof) { 1013 if (c gi->chunked) {1019 if (conn->chunked_encoding) { 1014 1020 cherokee_buffer_add_str (outbuf, LAST_CHUNK); 1015 1021 } … … 1025 1031 1026 1032 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); 1031 1034 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))) 1036 1045 { 1037 1046 cherokee_buffer_add_str (outbuf, LAST_CHUNK); cherokee/trunk/cherokee/handler_cgi_base.h
r1708 r1944 78 78 char *extra_param; 79 79 80 cherokee_boolean_t chunked;81 80 cherokee_boolean_t content_length_set; 82 81 size_t content_length;