[Nagiosplug-checkins] SF.net SVN: nagiosplug:[2075] nagiosplug/trunk

tonvoon at users.sourceforge.net tonvoon at users.sourceforge.net
Sat Nov 8 03:08:56 CET 2008


Revision: 2075
          http://nagiosplug.svn.sourceforge.net/nagiosplug/?rev=2075&view=rev
Author:   tonvoon
Date:     2008-11-08 02:08:56 +0000 (Sat, 08 Nov 2008)

Log Message:
-----------
check_http now has options to specify the HTTP method (Jan - 2155152)

Modified Paths:
--------------
    nagiosplug/trunk/NEWS
    nagiosplug/trunk/plugins/check_http.c
    nagiosplug/trunk/plugins/tests/check_http.t

Modified: nagiosplug/trunk/NEWS
===================================================================
--- nagiosplug/trunk/NEWS	2008-11-08 01:03:39 UTC (rev 2074)
+++ nagiosplug/trunk/NEWS	2008-11-08 02:08:56 UTC (rev 2075)
@@ -1,6 +1,7 @@
 This file documents the major additions and syntax changes between releases.
 
 1.4.14 ...
+	check_http has options to specify the HTTP method (#2155152)
 	check_users thresholds were not working excatly as documented (>= rather than >)
 	Updated tinderbox_build script to point to new tinderbox server
 	check_ifoperstatus -n flag now works as expected (sf.net #1569488)

Modified: nagiosplug/trunk/plugins/check_http.c
===================================================================
--- nagiosplug/trunk/plugins/check_http.c	2008-11-08 01:03:39 UTC (rev 2074)
+++ nagiosplug/trunk/plugins/check_http.c	2008-11-08 02:08:56 UTC (rev 2075)
@@ -187,6 +187,7 @@
     {"nohtml", no_argument, 0, 'n'},
     {"ssl", no_argument, 0, 'S'},
     {"post", required_argument, 0, 'P'},
+    {"method", required_argument, 0, 'j'},
     {"IP-address", required_argument, 0, 'I'},
     {"url", required_argument, 0, 'u'},
     {"port", required_argument, 0, 'p'},
@@ -228,7 +229,7 @@
   }
 
   while (1) {
-    c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:T:I:a:e:p:s:R:r:u:f:C:nlLSm:M:N", longopts, &option);
+    c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:e:p:s:R:r:u:f:C:nlLSm:M:N", longopts, &option);
     if (c == -1 || c == EOF)
       break;
 
@@ -344,11 +345,17 @@
       strncpy (user_auth, optarg, MAX_INPUT_BUFFER - 1);
       user_auth[MAX_INPUT_BUFFER - 1] = 0;
       break;
-    case 'P': /* HTTP POST data in URL encoded format */
-      if (http_method || http_post_data) break;
-      http_method = strdup("POST");
-      http_post_data = strdup (optarg);
+    case 'P': /* HTTP POST data in URL encoded format; ignored if settings already */
+      if (! http_post_data)
+        http_post_data = strdup (optarg);
+      if (! http_method)
+        http_method = strdup("POST");
       break;
+    case 'j': /* Set HTTP method */
+      if (http_method)
+        free(http_method);
+      http_method = strdup (optarg);
+      break;
     case 's': /* string or substring */
       strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1);
       string_expect[MAX_INPUT_BUFFER - 1] = 0;
@@ -817,7 +824,7 @@
     asprintf (&buf, "%sAuthorization: Basic %s\r\n", buf, auth);
   }
 
