From c8c0e9d9a748618a92404341800432fd84ede7e3 Mon Sep 17 00:00:00 2001 From: Karl DeBisschop Date: Tue, 19 Aug 2003 11:41:08 +0000 Subject: *BUGFIX: LWS is not required betwwen "Location:" header field name and field value git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@685 f882894a-f735-0410-b71e-b25c423dba1c --- plugins/check_http.c | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/plugins/check_http.c b/plugins/check_http.c index 2c13dcdb..6d521096 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c @@ -304,13 +304,13 @@ process_arguments (int argc, char **argv) break; /* Note: H, I, and u must be malloc'd or will fail on redirects */ case 'H': /* Host Name (virtual host) */ - host_name = optarg; + host_name = strdup (optarg); break; case 'I': /* Server IP-address */ - server_address = optarg; + server_address = strdup (optarg); break; case 'u': /* URL path */ - asprintf (&server_url, "%s", optarg); + server_url = strdup (optarg); server_url_length = strlen (server_url); break; case 'p': /* Server port */ @@ -328,7 +328,7 @@ process_arguments (int argc, char **argv) case 'P': /* HTTP POST data in URL encoded format */ if (http_method || http_post_data) break; http_method = strdup("POST"); - http_post_data = optarg; + http_post_data = strdup (optarg); break; case 's': /* string or substring */ strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); @@ -387,7 +387,7 @@ process_arguments (int argc, char **argv) server_address = strdup (argv[c++]); if (host_name == NULL && c < argc) - asprintf (&host_name, "%s", argv[c++]); + host_name = strdup (argv[c++]); if (server_address == NULL) { if (host_name == NULL) @@ -456,11 +456,11 @@ base64 (char *bin, size_t len) #define URI_HOST "%[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]" #define URI_PORT ":%[0123456789]" #define URI_PATH "%[-_.!~*'();/?:@&=+$,%#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]" -#define HD1 HDR_LOCATION URI_HTTP URI_HOST URI_PORT URI_PATH -#define HD2 HDR_LOCATION URI_HTTP URI_HOST URI_PATH -#define HD3 HDR_LOCATION URI_HTTP URI_HOST URI_PORT -#define HD4 HDR_LOCATION URI_HTTP URI_HOST -#define HD5 HDR_LOCATION URI_PATH +#define HD1 URI_HTTP URI_HOST URI_PORT URI_PATH +#define HD2 URI_HTTP URI_HOST URI_PATH +#define HD3 URI_HTTP URI_HOST URI_PORT +#define HD4 URI_HTTP URI_HOST +#define HD5 URI_PATH int check_http (void) @@ -476,6 +476,7 @@ check_http (void) char *buf; char *pos; char *x; + char xx[2]; char *orig_url; long microsec; double elapsed_time; @@ -590,7 +591,7 @@ check_http (void) page = full_page; if (verbose) - printf ("Page is %d characters\n", pagesize); + printf ("%s://%s:%d%s is %d characters\n", server_type, server_address, server_port, server_url, pagesize); /* find status line and null-terminate it */ status_line = page; @@ -669,17 +670,27 @@ check_http (void) strstr (status_line, "306")) { if (onredirect == STATE_DEPENDENT) { + server_address = realloc (server_address, MAX_IPV4_HOSTLENGTH + 1); + if (server_address == NULL) + die (STATE_UNKNOWN,_("ERROR: could not allocate server_address")); + asprintf (&orig_url, "%s", server_url); + if (strcspn (pos, "\r\n") > (size_t)server_url_length) { + server_url = realloc (server_url, strcspn (pos, "\r\n")); + if (server_url == NULL) + die (STATE_UNKNOWN, _("ERROR: could not allocate server_url")); + server_url_length = strcspn (pos, "\r\n"); + } + pos = header; while (pos) { - server_address = realloc (server_address, MAX_IPV4_HOSTLENGTH + 1); - if (server_address == NULL) - die (STATE_UNKNOWN,_("ERROR: could not allocate server_address")); - if (strcspn (pos, "\r\n") > (size_t)server_url_length) { - server_url = realloc (server_url, strcspn (pos, "\r\n")); - if (server_url == NULL) - die (STATE_UNKNOWN, _("ERROR: could not allocate server_url")); - server_url_length = strcspn (pos, "\r\n"); + if (sscanf (pos, "%[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]:%n", xx, &i) > 0) { + pos += i; + pos += strspn (pos, " \t\r\n"); + } else { + pos += (size_t) strcspn (pos, "\r\n"); + pos += (size_t) strspn (pos, "\r\n"); + continue; } /* HDR_LOCATION, URI_HTTP, URI_HOST, URI_PORT, URI_PATH */ if (sscanf (pos, HD1, server_type, server_address, server_port_text, server_url) == 4) { @@ -723,8 +734,6 @@ check_http (void) } check_http (); } - pos += (size_t) strcspn (pos, "\r\n"); - pos += (size_t) strspn (pos, "\r\n"); } /* end while (pos) */ printf (_("UNKNOWN - Could not find redirect location - %s%s"), status_line, (display_html ? "" : "")); -- cgit v1.2.3