Mercurial > hg > nginx-mail
comparison src/http/ngx_http_special_response.c @ 665:0b460e61bdcd default tip
Merge with nginx 1.0.0.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 25 Apr 2011 04:22:17 +0400 |
parents | bb20316269e4 |
children |
comparison
equal
deleted
inserted
replaced
572:06419a2298a9 | 665:0b460e61bdcd |
---|---|
29 "</body>" CRLF | 29 "</body>" CRLF |
30 "</html>" CRLF | 30 "</html>" CRLF |
31 ; | 31 ; |
32 | 32 |
33 | 33 |
34 static u_char ngx_http_msie_stub[] = | 34 static u_char ngx_http_msie_padding[] = |
35 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 35 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
36 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 36 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
37 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 37 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
38 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 38 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
39 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 39 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
40 "<!-- The padding to disable MSIE's friendly error page -->" CRLF | 40 "<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF |
41 ; | 41 ; |
42 | 42 |
43 | 43 |
44 static u_char ngx_http_msie_refresh_head[] = | 44 static u_char ngx_http_msie_refresh_head[] = |
45 "<html><head><meta http-equiv=\"Refresh\" content=\"0; URL="; | 45 "<html><head><meta http-equiv=\"Refresh\" content=\"0; URL="; |
63 "<body bgcolor=\"white\">" CRLF | 63 "<body bgcolor=\"white\">" CRLF |
64 "<center><h1>302 Found</h1></center>" CRLF | 64 "<center><h1>302 Found</h1></center>" CRLF |
65 ; | 65 ; |
66 | 66 |
67 | 67 |
68 static char ngx_http_error_303_page[] = | |
69 "<html>" CRLF | |
70 "<head><title>303 See Other</title></head>" CRLF | |
71 "<body bgcolor=\"white\">" CRLF | |
72 "<center><h1>303 See Other</h1></center>" CRLF | |
73 ; | |
74 | |
75 | |
68 static char ngx_http_error_400_page[] = | 76 static char ngx_http_error_400_page[] = |
69 "<html>" CRLF | 77 "<html>" CRLF |
70 "<head><title>400 Bad Request</title></head>" CRLF | 78 "<head><title>400 Bad Request</title></head>" CRLF |
71 "<body bgcolor=\"white\">" CRLF | 79 "<body bgcolor=\"white\">" CRLF |
72 "<center><h1>400 Bad Request</h1></center>" CRLF | 80 "<center><h1>400 Bad Request</h1></center>" CRLF |
188 static char ngx_http_error_416_page[] = | 196 static char ngx_http_error_416_page[] = |
189 "<html>" CRLF | 197 "<html>" CRLF |
190 "<head><title>416 Requested Range Not Satisfiable</title></head>" CRLF | 198 "<head><title>416 Requested Range Not Satisfiable</title></head>" CRLF |
191 "<body bgcolor=\"white\">" CRLF | 199 "<body bgcolor=\"white\">" CRLF |
192 "<center><h1>416 Requested Range Not Satisfiable</h1></center>" CRLF | 200 "<center><h1>416 Requested Range Not Satisfiable</h1></center>" CRLF |
201 ; | |
202 | |
203 | |
204 static char ngx_http_error_494_page[] = | |
205 "<html>" CRLF | |
206 "<head><title>400 Request Header Or Cookie Too Large</title></head>" | |
207 CRLF | |
208 "<body bgcolor=\"white\">" CRLF | |
209 "<center><h1>400 Bad Request</h1></center>" CRLF | |
210 "<center>Request Header Or Cookie Too Large</center>" CRLF | |
193 ; | 211 ; |
194 | 212 |
195 | 213 |
196 static char ngx_http_error_495_page[] = | 214 static char ngx_http_error_495_page[] = |
197 "<html>" CRLF | 215 "<html>" CRLF |
279 #define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 201) | 297 #define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 201) |
280 | 298 |
281 /* ngx_null_string, */ /* 300 */ | 299 /* ngx_null_string, */ /* 300 */ |
282 ngx_string(ngx_http_error_301_page), | 300 ngx_string(ngx_http_error_301_page), |
283 ngx_string(ngx_http_error_302_page), | 301 ngx_string(ngx_http_error_302_page), |
284 ngx_null_string, /* 303 */ | 302 ngx_string(ngx_http_error_303_page), |
285 | 303 |
286 #define NGX_HTTP_LAST_LEVEL_300 304 | 304 #define NGX_HTTP_LAST_LEVEL_300 304 |
287 #define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301) | 305 #define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301) |
288 | 306 |
289 ngx_string(ngx_http_error_400_page), | 307 ngx_string(ngx_http_error_400_page), |
305 ngx_string(ngx_http_error_416_page), | 323 ngx_string(ngx_http_error_416_page), |
306 | 324 |
307 #define NGX_HTTP_LAST_LEVEL_400 417 | 325 #define NGX_HTTP_LAST_LEVEL_400 417 |
308 #define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400) | 326 #define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400) |
309 | 327 |
328 ngx_string(ngx_http_error_494_page), /* 494, request header too large */ | |
310 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ | 329 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ |
311 ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ | 330 ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ |
312 ngx_string(ngx_http_error_497_page), /* 497, http to https */ | 331 ngx_string(ngx_http_error_497_page), /* 497, http to https */ |
313 ngx_string(ngx_http_error_404_page), /* 498, canceled */ | 332 ngx_string(ngx_http_error_404_page), /* 498, canceled */ |
314 ngx_null_string, /* 499, client has closed connection */ | 333 ngx_null_string, /* 499, client has closed connection */ |
419 { | 438 { |
420 /* 4XX */ | 439 /* 4XX */ |
421 err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200 | 440 err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200 |
422 + NGX_HTTP_LEVEL_300; | 441 + NGX_HTTP_LEVEL_300; |
423 | 442 |
424 } else if (error >= NGX_HTTP_OWN_CODES | 443 } else if (error >= NGX_HTTP_NGINX_CODES |
425 && error < NGX_HTTP_LAST_LEVEL_500) | 444 && error < NGX_HTTP_LAST_LEVEL_500) |
426 { | 445 { |
427 /* 49X, 5XX */ | 446 /* 49X, 5XX */ |
428 err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200 | 447 err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_LEVEL_200 |
429 + NGX_HTTP_LEVEL_300 | 448 + NGX_HTTP_LEVEL_300 |
430 + NGX_HTTP_LEVEL_400; | 449 + NGX_HTTP_LEVEL_400; |
431 switch (error) { | 450 switch (error) { |
432 case NGX_HTTP_TO_HTTPS: | 451 case NGX_HTTP_TO_HTTPS: |
433 case NGX_HTTPS_CERT_ERROR: | 452 case NGX_HTTPS_CERT_ERROR: |
434 case NGX_HTTPS_NO_CERT: | 453 case NGX_HTTPS_NO_CERT: |
454 case NGX_HTTP_REQUEST_HEADER_TOO_LARGE: | |
435 r->err_status = NGX_HTTP_BAD_REQUEST; | 455 r->err_status = NGX_HTTP_BAD_REQUEST; |
436 break; | 456 break; |
437 } | 457 } |
438 | 458 |
439 } else { | 459 } else { |
513 | 533 |
514 if (overwrite && overwrite != NGX_HTTP_OK) { | 534 if (overwrite && overwrite != NGX_HTTP_OK) { |
515 r->expect_tested = 1; | 535 r->expect_tested = 1; |
516 } | 536 } |
517 | 537 |
518 r->err_status = overwrite; | 538 if (overwrite >= 0) { |
519 | 539 r->err_status = overwrite; |
520 r->zero_in_uri = 0; | 540 } |
521 | 541 |
522 if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) { | 542 if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) { |
523 return NGX_ERROR; | 543 return NGX_ERROR; |
524 } | 544 } |
525 | 545 |
548 | 568 |
549 if (location == NULL) { | 569 if (location == NULL) { |
550 return NGX_ERROR; | 570 return NGX_ERROR; |
551 } | 571 } |
552 | 572 |
553 r->err_status = NGX_HTTP_MOVED_TEMPORARILY; | 573 if (overwrite >= NGX_HTTP_MOVED_PERMANENTLY |
574 && overwrite <= NGX_HTTP_SEE_OTHER) | |
575 { | |
576 r->err_status = overwrite; | |
577 | |
578 } else { | |
579 r->err_status = NGX_HTTP_MOVED_TEMPORARILY; | |
580 } | |
554 | 581 |
555 location->hash = 1; | 582 location->hash = 1; |
556 location->key.len = sizeof("Location") - 1; | 583 ngx_str_set(&location->key, "Location"); |
557 location->key.data = (u_char *) "Location"; | |
558 location->value = uri; | 584 location->value = uri; |
559 | 585 |
560 r->headers_out.location = location; | 586 r->headers_out.location = location; |
561 | 587 |
562 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | 588 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
563 | 589 |
564 if (clcf->msie_refresh && r->headers_in.msie) { | 590 if (clcf->msie_refresh && r->headers_in.msie) { |
565 return ngx_http_send_refresh(r); | 591 return ngx_http_send_refresh(r); |
566 } | 592 } |
567 | 593 |
568 return ngx_http_send_special_response(r, clcf, NGX_HTTP_MOVED_TEMPORARILY | 594 return ngx_http_send_special_response(r, clcf, r->err_status |
569 - NGX_HTTP_MOVED_PERMANENTLY | 595 - NGX_HTTP_MOVED_PERMANENTLY |
570 + NGX_HTTP_LEVEL_200); | 596 + NGX_HTTP_LEVEL_200); |
571 } | 597 } |
572 | 598 |
573 | 599 |
591 tail = ngx_http_error_tail; | 617 tail = ngx_http_error_tail; |
592 } | 618 } |
593 | 619 |
594 msie_padding = 0; | 620 msie_padding = 0; |
595 | 621 |
596 if (!r->zero_body) { | 622 if (ngx_http_error_pages[err].len) { |
597 if (ngx_http_error_pages[err].len) { | 623 r->headers_out.content_length_n = ngx_http_error_pages[err].len + len; |
598 r->headers_out.content_length_n = ngx_http_error_pages[err].len | 624 if (clcf->msie_padding |
599 + len; | 625 && (r->headers_in.msie || r->headers_in.chrome) |
600 if (clcf->msie_padding | 626 && r->http_version >= NGX_HTTP_VERSION_10 |
601 && r->headers_in.msie | 627 && err >= NGX_HTTP_LEVEL_300) |
602 && r->http_version >= NGX_HTTP_VERSION_10 | 628 { |
603 && err >= NGX_HTTP_LEVEL_300) | 629 r->headers_out.content_length_n += |
604 { | 630 sizeof(ngx_http_msie_padding) - 1; |
605 r->headers_out.content_length_n += | 631 msie_padding = 1; |
606 sizeof(ngx_http_msie_stub) - 1; | 632 } |
607 msie_padding = 1; | 633 |
608 } | 634 r->headers_out.content_type_len = sizeof("text/html") - 1; |
609 | 635 ngx_str_set(&r->headers_out.content_type, "text/html"); |
610 r->headers_out.content_type_len = sizeof("text/html") - 1; | 636 r->headers_out.content_type_lowcase = NULL; |
611 r->headers_out.content_type.len = sizeof("text/html") - 1; | |
612 r->headers_out.content_type.data = (u_char *) "text/html"; | |
613 r->headers_out.content_type_lowcase = NULL; | |
614 | |
615 } else { | |
616 r->headers_out.content_length_n = -1; | |
617 } | |
618 | 637 |
619 } else { | 638 } else { |
620 r->headers_out.content_length_n = 0; | 639 r->headers_out.content_length_n = -1; |
621 err = 0; | |
622 } | 640 } |
623 | 641 |
624 if (r->headers_out.content_length) { | 642 if (r->headers_out.content_length) { |
625 r->headers_out.content_length->hash = 0; | 643 r->headers_out.content_length->hash = 0; |
626 r->headers_out.content_length = NULL; | 644 r->headers_out.content_length = NULL; |
669 if (b == NULL) { | 687 if (b == NULL) { |
670 return NGX_ERROR; | 688 return NGX_ERROR; |
671 } | 689 } |
672 | 690 |
673 b->memory = 1; | 691 b->memory = 1; |
674 b->pos = ngx_http_msie_stub; | 692 b->pos = ngx_http_msie_padding; |
675 b->last = ngx_http_msie_stub + sizeof(ngx_http_msie_stub) - 1; | 693 b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1; |
676 | 694 |
677 out[1].next = &out[2]; | 695 out[1].next = &out[2]; |
678 out[2].buf = b; | 696 out[2].buf = b; |
679 out[2].next = NULL; | 697 out[2].next = NULL; |
680 } | 698 } |
709 + sizeof(ngx_http_msie_refresh_tail) - 1; | 727 + sizeof(ngx_http_msie_refresh_tail) - 1; |
710 | 728 |
711 r->err_status = NGX_HTTP_OK; | 729 r->err_status = NGX_HTTP_OK; |
712 | 730 |
713 r->headers_out.content_type_len = sizeof("text/html") - 1; | 731 r->headers_out.content_type_len = sizeof("text/html") - 1; |
714 r->headers_out.content_type.len = sizeof("text/html") - 1; | 732 ngx_str_set(&r->headers_out.content_type, "text/html"); |
715 r->headers_out.content_type.data = (u_char *) "text/html"; | |
716 r->headers_out.content_type_lowcase = NULL; | 733 r->headers_out.content_type_lowcase = NULL; |
717 | 734 |
718 r->headers_out.location->hash = 0; | 735 r->headers_out.location->hash = 0; |
719 r->headers_out.location = NULL; | 736 r->headers_out.location = NULL; |
720 | 737 |