Mercurial > hg > nginx-quic
comparison src/http/ngx_http_core_module.c @ 2474:6175f886ddfb stable-0.6
r2420, r2421, r2435, r2436, r2437 merge:
*) send "100 Continue" for HTTP/1.1 only
*) do not send "100 Continue" for subrequests
*) send "100 Continue" just before reading request body
*) set send() slot for POSIX systems
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 26 Jan 2009 15:22:24 +0000 |
parents | 8298d1be0b44 |
children | a69e3766f698 |
comparison
equal
deleted
inserted
replaced
2473:afba93b8bf06 | 2474:6175f886ddfb |
---|---|
28 #define NGX_HTTP_REQUEST_BODY_FILE_CLEAN 2 | 28 #define NGX_HTTP_REQUEST_BODY_FILE_CLEAN 2 |
29 | 29 |
30 | 30 |
31 static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r, | 31 static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r, |
32 ngx_array_t *locations, ngx_uint_t regex_start, size_t len); | 32 ngx_array_t *locations, ngx_uint_t regex_start, size_t len); |
33 static ngx_int_t ngx_http_core_send_continue(ngx_http_request_t *r); | |
34 | 33 |
35 static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf); | 34 static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf); |
36 static void *ngx_http_core_create_main_conf(ngx_conf_t *cf); | 35 static void *ngx_http_core_create_main_conf(ngx_conf_t *cf); |
37 static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf); | 36 static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf); |
38 static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf); | 37 static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf); |
784 ngx_http_core_find_config_phase(ngx_http_request_t *r, | 783 ngx_http_core_find_config_phase(ngx_http_request_t *r, |
785 ngx_http_phase_handler_t *ph) | 784 ngx_http_phase_handler_t *ph) |
786 { | 785 { |
787 u_char *p; | 786 u_char *p; |
788 size_t len; | 787 size_t len; |
789 ngx_int_t rc, expect; | 788 ngx_int_t rc; |
790 ngx_http_core_loc_conf_t *clcf; | 789 ngx_http_core_loc_conf_t *clcf; |
791 ngx_http_core_srv_conf_t *cscf; | 790 ngx_http_core_srv_conf_t *cscf; |
792 | 791 |
793 r->content_handler = NULL; | 792 r->content_handler = NULL; |
794 r->uri_changed = 0; | 793 r->uri_changed = 0; |
831 | 830 |
832 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE); | 831 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE); |
833 return NGX_OK; | 832 return NGX_OK; |
834 } | 833 } |
835 | 834 |
836 if (r->headers_in.expect) { | |
837 expect = ngx_http_core_send_continue(r); | |
838 | |
839 if (expect != NGX_OK) { | |
840 ngx_http_finalize_request(r, expect); | |
841 return NGX_OK; | |
842 } | |
843 } | |
844 | |
845 if (rc == NGX_HTTP_LOCATION_AUTO_REDIRECT) { | 835 if (rc == NGX_HTTP_LOCATION_AUTO_REDIRECT) { |
846 r->headers_out.location = ngx_list_push(&r->headers_out.headers); | 836 r->headers_out.location = ngx_list_push(&r->headers_out.headers); |
847 if (r->headers_out.location == NULL) { | 837 if (r->headers_out.location == NULL) { |
848 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 838 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
849 return NGX_OK; | 839 return NGX_OK; |
1259 | 1249 |
1260 return NGX_OK; | 1250 return NGX_OK; |
1261 } | 1251 } |
1262 | 1252 |
1263 | 1253 |
1264 static ngx_int_t | |
1265 ngx_http_core_send_continue(ngx_http_request_t *r) | |
1266 { | |
1267 ngx_int_t n; | |
1268 ngx_str_t *expect; | |
1269 | |
1270 if (r->expect_tested) { | |
1271 return NGX_OK; | |
1272 } | |
1273 | |
1274 r->expect_tested = 1; | |
1275 | |
1276 expect = &r->headers_in.expect->value; | |
1277 | |
1278 if (expect->len != sizeof("100-continue") - 1 | |
1279 || ngx_strncasecmp(expect->data, (u_char *) "100-continue", | |
1280 sizeof("100-continue") - 1) | |
1281 != 0) | |
1282 { | |
1283 return NGX_OK; | |
1284 } | |
1285 | |
1286 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1287 "send 100 Continue"); | |
1288 | |
1289 n = r->connection->send(r->connection, | |
1290 (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF, | |
1291 sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1); | |
1292 | |
1293 if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) { | |
1294 return NGX_OK; | |
1295 } | |
1296 | |
1297 /* we assume that such small packet should be send successfully */ | |
1298 | |
1299 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
1300 } | |
1301 | |
1302 | |
1303 ngx_int_t | 1254 ngx_int_t |
1304 ngx_http_set_content_type(ngx_http_request_t *r) | 1255 ngx_http_set_content_type(ngx_http_request_t *r) |
1305 { | 1256 { |
1306 u_char c, *p, *exten; | 1257 u_char c, *p, *exten; |
1307 ngx_str_t *type; | 1258 ngx_str_t *type; |
1859 | 1810 |
1860 sr->internal = 1; | 1811 sr->internal = 1; |
1861 sr->fast_subrequest = 1; | 1812 sr->fast_subrequest = 1; |
1862 | 1813 |
1863 sr->discard_body = r->discard_body; | 1814 sr->discard_body = r->discard_body; |
1815 sr->expect_tested = 1; | |
1864 sr->main_filter_need_in_memory = r->main_filter_need_in_memory; | 1816 sr->main_filter_need_in_memory = r->main_filter_need_in_memory; |
1865 | 1817 |
1866 sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1; | 1818 sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1; |
1867 | 1819 |
1868 ngx_http_handler(sr); | 1820 ngx_http_handler(sr); |