-  /* either send http POST data */
+  /* either send http POST data (any data, not only POST)*/
   if (http_post_data) {
     if (http_content_type) {
       asprintf (&buf, "%sContent-Type: %s\r\n", buf, http_content_type);
@@ -1313,6 +1320,8 @@
   printf ("    %s\n", _("URL to GET or POST (default: /)"));
   printf (" %s\n", "-P, --post=STRING");
   printf ("    %s\n", _("URL encoded http POST data"));
+  printf (" %s\n", "-j, --method=STRING  (for example: HEAD, OPTIONS, TRACE, PUT, DELETE)");
+  printf ("    %s\n", _("Set HTTP method."));
   printf (" %s\n", "-N, --no-body");
   printf ("    %s\n", _("Don't wait for document body: stop reading after headers."));
   printf ("    %s\n", _("(Note that this still does an HTTP GET or POST, not a HEAD.)"));
@@ -1396,5 +1405,5 @@
   printf ("       [-a auth] [-f <ok | warn | critcal | follow>] [-e <expect>]\n");
   printf ("       [-s string] [-l] [-r <regex> | -R <case-insensitive regex>] [-P string]\n");
   printf ("       [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>] [-A string]\n");
-  printf ("       [-k string] [-S] [-C <age>] [-T <content-type>]\n");
+  printf ("       [-k string] [-S] [-C <age>] [-T <content-type>] [-j method]\n");
 }

Modified: nagiosplug/trunk/plugins/tests/check_http.t
===================================================================
--- nagiosplug/trunk/plugins/tests/check_http.t	2008-11-08 01:03:39 UTC (rev 2074)
+++ nagiosplug/trunk/plugins/tests/check_http.t	2008-11-08 02:08:56 UTC (rev 2075)
@@ -33,9 +33,7 @@
 	print "Please contact me at: <URL:", $d->url, ">\n";
 	while (my $c = $d->accept ) {
 		while (my $r = $c->get_request) {
-			if ($r->method eq "GET" and $r->url->path eq "/xyzzy") {
-				$c->send_file_response("/etc/passwd");
-			} elsif ($r->method eq "GET" and $r->url->path =~ m^/statuscode/(\d+)^) {
+			if ($r->method eq "GET" and $r->url->path =~ m^/statuscode/(\d+)^) {
 				$c->send_basic_header($1);
 				$c->send_crlf;
 			} elsif ($r->method eq "GET" and $r->url->path =~ m^/file/(.*)^) {
@@ -47,6 +45,18 @@
 				$c->send_crlf;
 				sleep 1;
 				$c->send_response("slow");
+			} elsif ($r->url->path eq "/method") {
+				if ($r->method eq "DELETE") {
+					$c->send_error(RC_METHOD_NOT_ALLOWED);
+				} elsif ($r->method eq "foo") {
+					$c->send_error(RC_NOT_IMPLEMENTED);
+				} else {
+					$c->send_status_line(200, $r->method);
+				}
+			} elsif ($r->url->path eq "/postdata") {
+				$c->send_basic_header;
+				$c->send_crlf;
+				$c->send_response($r->method.":".$r->content);
 			} else {
 				$c->send_error(RC_FORBIDDEN);
 			}
@@ -63,7 +73,7 @@
 }
 
 if (-x "./check_http") {
-	plan tests => 19;
+	plan tests => 39;
 } else {
 	plan skip_all => "No check_http compiled";
 }
@@ -119,3 +129,54 @@
 is( $result->return_code, 2, $cmd);
 like( $result->output, '/^HTTP CRITICAL - Invalid HTTP response received from host on port (\d+): HTTP/1.1 203 Non-Authoritative Information/', "Output correct: ".$result->output );
 
+$cmd = "$command -j HEAD -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 HEAD - 19 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output );
+
+$cmd = "$command -j POST -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 POST - 19 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output );
+
+$cmd = "$command -j GET -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 GET - 18 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output );
+
+$cmd = "$command -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 GET - 18 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output );
+
+$cmd = "$command -P foo -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 POST - 19 bytes in ([\d\.]+) seconds/', "Output correct: ".$result->output );
+
+$cmd = "$command -j DELETE -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 1, $cmd);
+like( $result->output, '/^HTTP WARNING: HTTP/1.1 405 Method Not Allowed/', "Output correct: ".$result->output );
+
+$cmd = "$command -j foo -u /method";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 2, $cmd);
+like( $result->output, '/^HTTP CRITICAL: HTTP/1.1 501 Not Implemented/', "Output correct: ".$result->output );
+
+$cmd = "$command -P stufftoinclude -u /postdata -s POST:stufftoinclude";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 OK - ([\d\.]+) second/', "Output correct: ".$result->output );
+
+$cmd = "$command -j PUT -P stufftoinclude -u /postdata -s PUT:stufftoinclude";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 OK - ([\d\.]+) second/', "Output correct: ".$result->output );
+
+# To confirm that the free doesn't segfault
+$cmd = "$command -P stufftoinclude -j PUT -u /postdata -s PUT:stufftoinclude";
+$result = NPTest->testCmd( $cmd );
+is( $result->return_code, 0, $cmd);
+like( $result->output, '/^HTTP OK HTTP/1.1 200 OK - ([\d\.]+) second/', "Output correct: ".$result->output );
+


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Commits mailing list