Mercurial > hg > nginx-mail
comparison src/http/ngx_http_request.c @ 10:46833bd150cb NGINX_0_1_5
nginx 0.1.5
*) Bugfix: on Solaris and Linux there may be too many "recvmsg()
returned not enough data" alerts.
*) Bugfix: there were the "writev() failed (22: Invalid argument)"
errors on Solaris in proxy mode without sendfile. On other platforms
that do not support sendfile at all the process got caught in an
endless loop.
*) Bugfix: segmentation fault on Solaris in proxy mode and using
sendfile.
*) Bugfix: segmentation fault on Solaris.
*) Bugfix: on-line upgrade did not work on Linux.
*) Bugfix: the ngx_http_autoindex_module module did not escape the
spaces, the quotes, and the percent signs in the directory listing.
*) Change: the decrease of the copy operations.
*) Feature: the userid_p3p directive.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 11 Nov 2004 00:00:00 +0300 |
parents | 80ba094c6b3e |
children | 6f8b0dc0f8dd |
comparison
equal
deleted
inserted
replaced
9:77eee314ddbd | 10:46833bd150cb |
---|---|
32 static void ngx_http_set_lingering_close(ngx_http_request_t *r); | 32 static void ngx_http_set_lingering_close(ngx_http_request_t *r); |
33 static void ngx_http_lingering_close_handler(ngx_event_t *ev); | 33 static void ngx_http_lingering_close_handler(ngx_event_t *ev); |
34 | 34 |
35 static void ngx_http_client_error(ngx_http_request_t *r, | 35 static void ngx_http_client_error(ngx_http_request_t *r, |
36 int client_error, int error); | 36 int client_error, int error); |
37 static size_t ngx_http_log_error(void *data, char *buf, size_t len); | 37 static u_char *ngx_http_log_error(void *data, u_char *buf, size_t len); |
38 | 38 |
39 | 39 |
40 /* NGX_HTTP_PARSE_... errors */ | 40 /* NGX_HTTP_PARSE_... errors */ |
41 | 41 |
42 static char *client_header_errors[] = { | 42 static char *client_header_errors[] = { |
43 "client %s sent invalid method", | 43 "client %V sent invalid method \"%V\"", |
44 "client %s sent invalid request", | 44 "client %V sent invalid request \"%V\"", |
45 "client %s sent too long URI", | 45 "client %V sent too long URI in request \"%V\"", |
46 "client %s sent invalid method in HTTP/0.9 request", | 46 "client %V sent invalid method in HTTP/0.9 request \"%V\"", |
47 | 47 |
48 "client %s sent invalid header, URL: %s", | 48 "client %V sent invalid header, URL: \"%V\"", |
49 "client %s sent too long header line, URL: %s", | 49 "client %V sent too long header line, URL: \"%V\"", |
50 "client %s sent HTTP/1.1 request without \"Host\" header, URL: %s", | 50 "client %V sent HTTP/1.1 request without \"Host\" header, URL: \"%V\"", |
51 "client %s sent invalid \"Content-Length\" header, URL: %s", | 51 "client %V sent invalid \"Content-Length\" header, URL: \"%V\"", |
52 "client %s sent POST method without \"Content-Length\" header, URL: %s", | 52 "client %V sent POST method without \"Content-Length\" header, URL: \"%V\"", |
53 "client %s sent plain HTTP request to HTTPS port, URL: %s", | |
54 "client %s sent invalid \"Host\" header \"%s\", URL: %s" | |
55 }; | 53 }; |
56 | 54 |
57 | 55 |
58 ngx_http_header_t ngx_http_headers_in[] = { | 56 ngx_http_header_t ngx_http_headers_in[] = { |
59 { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host) }, | 57 { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host) }, |
103 void ngx_http_init_connection(ngx_connection_t *c) | 101 void ngx_http_init_connection(ngx_connection_t *c) |
104 { | 102 { |
105 ngx_event_t *rev; | 103 ngx_event_t *rev; |
106 ngx_http_log_ctx_t *ctx; | 104 ngx_http_log_ctx_t *ctx; |
107 | 105 |
108 if (!(ctx = ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)))) { | 106 if (!(ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t)))) { |
109 ngx_http_close_connection(c); | 107 ngx_http_close_connection(c); |
110 return; | 108 return; |
111 } | 109 } |
112 | 110 |
113 ctx->connection = c->number; | 111 ctx->connection = c->number; |
114 ctx->client = c->addr_text.data; | 112 ctx->client = &c->addr_text; |
115 ctx->action = "reading client request line"; | 113 ctx->action = "reading client request line"; |
114 ctx->request = NULL; | |
116 c->log->data = ctx; | 115 c->log->data = ctx; |
117 c->log->handler = ngx_http_log_error; | 116 c->log->handler = ngx_http_log_error; |
118 c->log_error = NGX_ERROR_INFO; | 117 c->log_error = NGX_ERROR_INFO; |
119 | 118 |
120 rev = c->read; | 119 rev = c->read; |
276 * the server address. | 275 * the server address. |
277 * | 276 * |
278 * AcceptEx() already gave this address. | 277 * AcceptEx() already gave this address. |
279 */ | 278 */ |
280 | 279 |
281 #if (WIN32) | 280 #if (NGX_WIN32) |
282 if (c->local_sockaddr) { | 281 if (c->local_sockaddr) { |
283 r->in_addr = | 282 r->in_addr = |
284 ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr; | 283 ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr; |
285 | 284 |
286 } else { | 285 } else { |
293 return; | 292 return; |
294 } | 293 } |
295 | 294 |
296 r->in_addr = addr_in.sin_addr.s_addr; | 295 r->in_addr = addr_in.sin_addr.s_addr; |
297 | 296 |
298 #if (WIN32) | 297 #if (NGX_WIN32) |
299 } | 298 } |
300 #endif | 299 #endif |
301 | 300 |
302 /* the last in_port->addrs address is "*" */ | 301 /* the last in_port->addrs address is "*" */ |
303 | 302 |
426 | 425 |
427 #if (NGX_HTTP_SSL) | 426 #if (NGX_HTTP_SSL) |
428 | 427 |
429 static void ngx_http_ssl_handshake(ngx_event_t *rev) | 428 static void ngx_http_ssl_handshake(ngx_event_t *rev) |
430 { | 429 { |
431 int n; | 430 u_char buf[1]; |
431 ssize_t n; | |
432 ngx_int_t rc; | 432 ngx_int_t rc; |
433 u_char buf[1]; | |
434 ngx_connection_t *c; | 433 ngx_connection_t *c; |
435 ngx_http_request_t *r; | 434 ngx_http_request_t *r; |
436 | 435 |
437 c = rev->data; | 436 c = rev->data; |
438 r = c->data; | 437 r = c->data; |
452 } | 451 } |
453 | 452 |
454 if (n == 1) { | 453 if (n == 1) { |
455 if (buf[0] == 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) { | 454 if (buf[0] == 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) { |
456 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, | 455 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
457 "https ssl handshake: 0x%X", buf[0]); | 456 "https ssl handshake: 0x%02Xd", buf[0]); |
458 | 457 |
459 c->recv = ngx_ssl_recv; | 458 c->recv = ngx_ssl_recv; |
460 c->send_chain = ngx_ssl_send_chain; | 459 c->send_chain = ngx_ssl_send_chain; |
461 | 460 |
462 rc = ngx_ssl_handshake(c); | 461 rc = ngx_ssl_handshake(c); |
486 #endif | 485 #endif |
487 | 486 |
488 | 487 |
489 static void ngx_http_process_request_line(ngx_event_t *rev) | 488 static void ngx_http_process_request_line(ngx_event_t *rev) |
490 { | 489 { |
491 u_char *p; | |
492 ssize_t n; | 490 ssize_t n; |
493 ngx_int_t rc, rv; | 491 ngx_int_t rc, rv; |
494 ngx_connection_t *c; | 492 ngx_connection_t *c; |
495 ngx_http_request_t *r; | 493 ngx_http_request_t *r; |
496 ngx_http_log_ctx_t *ctx; | 494 ngx_http_log_ctx_t *ctx; |
522 | 520 |
523 if (rc == NGX_OK) { | 521 if (rc == NGX_OK) { |
524 | 522 |
525 /* the request line has been parsed successfully */ | 523 /* the request line has been parsed successfully */ |
526 | 524 |
527 /* copy unparsed URI */ | 525 r->request_line.len = r->request_end - r->request_start; |
528 | 526 r->request_line.data = r->request_start; |
529 r->unparsed_uri.len = r->uri_end - r->uri_start; | 527 |
530 r->unparsed_uri.data = ngx_palloc(r->pool, r->unparsed_uri.len + 1); | |
531 if (r->unparsed_uri.data == NULL) { | |
532 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | |
533 ngx_http_close_connection(c); | |
534 return; | |
535 } | |
536 | |
537 ngx_cpystrn(r->unparsed_uri.data, r->uri_start, | |
538 r->unparsed_uri.len + 1); | |
539 | |
540 | |
541 /* copy URI */ | |
542 | 528 |
543 if (r->args_start) { | 529 if (r->args_start) { |
544 r->uri.len = r->args_start - 1 - r->uri_start; | 530 r->uri.len = r->args_start - 1 - r->uri_start; |
545 } else { | 531 } else { |
546 r->uri.len = r->uri_end - r->uri_start; | 532 r->uri.len = r->uri_end - r->uri_start; |
547 } | 533 } |
548 | 534 |
549 if (!(r->uri.data = ngx_palloc(r->pool, r->uri.len + 1))) { | |
550 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | |
551 ngx_http_close_connection(c); | |
552 return; | |
553 } | |
554 | |
555 if (r->complex_uri || r->quoted_uri) { | 535 if (r->complex_uri || r->quoted_uri) { |
536 | |
537 if (!(r->uri.data = ngx_palloc(r->pool, r->uri.len + 1))) { | |
538 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | |
539 ngx_http_close_connection(c); | |
540 return; | |
541 } | |
542 | |
556 rc = ngx_http_parse_complex_uri(r); | 543 rc = ngx_http_parse_complex_uri(r); |
557 | 544 |
558 if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) { | 545 if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) { |
559 ngx_http_close_request(r, rc); | 546 ngx_http_close_request(r, rc); |
560 ngx_http_close_connection(c); | 547 ngx_http_close_connection(c); |
561 return; | 548 return; |
562 } | 549 } |
563 | 550 |
564 if (rc != NGX_OK) { | 551 if (rc != NGX_OK) { |
565 r->request_line.len = r->request_end - r->request_start; | |
566 r->request_line.data = r->request_start; | |
567 | |
568 ngx_http_client_error(r, rc, NGX_HTTP_BAD_REQUEST); | 552 ngx_http_client_error(r, rc, NGX_HTTP_BAD_REQUEST); |
569 return; | 553 return; |
570 } | 554 } |
571 | 555 |
572 } else { | 556 } else { |
573 ngx_cpystrn(r->uri.data, r->uri_start, r->uri.len + 1); | 557 r->uri.data = r->uri_start; |
574 } | 558 } |
575 | 559 |
576 | 560 r->unparsed_uri.len = r->uri_end - r->uri_start; |
577 r->request_line.len = r->request_end - r->request_start; | 561 r->unparsed_uri.data = r->uri_start; |
578 r->request_line.data = r->request_start; | 562 |
579 r->request_line.data[r->request_line.len] = '\0'; | |
580 | 563 |
581 if (r->method == 0) { | 564 if (r->method == 0) { |
582 r->method_name.len = r->method_end - r->request_start + 1; | 565 r->method_name.len = r->method_end - r->request_start + 1; |
583 r->method_name.data = r->request_line.data; | 566 r->method_name.data = r->request_line.data; |
584 } | 567 } |
585 | 568 |
569 | |
586 if (r->uri_ext) { | 570 if (r->uri_ext) { |
587 | |
588 /* copy URI extention */ | |
589 | |
590 if (r->args_start) { | 571 if (r->args_start) { |
591 r->exten.len = r->args_start - 1 - r->uri_ext; | 572 r->exten.len = r->args_start - 1 - r->uri_ext; |
592 } else { | 573 } else { |
593 r->exten.len = r->uri_end - r->uri_ext; | 574 r->exten.len = r->uri_end - r->uri_ext; |
594 } | 575 } |
595 | 576 |
596 if (!(r->exten.data = ngx_palloc(r->pool, r->exten.len + 1))) { | 577 r->exten.data = r->uri_ext; |
597 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 578 } |
598 ngx_http_close_connection(c); | 579 |
599 return; | |
600 } | |
601 | |
602 ngx_cpystrn(r->exten.data, r->uri_ext, r->exten.len + 1); | |
603 } | |
604 | 580 |
605 if (r->args_start && r->uri_end > r->args_start) { | 581 if (r->args_start && r->uri_end > r->args_start) { |
606 | |
607 /* copy URI arguments */ | |
608 | |
609 r->args.len = r->uri_end - r->args_start; | 582 r->args.len = r->uri_end - r->args_start; |
610 | 583 r->args.data = r->args_start; |
611 if (!(r->args.data = ngx_palloc(r->pool, r->args.len + 1))) { | 584 } |
612 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 585 |
613 ngx_http_close_connection(c); | |
614 return; | |
615 } | |
616 | |
617 ngx_cpystrn(r->args.data, r->args_start, r->args.len + 1); | |
618 } | |
619 | 586 |
620 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | 587 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
621 "http request line: \"%s\"", r->request_line.data); | 588 "http request line: \"%V\"", &r->request_line); |
622 | 589 |
623 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | 590 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
624 "http uri: \"%s\"", r->uri.data); | 591 "http uri: \"%V\"", &r->uri); |
625 | 592 |
626 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | 593 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
627 "http args: \"%s\"", | 594 "http args: \"%V\"", &r->args); |
628 r->args.data ? r->args.data : (u_char *) ""); | |
629 | 595 |
630 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | 596 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
631 "http exten: \"%s\"", | 597 "http exten: \"%V\"", &r->exten); |
632 r->exten.data ? r->exten.data : (u_char *) ""); | 598 |
599 ctx = c->log->data; | |
600 ctx->request = r; | |
633 | 601 |
634 if (r->http_version < NGX_HTTP_VERSION_10) { | 602 if (r->http_version < NGX_HTTP_VERSION_10) { |
635 rev->event_handler = ngx_http_block_read; | 603 rev->event_handler = ngx_http_block_read; |
636 ngx_http_handler(r); | 604 ngx_http_handler(r); |
637 return; | 605 return; |
653 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 621 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
654 ngx_http_close_connection(c); | 622 ngx_http_close_connection(c); |
655 return; | 623 return; |
656 } | 624 } |
657 | 625 |
658 | |
659 ctx = c->log->data; | |
660 ctx->action = "reading client request headers"; | 626 ctx->action = "reading client request headers"; |
661 ctx->url = r->unparsed_uri.data; | |
662 | 627 |
663 rev->event_handler = ngx_http_process_request_headers; | 628 rev->event_handler = ngx_http_process_request_headers; |
664 ngx_http_process_request_headers(rev); | 629 ngx_http_process_request_headers(rev); |
665 | 630 |
666 return; | 631 return; |
667 | 632 |
668 } else if (rc != NGX_AGAIN) { | 633 } else if (rc != NGX_AGAIN) { |
669 | 634 |
670 /* there was error while a request line parsing */ | 635 /* there was error while a request line parsing */ |
671 | 636 |
637 ngx_http_client_error(r, rc, NGX_HTTP_BAD_REQUEST); | |
638 | |
639 #if 0 | |
672 for (p = r->request_start; p < r->header_in->last; p++) { | 640 for (p = r->request_start; p < r->header_in->last; p++) { |
673 if (*p == CR || *p == LF) { | 641 if (*p == CR || *p == LF) { |
674 break; | 642 break; |
675 } | 643 } |
676 } | 644 } |
684 | 652 |
685 ngx_http_client_error(r, rc, | 653 ngx_http_client_error(r, rc, |
686 (rc == NGX_HTTP_PARSE_INVALID_METHOD) ? | 654 (rc == NGX_HTTP_PARSE_INVALID_METHOD) ? |
687 NGX_HTTP_NOT_IMPLEMENTED: | 655 NGX_HTTP_NOT_IMPLEMENTED: |
688 NGX_HTTP_BAD_REQUEST); | 656 NGX_HTTP_BAD_REQUEST); |
657 #endif | |
658 | |
689 return; | 659 return; |
690 } | 660 } |
691 | 661 |
692 /* NGX_AGAIN: a request line parsing is still incomplete */ | 662 /* NGX_AGAIN: a request line parsing is still incomplete */ |
693 | 663 |
809 } | 779 } |
810 } | 780 } |
811 } | 781 } |
812 | 782 |
813 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 783 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
814 "http header: \"%s: %s\"", | 784 "http header: \"%V: %V\"", |
815 h->key.data, h->value.data); | 785 &h->key, &h->value); |
816 | 786 |
817 continue; | 787 continue; |
818 | 788 |
819 } else if (rc == NGX_HTTP_PARSE_HEADER_DONE) { | 789 } else if (rc == NGX_HTTP_PARSE_HEADER_DONE) { |
820 | 790 |
971 | 941 |
972 if (hc->nfree) { | 942 if (hc->nfree) { |
973 b = hc->free[--hc->nfree]; | 943 b = hc->free[--hc->nfree]; |
974 | 944 |
975 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 945 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
976 "http large header free: " PTR_FMT " " SIZE_T_FMT, | 946 "http large header free: %p %uz", |
977 b->pos, b->end - b->last); | 947 b->pos, b->end - b->last); |
978 | 948 |
979 } else if (hc->nbusy < cscf->large_client_header_buffers.num) { | 949 } else if (hc->nbusy < cscf->large_client_header_buffers.num) { |
980 | 950 |
981 if (hc->busy == NULL) { | 951 if (hc->busy == NULL) { |
991 if (b == NULL) { | 961 if (b == NULL) { |
992 return NGX_ERROR; | 962 return NGX_ERROR; |
993 } | 963 } |
994 | 964 |
995 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 965 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
996 "http large header alloc: " PTR_FMT " " SIZE_T_FMT, | 966 "http large header alloc: %p %uz", |
997 b->pos, b->end - b->last); | 967 b->pos, b->end - b->last); |
998 | 968 |
999 } else { | 969 } else { |
1000 return NGX_DECLINED; | 970 return NGX_DECLINED; |
1001 } | 971 } |
1093 | 1063 |
1094 name = r->virtual_names->elts; | 1064 name = r->virtual_names->elts; |
1095 for (i = 0; i < r->virtual_names->nelts; i++) { | 1065 for (i = 0; i < r->virtual_names->nelts; i++) { |
1096 | 1066 |
1097 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 1067 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1098 "server name: %s", name[i].name.data); | 1068 "server name: %V", &name[i].name); |
1099 | 1069 |
1100 if (name[i].wildcard) { | 1070 if (name[i].wildcard) { |
1101 if (r->headers_in.host_name_len <= name[i].name.len) { | 1071 if (r->headers_in.host_name_len <= name[i].name.len) { |
1102 continue; | 1072 continue; |
1103 } | 1073 } |
1577 c = r->connection; | 1547 c = r->connection; |
1578 rev = c->read; | 1548 rev = c->read; |
1579 | 1549 |
1580 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler"); | 1550 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler"); |
1581 | 1551 |
1582 ctx = (ngx_http_log_ctx_t *) c->log->data; | 1552 ctx = c->log->data; |
1583 ctx->action = "closing request"; | 1553 ctx->action = "closing request"; |
1584 | 1554 |
1585 hc = r->http_connection; | 1555 hc = r->http_connection; |
1586 b = r->header_in; | 1556 b = r->header_in; |
1587 | 1557 |
1675 } else { | 1645 } else { |
1676 b->pos = b->start; | 1646 b->pos = b->start; |
1677 b->last = b->start; | 1647 b->last = b->start; |
1678 } | 1648 } |
1679 | 1649 |
1680 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: " PTR_FMT " %d", | 1650 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %d", |
1681 hc->free, hc->nfree); | 1651 hc->free, hc->nfree); |
1682 | 1652 |
1683 if (hc->free) { | 1653 if (hc->free) { |
1684 for (i = 0; i < hc->nfree; i++) { | 1654 for (i = 0; i < hc->nfree; i++) { |
1685 ngx_pfree(c->pool, hc->free[i]); | 1655 ngx_pfree(c->pool, hc->free[i]); |
1687 } | 1657 } |
1688 | 1658 |
1689 hc->nfree = 0; | 1659 hc->nfree = 0; |
1690 } | 1660 } |
1691 | 1661 |
1692 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: " PTR_FMT " %d", | 1662 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %d", |
1693 hc->busy, hc->nbusy); | 1663 hc->busy, hc->nbusy); |
1694 | 1664 |
1695 if (hc->busy) { | 1665 if (hc->busy) { |
1696 for (i = 0; i < hc->nbusy; i++) { | 1666 for (i = 0; i < hc->nbusy; i++) { |
1697 ngx_pfree(c->pool, hc->busy[i]); | 1667 ngx_pfree(c->pool, hc->busy[i]); |
1783 | 1753 |
1784 #if (HAVE_KQUEUE) | 1754 #if (HAVE_KQUEUE) |
1785 | 1755 |
1786 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | 1756 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
1787 if (rev->pending_eof) { | 1757 if (rev->pending_eof) { |
1758 rev->log->handler = NULL; | |
1788 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, | 1759 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, |
1789 "kevent() reported that client %s closed " | 1760 "kevent() reported that client %V closed " |
1790 "keepalive connection", ctx->client); | 1761 "keepalive connection", ctx->client); |
1791 ngx_http_close_connection(c); | 1762 ngx_http_close_connection(c); |
1792 return; | 1763 return; |
1793 } | 1764 } |
1794 } | 1765 } |
1839 | 1810 |
1840 rev->log->handler = NULL; | 1811 rev->log->handler = NULL; |
1841 | 1812 |
1842 if (n == 0) { | 1813 if (n == 0) { |
1843 ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno, | 1814 ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno, |
1844 "client %s closed keepalive connection", ctx->client); | 1815 "client %V closed keepalive connection", ctx->client); |
1845 ngx_http_close_connection(c); | 1816 ngx_http_close_connection(c); |
1846 return; | 1817 return; |
1847 } | 1818 } |
1848 | 1819 |
1849 b->last += n; | 1820 b->last += n; |
2053 | 2024 |
2054 /* STUB */ | 2025 /* STUB */ |
2055 if (r->file.fd != NGX_INVALID_FILE) { | 2026 if (r->file.fd != NGX_INVALID_FILE) { |
2056 if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) { | 2027 if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) { |
2057 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 2028 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, |
2058 ngx_close_file_n " \"%s\" failed", r->file.name.data); | 2029 ngx_close_file_n " \"%V\" failed", &r->file.name); |
2059 } | 2030 } |
2060 } | 2031 } |
2061 | 2032 |
2062 if (r->request_body | 2033 if (r->request_body |
2063 && r->request_body->temp_file | 2034 && r->request_body->temp_file |
2065 { | 2036 { |
2066 if (ngx_close_file(r->request_body->temp_file->file.fd) | 2037 if (ngx_close_file(r->request_body->temp_file->file.fd) |
2067 == NGX_FILE_ERROR) | 2038 == NGX_FILE_ERROR) |
2068 { | 2039 { |
2069 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 2040 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, |
2070 ngx_close_file_n " deleted file \"%s\" failed", | 2041 ngx_close_file_n " deleted file \"%V\" failed", |
2071 r->request_body->temp_file->file.name.data); | 2042 &r->request_body->temp_file->file.name); |
2072 } | 2043 } |
2073 } | 2044 } |
2074 | 2045 |
2075 if (r->connection->timedout) { | 2046 if (r->connection->timedout) { |
2076 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | 2047 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
2086 "setsockopt(SO_LINGER) failed"); | 2057 "setsockopt(SO_LINGER) failed"); |
2087 } | 2058 } |
2088 } | 2059 } |
2089 } | 2060 } |
2090 | 2061 |
2091 /* ctx->url was allocated from r->pool */ | 2062 /* the variuos request strings were allocated from r->pool */ |
2092 ctx = log->data; | 2063 ctx = log->data; |
2093 ctx->url = NULL; | 2064 ctx->request = NULL; |
2094 | 2065 |
2095 r->request_line.len = 0; | 2066 r->request_line.len = 0; |
2096 | 2067 |
2097 ngx_destroy_pool(r->pool); | 2068 ngx_destroy_pool(r->pool); |
2098 | 2069 |
2146 | 2117 |
2147 | 2118 |
2148 static void ngx_http_client_error(ngx_http_request_t *r, | 2119 static void ngx_http_client_error(ngx_http_request_t *r, |
2149 int client_error, int error) | 2120 int client_error, int error) |
2150 { | 2121 { |
2122 u_char *p; | |
2151 ngx_http_log_ctx_t *ctx; | 2123 ngx_http_log_ctx_t *ctx; |
2152 ngx_http_core_srv_conf_t *cscf; | 2124 ngx_http_core_srv_conf_t *cscf; |
2153 | 2125 |
2154 ctx = r->connection->log->data; | 2126 ctx = r->connection->log->data; |
2155 | 2127 |
2162 return; | 2134 return; |
2163 } | 2135 } |
2164 | 2136 |
2165 r->connection->log->handler = NULL; | 2137 r->connection->log->handler = NULL; |
2166 | 2138 |
2167 if (ctx->url) { | 2139 if (ctx->request) { |
2140 | |
2168 switch (client_error) { | 2141 switch (client_error) { |
2169 | 2142 |
2170 case NGX_HTTP_PARSE_INVALID_HOST: | 2143 case NGX_HTTP_PARSE_INVALID_HOST: |
2171 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 2144 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
2172 client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], | 2145 "client %V sent invalid \"Host\" header \"%V\", URL: \"%V\"", |
2173 ctx->client, r->headers_in.host->value.data, ctx->url); | 2146 ctx->client, &r->headers_in.host->value, |
2147 &ctx->request->unparsed_uri); | |
2174 | 2148 |
2175 error = NGX_HTTP_INVALID_HOST; | 2149 error = NGX_HTTP_INVALID_HOST; |
2176 | 2150 |
2177 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); | 2151 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
2178 | 2152 |
2184 | 2158 |
2185 break; | 2159 break; |
2186 | 2160 |
2187 case NGX_HTTP_PARSE_HTTP_TO_HTTPS: | 2161 case NGX_HTTP_PARSE_HTTP_TO_HTTPS: |
2188 error = NGX_HTTP_TO_HTTPS; | 2162 error = NGX_HTTP_TO_HTTPS; |
2189 | 2163 if (ctx->request->headers_in.referer) { |
2190 /* fall through */ | 2164 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
2165 "client %V sent plain HTTP request to HTTPS port, " | |
2166 "URL: \"%V\", referrer \"%V\"", | |
2167 ctx->client, &ctx->request->unparsed_uri, | |
2168 &ctx->request->headers_in.referer->value); | |
2169 | |
2170 } else { | |
2171 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
2172 "client %V sent plain HTTP request to HTTPS port, " | |
2173 "URL: \"%V\"", ctx->client, &ctx->request->unparsed_uri); | |
2174 } | |
2175 | |
2176 break; | |
2191 | 2177 |
2192 default: | 2178 default: |
2193 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 2179 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
2194 client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], | 2180 client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], |
2195 ctx->client, ctx->url); | 2181 ctx->client, &ctx->request->unparsed_uri); |
2196 } | 2182 } |
2197 | 2183 |
2198 } else { | 2184 } else { |
2185 | |
2199 if (error == NGX_HTTP_REQUEST_URI_TOO_LARGE) { | 2186 if (error == NGX_HTTP_REQUEST_URI_TOO_LARGE) { |
2200 r->request_line.len = r->header_in->end - r->request_start; | 2187 r->request_line.len = r->header_in->end - r->request_start; |
2201 r->request_line.data = r->request_start; | 2188 r->request_line.data = r->request_start; |
2189 | |
2190 } else { | |
2191 if (r->request_line.data == NULL) { | |
2192 for (p = r->request_start; p < r->header_in->last; p++) { | |
2193 if (*p == CR || *p == LF) { | |
2194 break; | |
2195 } | |
2196 } | |
2197 | |
2198 r->request_line.len = p - r->request_start; | |
2199 r->request_line.data = r->request_start; | |
2200 } | |
2202 } | 2201 } |
2203 | 2202 |
2204 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 2203 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
2205 client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], | 2204 client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], |
2206 ctx->client); | 2205 ctx->client, &r->request_line); |
2207 } | 2206 } |
2208 | 2207 |
2209 r->connection->log->handler = ngx_http_log_error; | 2208 r->connection->log->handler = ngx_http_log_error; |
2210 | 2209 |
2211 ngx_http_finalize_request(r, error); | 2210 ngx_http_finalize_request(r, error); |
2212 } | 2211 } |
2213 | 2212 |
2214 | 2213 |
2215 static size_t ngx_http_log_error(void *data, char *buf, size_t len) | 2214 static u_char *ngx_http_log_error(void *data, u_char *buf, size_t len) |
2216 { | 2215 { |
2217 ngx_http_log_ctx_t *ctx = data; | 2216 ngx_http_log_ctx_t *ctx = data; |
2218 | 2217 |
2219 if (ctx->action && ctx->url) { | 2218 u_char *p; |
2220 return ngx_snprintf(buf, len, " while %s, client: %s, URL: %s", | 2219 |
2221 ctx->action, ctx->client, ctx->url); | 2220 p = buf; |
2222 | 2221 |
2223 } else if (ctx->action == NULL && ctx->url) { | 2222 if (ctx->action) { |
2224 return ngx_snprintf(buf, len, ", client: %s, URL: %s", | 2223 p = ngx_snprintf(p, len, " while %s", ctx->action); |
2225 ctx->client, ctx->url); | 2224 len -= p - buf; |
2226 | 2225 } |
2227 } else { | 2226 |
2228 return ngx_snprintf(buf, len, " while %s, client: %s", | 2227 p = ngx_snprintf(p, len, ", client: %V", ctx->client); |
2229 ctx->action, ctx->client); | 2228 |
2230 } | 2229 if (ctx->request == NULL) { |
2231 } | 2230 return p; |
2231 } | |
2232 | |
2233 len -= p - buf; | |
2234 | |
2235 p = ngx_snprintf(p, len, ", URL: \"%V\"", &ctx->request->unparsed_uri); | |
2236 | |
2237 if (ctx->request->headers_in.referer == NULL) { | |
2238 return p; | |
2239 } | |
2240 | |
2241 len -= p - buf; | |
2242 | |
2243 return ngx_snprintf(p, len, ", referrer: \"%V\"", | |
2244 &ctx->request->headers_in.referer->value); | |
2245 } |