[PATCH ocserv 3/3] Return HTML error message on 404

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux