xref: /unit/src/nxt_http_error.c (revision 906)
1431Sigor@sysoev.ru 
2431Sigor@sysoev.ru /*
3431Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4431Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5431Sigor@sysoev.ru  */
6431Sigor@sysoev.ru 
7431Sigor@sysoev.ru #include <nxt_router.h>
8431Sigor@sysoev.ru #include <nxt_http.h>
9431Sigor@sysoev.ru 
10431Sigor@sysoev.ru 
11431Sigor@sysoev.ru static void nxt_http_request_send_error_body(nxt_task_t *task, void *r,
12431Sigor@sysoev.ru     void *data);
13431Sigor@sysoev.ru 
14431Sigor@sysoev.ru 
15608Sigor@sysoev.ru static const nxt_http_request_state_t  nxt_http_request_send_error_body_state;
16431Sigor@sysoev.ru 
17431Sigor@sysoev.ru 
18431Sigor@sysoev.ru static const char  error[] =
19768Svbart@nginx.com     "<html><head><title>Error</title></head>"
20431Sigor@sysoev.ru     "<body>Error.</body></html>\r\n";
21431Sigor@sysoev.ru 
22431Sigor@sysoev.ru 
23431Sigor@sysoev.ru void
24431Sigor@sysoev.ru nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
25431Sigor@sysoev.ru     nxt_http_status_t status)
26431Sigor@sysoev.ru {
27431Sigor@sysoev.ru     nxt_http_field_t  *content_type;
28431Sigor@sysoev.ru 
29431Sigor@sysoev.ru     nxt_debug(task, "http request error: %d", status);
30431Sigor@sysoev.ru 
31608Sigor@sysoev.ru     if (r->header_sent || r->error) {
32431Sigor@sysoev.ru         goto fail;
33431Sigor@sysoev.ru     }
34431Sigor@sysoev.ru 
35608Sigor@sysoev.ru     r->error = (status == NXT_HTTP_INTERNAL_SERVER_ERROR);
36608Sigor@sysoev.ru 
37431Sigor@sysoev.ru     r->status = status;
38431Sigor@sysoev.ru 
39431Sigor@sysoev.ru     r->resp.fields = nxt_list_create(r->mem_pool, 8, sizeof(nxt_http_field_t));
40*906Sigor@sysoev.ru     if (nxt_slow_path(r->resp.fields == NULL)) {
41431Sigor@sysoev.ru         goto fail;
42431Sigor@sysoev.ru     }
43431Sigor@sysoev.ru 
44431Sigor@sysoev.ru     content_type = nxt_list_zero_add(r->resp.fields);
45431Sigor@sysoev.ru     if (nxt_slow_path(content_type == NULL)) {
46431Sigor@sysoev.ru         goto fail;
47431Sigor@sysoev.ru     }
48431Sigor@sysoev.ru 
49431Sigor@sysoev.ru     nxt_http_field_set(content_type, "Content-Type", "text/html");
50431Sigor@sysoev.ru 
51431Sigor@sysoev.ru     r->resp.content_length = NULL;
52703Svbart@nginx.com     r->resp.content_length_n = nxt_length(error);
53431Sigor@sysoev.ru 
54608Sigor@sysoev.ru     r->state = &nxt_http_request_send_error_body_state;
55431Sigor@sysoev.ru 
56431Sigor@sysoev.ru     nxt_http_request_header_send(task, r);
57431Sigor@sysoev.ru     return;
58431Sigor@sysoev.ru 
59431Sigor@sysoev.ru fail:
60431Sigor@sysoev.ru 
61608Sigor@sysoev.ru     nxt_http_request_error_handler(task, r, r->proto.any);
62431Sigor@sysoev.ru }
63431Sigor@sysoev.ru 
64431Sigor@sysoev.ru 
65608Sigor@sysoev.ru static const nxt_http_request_state_t  nxt_http_request_send_error_body_state
66431Sigor@sysoev.ru     nxt_aligned(64) =
67431Sigor@sysoev.ru {
68431Sigor@sysoev.ru     .ready_handler = nxt_http_request_send_error_body,
69608Sigor@sysoev.ru     .error_handler = nxt_http_request_error_handler,
70431Sigor@sysoev.ru };
71431Sigor@sysoev.ru 
72431Sigor@sysoev.ru 
73431Sigor@sysoev.ru static void
74431Sigor@sysoev.ru nxt_http_request_send_error_body(nxt_task_t *task, void *obj, void *data)
75431Sigor@sysoev.ru {
76608Sigor@sysoev.ru     nxt_buf_t           *out;
77431Sigor@sysoev.ru     nxt_http_request_t  *r;
78431Sigor@sysoev.ru 
79431Sigor@sysoev.ru     r = obj;
80431Sigor@sysoev.ru 
81431Sigor@sysoev.ru     nxt_debug(task, "http request send error body");
82431Sigor@sysoev.ru 
83608Sigor@sysoev.ru     out = nxt_http_buf_mem(task, r, 0);
84431Sigor@sysoev.ru     if (nxt_slow_path(out == NULL)) {
85431Sigor@sysoev.ru         goto fail;
86431Sigor@sysoev.ru     }
87431Sigor@sysoev.ru 
88431Sigor@sysoev.ru     out->mem.start = (u_char *) error;
89431Sigor@sysoev.ru     out->mem.pos = out->mem.start;
90703Svbart@nginx.com     out->mem.free = out->mem.start + nxt_length(error);
91431Sigor@sysoev.ru     out->mem.end = out->mem.free;
92431Sigor@sysoev.ru 
93608Sigor@sysoev.ru     out->next = nxt_http_buf_last(r);
94431Sigor@sysoev.ru 
95431Sigor@sysoev.ru     nxt_http_request_send(task, r, out);
96431Sigor@sysoev.ru 
97431Sigor@sysoev.ru     return;
98431Sigor@sysoev.ru 
99431Sigor@sysoev.ru fail:
100608Sigor@sysoev.ru 
101608Sigor@sysoev.ru     nxt_http_request_error_handler(task, r, r->proto.any);
102431Sigor@sysoev.ru }
103