Currently ocserv's 404 errors show up as a blank page in most web browsers. Add a simple HTML error page. --- src/worker-http-handlers.c | 16 ++++++++++++++-- src/worker-vpn.c | 9 ++++----- src/worker.h | 1 + 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/worker-http-handlers.c b/src/worker-http-handlers.c index 8303fb262156..e698bc28f13f 100644 --- a/src/worker-http-handlers.c +++ b/src/worker-http-handlers.c @@ -39,6 +39,18 @@ #include <cookies.h> #include <tlslib.h> +static const char html_404[] = "<html><body><h1>404 Not Found</h1></body></html>\r\n"; + +int response_404(worker_st *ws, unsigned http_ver) +{ + if (cstp_printf(ws, "HTTP/1.%u 404 Not found\r\n", http_ver) < 0 || + cstp_printf(ws, "Content-length: %u\r\n", (unsigned)strlen(html_404)) < 0 || + cstp_puts (ws, "Connection: close\r\n\r\n") < 0 || + cstp_puts (ws, html_404) < 0) + return -1; + return 0; +} + #ifdef ANYCONNECT_CLIENT_COMPAT static int send_headers(worker_st *ws, unsigned http_ver, const char *content_type, unsigned content_length) @@ -80,14 +92,14 @@ int get_config_handler(worker_st *ws, unsigned http_ver) if (ws->user_config->xml_config_file == NULL) { oclog(ws, LOG_INFO, "requested config but no config file is set"); - cstp_printf(ws, "HTTP/1.%u 404 Not found\r\n", http_ver); + response_404(ws, http_ver); return -1; } ret = stat(ws->user_config->xml_config_file, &st); if (ret == -1) { oclog(ws, LOG_INFO, "cannot load config file '%s'", ws->user_config->xml_config_file); - cstp_printf(ws, "HTTP/1.%u 404 Not found\r\n", http_ver); + response_404(ws, http_ver); return -1; } diff --git a/src/worker-vpn.c b/src/worker-vpn.c index 3a0214d67c89..676415f47755 100644 --- a/src/worker-vpn.c +++ b/src/worker-vpn.c @@ -524,7 +524,7 @@ void vpn_server(struct worker_st *ws) fn = http_get_url_handler(ws->req.url); if (fn == NULL) { oclog(ws, LOG_HTTP_DEBUG, "unexpected URL %s", ws->req.url); - cstp_puts(ws, "HTTP/1.1 404 Not found\r\n\r\n"); + response_404(ws, parser.http_minor); goto finish; } ret = fn(ws, parser.http_minor); @@ -559,7 +559,7 @@ void vpn_server(struct worker_st *ws) if (fn == NULL) { oclog(ws, LOG_HTTP_DEBUG, "unexpected POST URL %s", ws->req.url); - cstp_puts(ws, "HTTP/1.1 404 Not found\r\n\r\n"); + response_404(ws, parser.http_minor); goto finish; } @@ -578,8 +578,7 @@ void vpn_server(struct worker_st *ws) } else { oclog(ws, LOG_HTTP_DEBUG, "unexpected HTTP method %s", http_method_str(parser.method)); - cstp_printf(ws, "HTTP/1.%u 404 Nah, go away\r\n\r\n", - parser.http_minor); + response_404(ws, parser.http_minor); } finish: @@ -1346,7 +1345,7 @@ static int connect_handler(worker_st * ws) if (strcmp(req->url, "/CSCOSSLC/tunnel") != 0) { oclog(ws, LOG_INFO, "bad connect request: '%s'\n", req->url); - cstp_puts(ws, "HTTP/1.1 404 Nah, go away\r\n\r\n"); + response_404(ws, 1); cstp_fatal_close(ws, GNUTLS_A_ACCESS_DENIED); exit_worker(ws); } diff --git a/src/worker.h b/src/worker.h index 04751a7290b5..bd0ffc2f1fdf 100644 --- a/src/worker.h +++ b/src/worker.h @@ -288,6 +288,7 @@ int get_auth_handler(worker_st *server, unsigned http_ver); int post_auth_handler(worker_st *server, unsigned http_ver); int post_kkdcp_handler(worker_st *server, unsigned http_ver); +int response_404(worker_st *ws, unsigned http_ver); int get_empty_handler(worker_st *server, unsigned http_ver); int get_config_handler(worker_st *ws, unsigned http_ver); int get_string_handler(worker_st *ws, unsigned http_ver); -- 2.7.0