aboutsummaryrefslogtreecommitdiff
path: root/plugins/check_http.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/check_http.c')
-rw-r--r--plugins/check_http.c51
1 files 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 ? "</A>" : ""));