--- ../configure.in       2006-10-27 00:51:24.000000000 +0400
+++ configure.in	2008-04-22 17:01:44.000000000 +0400
@@ -145,7 +145,7 @@
 AC_CHECK_LIB(dce,main,SOCKETLIBS="$SOCKETLIBS -ldce")
 AC_CHECK_LIB(nsl,main,SOCKETLIBS="$SOCKETLIBS -lnsl")
 AC_CHECK_LIB(socket,socket,SOCKETLIBS="$SOCKETLIBS -lsocket")
-AC_CHECK_LIB(resolv,main,SOCKETLIBS="$SOCKETLIBS -lresolv")
+AC_CHECK_LIB(resolv,main,SOCKETLIBS="$SOCKETLIBS -lresolv -lcrypt")
 AC_SUBST(SOCKETLIBS)
 
 dnl

--- check_http.c       2006-10-27 00:51:24.000000000 +0400
+++ plugins/check_http.c	2008-04-22 17:49:17.000000000 +0400
@@ -53,7 +53,8 @@
 enum {
   MAX_IPV4_HOSTLENGTH = 255,
   HTTP_PORT = 80,
-  HTTPS_PORT = 443
+  HTTPS_PORT = 443,
+  MAX_PORT = 65535
 };
 
 #ifdef HAVE_SSL
@@ -75,11 +76,12 @@
   MAX_RE_SIZE = 256
 };
 #include "regex.h"
+#include "crypt.h"
 regex_t preg;
 regmatch_t pmatch[REGS];
 char regexp[MAX_RE_SIZE];
 char errbuf[MAX_INPUT_BUFFER];
-int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE;
+int cflags = /* REG_NOSUB | */ REG_EXTENDED /*| REG_NEWLINE*/;
 int errcode;
 int invert_regex = 0;
 
@@ -141,7 +143,7 @@
   /* Set default URL. Must be malloced for subsequent realloc if --onredirect=follow */
   server_url = strdup(HTTP_URL);
   server_url_length = strlen(server_url);
-  asprintf (&user_agent, "User-Agent: check_http/%s (nagios-plugins %s)",
+  asprintf (&user_agent, "User-Agent: motobot/1.0 (+http://matvey.org.ru/motobot.html)",
             clean_revstring (revision), VERSION);
 
   if (process_arguments (argc, argv) == ERROR)
@@ -156,7 +158,7 @@
 
   if (display_html == TRUE)
     printf ("<A HREF=\"%s://%s:%d%s\" target=\"_blank\">", 
-      use_ssl ? "https" : "http", host_name,
+      use_ssl ? "https" : "http", server_address,
       server_port, server_url);
 
   /* initialize alarm signal handling, set socket timeout, start timer */
@@ -995,36 +997,50 @@
   /* Page and Header content checks go here */
   /* these checks should be last */
 
-  if (strlen (string_expect)) {
-    if (strstr (page, string_expect)) {
-      printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
-              status_line, elapsed_time,
-              timestamp, (display_html ? "</A>" : ""),
-              perfd_time (elapsed_time), perfd_size (pagesize));
-      exit (STATE_OK);
-    }
-    else {
-      printf (_("CRITICAL - string not found%s|%s %s\n"),
-              (display_html ? "</A>" : ""),
-              perfd_time (elapsed_time), perfd_size (pagesize));
-      exit (STATE_CRITICAL);
-    }
-  }
-
   if (strlen (regexp)) {
     errcode = regexec (&preg, page, REGS, pmatch, 0);
-    if ((errcode == 0 && invert_regex == 0) || (errcode == REG_NOMATCH && invert_regex == 1)) {
-      printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
+    if (errcode == 0) {
+      int len=pmatch[1].rm_eo - pmatch[1].rm_so;
+      if (len>0){
+	  char smatch[len+1];
+          strncpy(smatch,page+pmatch[1].rm_so,len);
+	  smatch[len]='\0';
+
+	  char *sres=smatch;
+	  if (invert_regex){
+    		sres = crypt(smatch,"00");
+	  }
+	  
+	  if (strlen (string_expect)) {
+	    if (!strcmp(string_expect,sres)){
+    		printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
+	            status_line, elapsed_time,
+    	            timestamp, (display_html ? "</A>" : ""),
+        	    perfd_time (elapsed_time), perfd_size (pagesize));
+	    	exit (STATE_OK);
+	    } else {
+	        msg = strdup(_("pattern does not match"));
+	        printf (_("%s - %s%s|%s %s\n"),
+	            _("CRITICAL"),
+	            msg,
+	            (display_html ? "</A>" : ""),
+	            perfd_time (elapsed_time), perfd_size (pagesize));
+	        exit (STATE_CRITICAL);
+	    }
+	  } else {
+            printf (_("HTTP OK \"%s\"\n"),sres);
+	    exit (STATE_OK);
+	  }
+      } else {
+          printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
               status_line, elapsed_time,
               timestamp, (display_html ? "</A>" : ""),
               perfd_time (elapsed_time), perfd_size (pagesize));
-      exit (STATE_OK);
+	  exit (STATE_OK);
+      }
     }
-    else if ((errcode == REG_NOMATCH && invert_regex == 0) || (errcode == 0 && invert_regex == 1)) {
-      if (invert_regex == 0) 
-        msg = strdup(_("pattern not found"));
-      else 
-        msg = strdup(_("pattern found"));
+    else if (errcode == REG_NOMATCH) {
+      msg = strdup(_("pattern not found"));
       printf (_("%s - %s%s|%s %s\n"),
         _("CRITICAL"),
         msg,
@@ -1039,6 +1055,22 @@
     }
   }
 
+  if (strlen (string_expect)) {
+    if (strstr (page, string_expect)) {
+      printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
+              status_line, elapsed_time,
+              timestamp, (display_html ? "</A>" : ""),
+              perfd_time (elapsed_time), perfd_size (pagesize));
+      exit (STATE_OK);
+    }
+    else {
+      printf (_("CRITICAL - string not found%s|%s %s\n"),
+              (display_html ? "</A>" : ""),
+              perfd_time (elapsed_time), perfd_size (pagesize));
+      exit (STATE_CRITICAL);
+    }
+  }
+
   /* make sure the page is of an appropriate size */
   /* page_len = get_content_length(header); */
   page_len = pagesize;
@@ -1064,14 +1096,14 @@
 
 /* per RFC 2396 */
 #define HDR_LOCATION "%*[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]: "
-#define URI_HTTP "%[HTPShtps]://"
-#define URI_HOST "%[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
-#define URI_PORT ":%[0123456789]"
+#define URI_HTTP "%5[HTPShtps]"
+#define URI_HOST "%255[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
+#define URI_PORT "%6d" /* MAX_PORT's width is 5 chars, 6 to detect overflow */
 #define URI_PATH "%[-_.!~*'();/?:@&=+$,%#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
-#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 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
 
 void
@@ -1082,7 +1114,6 @@
   char xx[2];
   char type[6];
   char *addr;
-  char port[6];
   char *url;
 
   addr = malloc (MAX_IPV4_HOSTLENGTH + 1);
@@ -1094,7 +1125,7 @@
     die (STATE_UNKNOWN, _("Could not allocate url\n"));
 
   while (pos) {
-    sscanf (pos, "%[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]:%n", xx, &i);
+	sscanf (pos, "%1[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]:%n", xx, &i);
     if (i == 0) {
       pos += (size_t) strcspn (pos, "\r\n");
       pos += (size_t) strspn (pos, "\r\n");
@@ -1106,17 +1137,21 @@
     }
 
     pos += i;
-    pos += strspn (pos, " \t\r\n");
+    pos += strspn (pos, " \t");
+    for (; (i = strspn (pos, "\r\n")); pos += i) {
+      pos += i;
+      if (!(i = strspn (pos, " \t"))) {
+	die (STATE_UNKNOWN, _("HTTP UNKNOWN - Empty redirect location%s\n"),display_html ? "</A>" : "");
+	}
+    }
 
-    url = realloc (url, strcspn (pos, "\r\n"));
+    url = realloc (url, strcspn (pos, "\r\n")+ 1);
     if (url == NULL)
       die (STATE_UNKNOWN, _("could not allocate url\n"));
 
     /* URI_HTTP, URI_HOST, URI_PORT, URI_PATH */
-    if (sscanf (pos, HD1, type, addr, port, url) == 4) {
+    if (sscanf (pos, HD1, type, addr, &i, url) == 4)    
       use_ssl = server_type_check (type);
-      i = atoi (port);
-    }
 
     /* URI_HTTP URI_HOST URI_PATH */
     else if (sscanf (pos, HD2, type, addr, url) == 3 ) { 
@@ -1125,10 +1160,9 @@
     }
 
     /* URI_HTTP URI_HOST URI_PORT */
-    else if(sscanf (pos, HD3, type, addr, port) == 3) {
+    else if(sscanf (pos, HD3, type, addr, &i) == 3) {    
       strcpy (url, HTTP_URL);
       use_ssl = server_type_check (type);
-      i = atoi (port);
     }
 
     /* URI_HTTP URI_HOST */
@@ -1148,7 +1182,7 @@
       }
       i = server_port;
       strcpy (type, server_type);
-      strcpy (addr, host_name);
+      strcpy (addr, server_address);
     }           
 
     else {
@@ -1174,7 +1208,6 @@
          _("WARNING - redirection creates an infinite loop - %s://%s:%d%s%s\n"),
          type, addr, i, url, (display_html ? "</A>" : ""));
 
-  server_port = i;
   strcpy (server_type, type);
 
   free (host_name);
@@ -1184,7 +1217,18 @@
   server_address = strdup (addr);
 
   free (server_url);
+  if ((url[0] == '/'))
   server_url = strdup (url);
+  else if (asprintf(&server_url, "/%s", url) == -1)
+      die (STATE_UNKNOWN, _("HTTP UNKNOWN - Could not allocate server_url%s\n"), display_html ? "</A>" : "");
+      free(url);
+      
+      if ((server_port = i) > MAX_PORT)
+          die (STATE_UNKNOWN, _("HTTP UNKNOWN - Redirection to port above %d - %s://%s:%d%s%s\n"),
+               MAX_PORT, server_type, server_address, server_port, server_url, display_html ? "</A>" : "");
+      
+      if (verbose)
+          printf ("Redirection to %s://%s:%d%s\n", server_type, server_address, server_port, server_url);
 
   check_http ();
 }

