diff --git a/src/main/response.c b/src/main/response.c index b45f3dd..97c6ef8 100644 --- a/src/main/response.c +++ b/src/main/response.c @@ -130,42 +130,128 @@ void li_response_send_headers(liConnection *con) { li_chunkqueue_append_string(con->raw_out, head); } +#define SET_LEN_AND_RETURN_STR(x) \ + do { \ + *len = sizeof(x) - 1; \ + return x; \ + } while(0) + +static gchar *li_response_error_description(guint status_code, guint *len) { + switch (status_code) { + /* 4XX client error */ + case 400: SET_LEN_AND_RETURN_STR("

Your browser sent a request that this server could not understand.

"); + case 401: SET_LEN_AND_RETURN_STR( + "

This server could not verify that you are authorized to access the resource requested.
" + "Either you supplied the wrong credentials (e.g. bad password), or your browser doesn't understand how to supply the credentials required.

" + ); + case 402: SET_LEN_AND_RETURN_STR("

Insert coint.

"); + case 403: SET_LEN_AND_RETURN_STR("

You don't have permission to access the requested resource.

"); + case 404: SET_LEN_AND_RETURN_STR("

The requested resource was not found.
Make sure you entered the correct URL in your browser.

\n"); + case 405: SET_LEN_AND_RETURN_STR("

The requested method is not allowed for this resource.

"); + case 406: SET_LEN_AND_RETURN_STR("

An appropriate representation of the requested resource could not be found.

"); + case 407: SET_LEN_AND_RETURN_STR( + "

This server could not verify that you are authorized to access the resource requested.
" + "Either you supplied the wrong credentials (e.g. bad password), or your browser doesn't understand how to supply the credentials required.

" + ); + case 408: SET_LEN_AND_RETURN_STR("

Timeout waiting for the request.

"); + case 409: SET_LEN_AND_RETURN_STR("

The request could not be completed due to a conflict with the current state of the requested resource.

"); + case 410: SET_LEN_AND_RETURN_STR( + "

The requested resource is no longer available on this server and there is no forwarding address.
" + "Please remove all references to this resource.

" + ); + case 411: SET_LEN_AND_RETURN_STR("

The requested method requires a valid Content-Length header.

"); + case 412: SET_LEN_AND_RETURN_STR("

The precondition for this request was not met.

"); + case 413: SET_LEN_AND_RETURN_STR("

Your client sent too much data for this request.

"); + case 414: SET_LEN_AND_RETURN_STR("

The requested URL's length exceeds the configured limit of this server.

"); + case 415: SET_LEN_AND_RETURN_STR("

The supplied request data is not in a format acceptable for processing by this resource.

"); + case 416: SET_LEN_AND_RETURN_STR("

The requested part of this resource was not found.

"); + case 417: SET_LEN_AND_RETURN_STR("

The expectation given in the Expect request-header field could not be met by this server.

"); + case 418: SET_LEN_AND_RETURN_STR("

I have come here to brew coffee and kick ass... and I'm all out of coffee.

"); + case 421: SET_LEN_AND_RETURN_STR("

There are too many connections from your internet address.

"); + case 422: SET_LEN_AND_RETURN_STR("

The request could not be processed.

"); + case 423: SET_LEN_AND_RETURN_STR("

The requested resource is currently locked.

"); + case 424: SET_LEN_AND_RETURN_STR("

The method could not be performed on the resource because the requested action depended on another action and that other action failed.

"); + case 426: SET_LEN_AND_RETURN_STR("

This resource should be accessed via SSL.

"); + /* 5XX server error */ + case 500: SET_LEN_AND_RETURN_STR("

The server encountered an internal error and was unable to complete your request.The request method is not supported by this server.

"); + case 502: SET_LEN_AND_RETURN_STR("

The proxy server received an invalid response from an upstream server.

"); + case 503: SET_LEN_AND_RETURN_STR("

The server is temporarily unable to service your request due to maintenance downtime or capacity problems.
Please try again later.

"); + case 504: SET_LEN_AND_RETURN_STR("

The proxy server did not receive a timely response from the upstream server.

"); + case 505: SET_LEN_AND_RETURN_STR("

The requested http version is not supported by this server.

"); + case 506: SET_LEN_AND_RETURN_STR("

A variant for the requested resource is itself a negotiable resource.The request could not be fullfilled because of insufficient storage available on the server.

"); + case 509: SET_LEN_AND_RETURN_STR("

The available bandwidth limit for this resource has been reached.

"); + case 510: SET_LEN_AND_RETURN_STR("

A mandatory extension policy in the request is not accepted by the server for this resource.

"); + + /* unknown */ + default: SET_LEN_AND_RETURN_STR("

"); + } +} void li_response_send_error_page(liConnection *con) { - gchar status_str[3]; + liVRequest *vr = con->mainvr; + gchar status_code[3]; guint len; gchar *str; + GString *html; + + html = g_string_sized_new(1023); - li_chunkqueue_append_mem(con->out, CONST_STR_LEN( - "\n" - "\n" - "\n" - " \n" - " " + g_string_append_len(html, CONST_STR_LEN( + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n" + "<html>\n" + " <head>\n" + " <title>" )); - li_http_status_to_str(con->mainvr->response.http_status, status_str); + li_http_status_to_str(con->mainvr->response.http_status, status_code); - li_chunkqueue_append_mem(con->out, status_str, 3); - li_chunkqueue_append_mem(con->out, CONST_STR_LEN(" - ")); + g_string_append_len(html, status_code, 3); + g_string_append_len(html, CONST_STR_LEN(" - ")); str = li_http_status_string(con->mainvr->response.http_status, &len); - li_chunkqueue_append_mem(con->out, str, len); + g_string_append_len(html, str, len); - li_chunkqueue_append_mem(con->out, CONST_STR_LEN( + g_string_append_len(html, CONST_STR_LEN( "\n" - " \n" - " \n" - "

" + " \n" + " \n" + " \n" + "
\n" + "

Error " )); - li_chunkqueue_append_mem(con->out, status_str, 3); - li_chunkqueue_append_mem(con->out, CONST_STR_LEN(" - ")); - li_chunkqueue_append_mem(con->out, str, len); + g_string_append_len(html, status_code, 3); + g_string_append_len(html, CONST_STR_LEN(" - ")); + g_string_append_len(html, str, len); + g_string_append_len(html, CONST_STR_LEN("

\n")); - li_chunkqueue_append_mem(con->out, CONST_STR_LEN( - "

\n" - " \n" + str = li_response_error_description(con->mainvr->response.http_status, &len); + g_string_append_len(html, str, len); + + g_string_append_len(html, CONST_STR_LEN("

")); + g_string_append_len(html, GSTR_LEN(CORE_OPTION(LI_CORE_OPTION_SERVER_TAG).string)); + g_string_append_len(html, CONST_STR_LEN( + "

\n" + " \n" + " \n" "\n" )); + + li_chunkqueue_append_string(con->out, html); }