comparison src/http/ngx_http_special_response.c @ 635:e67b227c8dbb default tip

Merge with current.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 25 Apr 2011 04:07:55 +0400
parents bb20316269e4
children
comparison
equal deleted inserted replaced
578:f3a9e57d2e17 635:e67b227c8dbb
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 || r->headers_in.chrome) 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_padding) - 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;
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