diff options
Diffstat (limited to 'plugins/check_http.c')
-rw-r--r-- | plugins/check_http.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/plugins/check_http.c b/plugins/check_http.c index 2437406f..b73e2d97 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c | |||
@@ -869,6 +869,7 @@ check_http (void) | |||
869 | double elapsed_time_transfer = 0.0; | 869 | double elapsed_time_transfer = 0.0; |
870 | int page_len = 0; | 870 | int page_len = 0; |
871 | int result = STATE_OK; | 871 | int result = STATE_OK; |
872 | char *force_host_header = NULL; | ||
872 | 873 | ||
873 | /* try to connect to the host at the given port number */ | 874 | /* try to connect to the host at the given port number */ |
874 | gettimeofday (&tv_temp, NULL); | 875 | gettimeofday (&tv_temp, NULL); |
@@ -926,26 +927,42 @@ check_http (void) | |||
926 | /* tell HTTP/1.1 servers not to keep the connection alive */ | 927 | /* tell HTTP/1.1 servers not to keep the connection alive */ |
927 | xasprintf (&buf, "%sConnection: close\r\n", buf); | 928 | xasprintf (&buf, "%sConnection: close\r\n", buf); |
928 | 929 | ||
930 | /* check if Host header is explicitly set in options */ | ||
931 | if (http_opt_headers_count) { | ||
932 | for (i = 0; i < http_opt_headers_count ; i++) { | ||
933 | if (strcmp(http_opt_headers[i], "Host: ")) { | ||
934 | force_host_header = http_opt_headers[i]; | ||
935 | } | ||
936 | } | ||
937 | } | ||
938 | |||
929 | /* optionally send the host header info */ | 939 | /* optionally send the host header info */ |
930 | if (host_name) { | 940 | if (host_name) { |
931 | /* | 941 | if (force_host_header) { |
932 | * Specify the port only if we're using a non-default port (see RFC 2616, | 942 | xasprintf (&buf, "%s%s\r\n", buf, force_host_header); |
933 | * 14.23). Some server applications/configurations cause trouble if the | 943 | } |
934 | * (default) port is explicitly specified in the "Host:" header line. | 944 | else { |
935 | */ | 945 | /* |
936 | if ((use_ssl == FALSE && server_port == HTTP_PORT) || | 946 | * Specify the port only if we're using a non-default port (see RFC 2616, |
937 | (use_ssl == TRUE && server_port == HTTPS_PORT) || | 947 | * 14.23). Some server applications/configurations cause trouble if the |
938 | ( server_address != NULL && strcmp(http_method, "CONNECT") == 0 | 948 | * (default) port is explicitly specified in the "Host:" header line. |
949 | */ | ||
950 | if ((use_ssl == FALSE && server_port == HTTP_PORT) || | ||
951 | (use_ssl == TRUE && server_port == HTTPS_PORT) || | ||
952 | (server_address != NULL && strcmp(http_method, "CONNECT") == 0 | ||
939 | && host_name != NULL && use_ssl == TRUE)) | 953 | && host_name != NULL && use_ssl == TRUE)) |
940 | xasprintf (&buf, "%sHost: %s\r\n", buf, host_name); | 954 | xasprintf (&buf, "%sHost: %s\r\n", buf, host_name); |
941 | else | 955 | else |
942 | xasprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port); | 956 | xasprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port); |
957 | } | ||
943 | } | 958 | } |
944 | 959 | ||
945 | /* optionally send any other header tag */ | 960 | /* optionally send any other header tag */ |
946 | if (http_opt_headers_count) { | 961 | if (http_opt_headers_count) { |
947 | for (i = 0; i < http_opt_headers_count ; i++) { | 962 | for (i = 0; i < http_opt_headers_count ; i++) { |
948 | xasprintf (&buf, "%s%s\r\n", buf, http_opt_headers[i]); | 963 | if (force_host_header != http_opt_headers[i]) { |
964 | xasprintf (&buf, "%s%s\r\n", buf, http_opt_headers[i]); | ||
965 | } | ||
949 | } | 966 | } |
950 | /* This cannot be free'd here because a redirection will then try to access this and segfault */ | 967 | /* This cannot be free'd here because a redirection will then try to access this and segfault */ |
951 | /* Covered in a testcase in tests/check_http.t */ | 968 | /* Covered in a testcase in tests/check_http.t */ |