From 0378f34d85e4fa2d83bae745c44649ccfb9744bb Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Fri, 8 Aug 2008 02:25:47 +0000 Subject: 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 diff --git a/NEWS b/NEWS index 2e33951..168aee5 100644 --- a/NEWS +++ b/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_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). 1.4.12 27th May 2008 Added ./check_nt -v INSTANCES to count number of instances (Alessandro Ren) diff --git a/THANKS.in b/THANKS.in index 718d0f3..b9a4961 100644 --- a/THANKS.in +++ b/THANKS.in @@ -236,3 +236,4 @@ Jan Wagner Christian Schneemann Rob Windsor Hilko Bengen +Michael Harris diff --git a/plugins/check_http.c b/plugins/check_http.c index 07e0079..f81026f 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c @@ -743,21 +743,23 @@ check_http (void) if (check_cert == TRUE) { result = np_net_ssl_check_cert(days_till_exp); np_net_ssl_cleanup(); - if(sd) close(sd); + if (sd) close(sd); return result; } } #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 */ 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 */ if (http_opt_headers_count) { for (i = 0; i < http_opt_headers_count ; i++) { @@ -835,7 +837,7 @@ check_http (void) #ifdef HAVE_SSL np_net_ssl_cleanup(); #endif - if(sd) close(sd); + if (sd) close(sd); /* reset the alarm */ alarm (0); @@ -1101,13 +1103,13 @@ redir (char *pos, char *status_line) } /* 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); use_ssl = server_type_check (type); } /* URI_HTTP URI_HOST */ - else if(sscanf (pos, HD4, type, addr) == 2) { + else if (sscanf (pos, HD4, type, addr) == 2) { strcpy (url, HTTP_URL); use_ssl = server_type_check (type); i = server_port_check (use_ssl); -- cgit v0.10-9-g596f