Просмотр исходного кода

Re-structure the HTTP 1.1 headers to prevent 301s on servers with virtual hosts

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@2030 f882894a-f735-0410-b71e-b25c423dba1c
Thomas Guyot-Sionnest 17 лет назад
Родитель
Сommit
0378f34d85
3 измененных файлов с 13 добавлено и 9 удалено
  1. 1 0
      NEWS
  2. 1 0
      THANKS.in
  3. 11 9
      plugins/check_http.c

+ 1 - 0
NEWS

@@ -9,6 +9,7 @@ This file documents the major additions and syntax changes between releases.
 	check_procs now captures stderr in external command and adds to plugin output
 	check_procs now captures stderr in external command and adds to plugin output
 	check_snmp now only prints perfdata for non numeric values (#1867716)
 	check_snmp now only prints perfdata for non numeric values (#1867716)
 	check_icmp now supports packet size modification
 	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).
 
 
 1.4.12 27th May 2008
 1.4.12 27th May 2008
 	Added ./check_nt -v INSTANCES to count number of instances (Alessandro Ren)
 	Added ./check_nt -v INSTANCES to count number of instances (Alessandro Ren)

+ 1 - 0
THANKS.in

@@ -236,3 +236,4 @@ Jan Wagner
 Christian Schneemann
 Christian Schneemann
 Rob Windsor
 Rob Windsor
 Hilko Bengen
 Hilko Bengen
+Michael Harris

+ 11 - 9
plugins/check_http.c

@@ -743,21 +743,23 @@ check_http (void)
     if (check_cert == TRUE) {
     if (check_cert == TRUE) {
       result = np_net_ssl_check_cert(days_till_exp);
       result = np_net_ssl_check_cert(days_till_exp);
       np_net_ssl_cleanup();
       np_net_ssl_cleanup();
-      if(sd) close(sd);
+      if (sd) close(sd);
       return result;
       return result;
     }
     }
   }
   }
 #endif /* HAVE_SSL */
 #endif /* HAVE_SSL */
 
 
-  asprintf (&buf, "%s %s HTTP/1.0\r\n%s\r\n", http_method, server_url, user_agent);
+  /* If a hostname is provided, use HTTP/1.1 and send the hostname before the 
+  *  Useragent. This fixes an issue with getting 301 responses from servers
+  *  with virtual hosts */
+  if (host_name)
+    asprintf (&buf, "%s %s HTTP/1.1\r\nHost: %s\r\n%s\r\n", http_method, server_url, host_name, user_agent);  
+  else
+    asprintf (&buf, "%s %s HTTP/1.0\r\n%s\r\n", http_method, server_url, user_agent);
 
 
   /* tell HTTP/1.1 servers not to keep the connection alive */
   /* tell HTTP/1.1 servers not to keep the connection alive */
   asprintf (&buf, "%sConnection: close\r\n", buf);
   asprintf (&buf, "%sConnection: close\r\n", buf);
 
 
-  /* optionally send the host header info */
-  if (host_name)
-    asprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port);
-
   /* optionally send any other header tag */
   /* optionally send any other header tag */
   if (http_opt_headers_count) {
   if (http_opt_headers_count) {
     for (i = 0; i < http_opt_headers_count ; i++) {
     for (i = 0; i < http_opt_headers_count ; i++) {
@@ -835,7 +837,7 @@ check_http (void)
 #ifdef HAVE_SSL
 #ifdef HAVE_SSL
   np_net_ssl_cleanup();
   np_net_ssl_cleanup();
 #endif
 #endif
-  if(sd) close(sd);
+  if (sd) close(sd);
 
 
   /* reset the alarm */
   /* reset the alarm */
   alarm (0);
   alarm (0);
@@ -1101,13 +1103,13 @@ redir (char *pos, char *status_line)
     }
     }
 
 
     /* URI_HTTP URI_HOST URI_PORT */
     /* URI_HTTP URI_HOST URI_PORT */
-    else if(sscanf (pos, HD3, type, addr, &i) == 3) {
+    else if (sscanf (pos, HD3, type, addr, &i) == 3) {
       strcpy (url, HTTP_URL);
       strcpy (url, HTTP_URL);
       use_ssl = server_type_check (type);
       use_ssl = server_type_check (type);
     }
     }
 
 
     /* URI_HTTP URI_HOST */
     /* URI_HTTP URI_HOST */
-    else if(sscanf (pos, HD4, type, addr) == 2) {
+    else if (sscanf (pos, HD4, type, addr) == 2) {
       strcpy (url, HTTP_URL);
       strcpy (url, HTTP_URL);
       use_ssl = server_type_check (type);
       use_ssl = server_type_check (type);
       i = server_port_check (use_ssl);
       i = server_port_check (use_ssl);