From 1e4972b997cbdd2b287f60d197c33f38d8ec324d Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Wed, 16 Mar 2011 17:58:42 +0100 Subject: [PATCH] src/connection.c: Send HTML in error messages. --- src/connection.c | 53 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/src/connection.c b/src/connection.c index 513be7e..af14477 100644 --- a/src/connection.c +++ b/src/connection.c @@ -36,6 +36,22 @@ * should be a good limit to make processing simpler. */ #define MAX_REQUEST_LINE 4096 +/* Format string used to send HTTP/1.0 error responses to the client. + * + * %s is used 4 times, first three are the error code (no %n$s!), the last is + * the message. */ +#define HTTP_RESPONSE_FORMAT "HTTP/1.0 %s\r\n\ +Content-Type: text/html; charset=US-ASCII\r\n\ +\r\n\ +\n\ +\n\ +%s\n\ +\n\ +

%s

\n\ +

%s

\n\ +\n\ +\n" + static int initialize_tls_session_client(int peer_socket, const char *hostname, @@ -518,16 +534,41 @@ static int read_http_request(FILE *client_fd, char *request, size_t length) { } static void send_bad_request(FILE *client_fd) { - fprintf(client_fd, "HTTP/1.0 400 Bad Request\r\n"); - fprintf(client_fd, "\r\n"); +#define RESPONSE_ERROR "400 Bad Request" +#define RESPONSE_MSG "Your browser sent an invalid request." + fprintf(client_fd, HTTP_RESPONSE_FORMAT, + RESPONSE_ERROR, RESPONSE_ERROR, RESPONSE_ERROR, + RESPONSE_MSG); +#undef RESPONSE_ERROR +#undef RESPONSE_MSG } static void send_forwarding_failure(FILE *client_fd) { - fprintf(client_fd, "HTTP/1.0 503 Forwarding failure\r\n"); - fprintf(client_fd, "\r\n"); +#define RESPONSE_ERROR "503 Forwarding failure" +#define RESPONSE_MSG "Failed to connect to server, check logs." + fprintf(client_fd, HTTP_RESPONSE_FORMAT, + RESPONSE_ERROR, RESPONSE_ERROR, RESPONSE_ERROR, + RESPONSE_MSG); +#undef RESPONSE_ERROR +#undef RESPONSE_MSG } static void tls_send_invalid_cert_message(gnutls_session_t session) { - gnutls_record_send(session, "HTTP/1.0 500 Internal Server Error\r\n", 36); - gnutls_record_send(session, "\r\n", 2); +#define RESPONSE_ERROR "500 Internal Server Error" +#define RESPONSE_MSG "Server certificate validation failed, check logs." + + char buffer[sizeof(HTTP_RESPONSE_FORMAT) - 1 /* '\0' */ + - 4 * 2 /* four %s */ + + (sizeof(RESPONSE_ERROR) - 1 /* '\0' */) * 3 + + sizeof(RESPONSE_MSG) - 1 /* '\0' */ + + 1 /* '\0' */]; + + snprintf(buffer, sizeof(buffer), + HTTP_RESPONSE_FORMAT, + RESPONSE_ERROR, RESPONSE_ERROR, RESPONSE_ERROR, RESPONSE_MSG); + + gnutls_record_send(session, buffer, sizeof(buffer) - 1); + /* don't send trailing '\0' */ +#undef RESPONSE_ERROR +#undef RESPONSE_MSG } -- 2.43.2