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