From: Simon Ruderich Date: Wed, 16 Mar 2011 16:58:42 +0000 (+0100) Subject: src/connection.c: Send HTML in error messages. X-Git-Tag: 0.2~9 X-Git-Url: https://ruderich.org/simon/gitweb/?p=tlsproxy%2Ftlsproxy.git;a=commitdiff_plain;h=1e4972b997cbdd2b287f60d197c33f38d8ec324d src/connection.c: Send HTML in error messages. --- 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 }