From c349438e32a99d1d3171bb4cef6c70815c138c45 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 25 Aug 2008 11:42:57 +0000 Subject: The "-e" option now accepts a comma-delimited list of expected status lines (Sven Nierlein - 1894496). git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@2046 f882894a-f735-0410-b71e-b25c423dba1c diff --git a/NEWS b/NEWS index 641e2f4..c2be902 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ This file documents the major additions and syntax changes between releases. check_snmp now only prints perfdata for non numeric values (#1867716) check_icmp now supports packet size modification check_http now sends the Host header first to fix 301s on servers with vitrual hosts (Michael Harris). + check_http -e now accepts a comma-delimited list of expected status codes libtap now included with this distribution for easier testing. Run ./configure with --enable-libtap 1.4.12 27th May 2008 diff --git a/THANKS.in b/THANKS.in index b9a4961..e63e9f6 100644 --- a/THANKS.in +++ b/THANKS.in @@ -237,3 +237,4 @@ Christian Schneemann Rob Windsor Hilko Bengen Michael Harris +Sven Nierlein diff --git a/plugins/check_http.c b/plugins/check_http.c index f81026f..f54f4ab 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c @@ -573,7 +573,25 @@ parse_time_string (const char *string) } } +/* Checks if the server 'reply' is one of the expected 'statuscodes' */ +static int +expected_statuscode (const char *reply, const char *statuscodes) +{ + char *expected, *code; + int result = 0; + + if ((expected = strdup (statuscodes)) == NULL) + die (STATE_UNKNOWN, _("HTTP UNKNOWN - Memory allocation error\n")); + + for (code = strtok (expected, ","); code != NULL; code = strtok (NULL, ",")) + if (strstr (reply, code) != NULL) { + result = 1; + break; + } + free (expected); + return result; +} static void check_document_dates (const char *headers) @@ -878,14 +896,15 @@ check_http (void) (no_body ? " [[ skipped ]]" : page)); /* make sure the status line matches the response we are looking for */ - if (!strstr (status_line, server_expect)) { + if (!expected_statuscode (status_line, server_expect)) { if (server_port == HTTP_PORT) asprintf (&msg, - _("Invalid HTTP response received from host\n")); + _("Invalid HTTP response received from host: %s\n"), + status_line); else asprintf (&msg, - _("Invalid HTTP response received from host on port %d\n"), - server_port); + _("Invalid HTTP response received from host on port %d: %s\n"), + server_port, status_line); die (STATE_CRITICAL, "HTTP CRITICAL - %s", msg); } @@ -1262,7 +1281,8 @@ print_help (void) #endif printf (" %s\n", "-e, --expect=STRING"); - printf (" %s\n", _("String to expect in first (status) line of server response (default: ")); + printf (" %s\n", _("Comma-delimited list of strings, at least one of them is expected in")); + printf (" %s", _("the first (status) line of the server response (default: ")); printf ("%s)\n", HTTP_EXPECT); printf (" %s\n", _("If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing)")); printf (" %s\n", "-s, --string=STRING"); diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t index d5a7c82..e4d770b 100755 --- a/plugins/tests/check_http.t +++ b/plugins/tests/check_http.t @@ -18,6 +18,8 @@ my $pid = fork(); if ($pid) { # Parent #print "parent\n"; + # give our webserver some time to startup + sleep(1); } else { # Child #print "child\n"; @@ -58,7 +60,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") { } if (-x "./check_http") { - plan tests => 13; + plan tests => 15; } else { plan skip_all => "No check_http compiled"; } @@ -97,5 +99,10 @@ like( $result->output, '/^HTTP OK HTTP/1.1 201 Created - 94 bytes in ([\d\.]+) s $cmd = "$command -u /statuscode/201 -e 200"; $result = NPTest->testCmd( $cmd ); is( $result->return_code, 2, $cmd); -like( $result->output, '/^HTTP CRITICAL - Invalid HTTP response received from host on port /', "Output correct: ".$result->output ); +like( $result->output, '/^HTTP CRITICAL - Invalid HTTP response received from host on port \d+: HTTP/1.1 201 Created/', "Output correct: ".$result->output ); + +$cmd = "$command -u /statuscode/200 -e 200,201,202"; +$result = NPTest->testCmd( $cmd ); +is( $result->return_code, 0, $cmd); +like( $result->output, '/^HTTP OK HTTP/1.1 200 OK - 89 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output ); -- cgit v0.10-9-g596f