diff options
Diffstat (limited to 'web/attachments/367917-check_http.HTTP_CONNECT_patch')
-rw-r--r-- | web/attachments/367917-check_http.HTTP_CONNECT_patch | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/web/attachments/367917-check_http.HTTP_CONNECT_patch b/web/attachments/367917-check_http.HTTP_CONNECT_patch new file mode 100644 index 0000000..00a4008 --- /dev/null +++ b/web/attachments/367917-check_http.HTTP_CONNECT_patch | |||
@@ -0,0 +1,145 @@ | |||
1 | *** plugins/check_http.c.orig 2010-03-18 15:05:53.000000000 -0400 | ||
2 | --- plugins/check_http.c 2010-03-23 14:26:48.000000000 -0400 | ||
3 | *************** | ||
4 | *** 121,126 **** | ||
5 | --- 121,127 ---- | ||
6 | char *http_post_data; | ||
7 | char *http_content_type; | ||
8 | char buffer[MAX_INPUT_BUFFER]; | ||
9 | + int http_connect = FALSE; | ||
10 | |||
11 | int process_arguments (int, char **); | ||
12 | int check_http (void); | ||
13 | *************** | ||
14 | *** 186,191 **** | ||
15 | --- 187,193 ---- | ||
16 | {"link", no_argument, 0, 'L'}, | ||
17 | {"nohtml", no_argument, 0, 'n'}, | ||
18 | {"ssl", no_argument, 0, 'S'}, | ||
19 | + {"http-connect", no_argument, 0, 'K'}, | ||
20 | {"post", required_argument, 0, 'P'}, | ||
21 | {"method", required_argument, 0, 'j'}, | ||
22 | {"IP-address", required_argument, 0, 'I'}, | ||
23 | *************** | ||
24 | *** 229,235 **** | ||
25 | } | ||
26 | |||
27 | while (1) { | ||
28 | ! 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); | ||
29 | if (c == -1 || c == EOF) | ||
30 | break; | ||
31 | |||
32 | --- 231,237 ---- | ||
33 | } | ||
34 | |||
35 | while (1) { | ||
36 | ! c = getopt_long (argc, argv, "Vvh46Kt:c:w:A:k:H:P:j:T:I:a:e:p:s:R:r:u:f:C:nlLSm:M:N", longopts, &option); | ||
37 | if (c == -1 || c == EOF) | ||
38 | break; | ||
39 | |||
40 | *************** | ||
41 | *** 401,406 **** | ||
42 | --- 403,411 ---- | ||
43 | usage4 (_("IPv6 support not available")); | ||
44 | #endif | ||
45 | break; | ||
46 | + case 'K': /* use http-connect */ | ||
47 | + http_connect = TRUE; | ||
48 | + break; | ||
49 | case 'v': /* verbose */ | ||
50 | verbose = TRUE; | ||
51 | break; | ||
52 | *************** | ||
53 | *** 790,795 **** | ||
54 | --- 795,807 ---- | ||
55 | die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n")); | ||
56 | #ifdef HAVE_SSL | ||
57 | if (use_ssl == TRUE) { | ||
58 | + | ||
59 | + if (http_connect == TRUE) { | ||
60 | + /* only using port 443 */ | ||
61 | + if (http_connect_through_proxy(host_name, 443, user_agent, sd) != STATE_OK) | ||
62 | + die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open proxy tunnel TCP socket\n")); | ||
63 | + } | ||
64 | + | ||
65 | np_net_ssl_init_with_hostname(sd, host_name); | ||
66 | if (check_cert == TRUE) { | ||
67 | result = np_net_ssl_check_cert(days_till_exp); | ||
68 | *************** | ||
69 | *** 1234,1239 **** | ||
70 | --- 1246,1290 ---- | ||
71 | } | ||
72 | |||
73 | |||
74 | + | ||
75 | + /* start the HTTP CONNECT method exchange with a proxy host */ | ||
76 | + int | ||
77 | + http_connect_through_proxy (char *host_name, int port, char *user_agent, int sd) | ||
78 | + { | ||
79 | + int result; | ||
80 | + char *send_buffer=NULL; | ||
81 | + char recv_buffer[MAX_INPUT_BUFFER]; | ||
82 | + char *status_line; | ||
83 | + char *status_code; | ||
84 | + int http_status; | ||
85 | + | ||
86 | + asprintf( &send_buffer, "CONNECT %s:%d HTTP/1.0\r\nUser-agent: %s\r\n\r\n", host_name, port, user_agent); | ||
87 | + | ||
88 | + result = STATE_OK; | ||
89 | + result = send_tcp_request (sd, send_buffer, recv_buffer, sizeof(recv_buffer)); | ||
90 | + if (result != STATE_OK) | ||
91 | + return result; | ||
92 | + | ||
93 | + status_line = recv_buffer; | ||
94 | + status_line[strcspn(status_line, "\r\n")] = 0; | ||
95 | + strip (status_line); | ||
96 | + if (verbose) | ||
97 | + printf ("HTTP_CONNECT STATUS: %s\n", status_line); | ||
98 | + | ||
99 | + status_code = strchr (status_line, ' ') + sizeof (char); | ||
100 | + if (strspn (status_code, "1234567890") != 3) | ||
101 | + die (STATE_CRITICAL, _("HTTP CRITICAL: HTTP_CONNECT Returns Invalid Status Line (%s)\n"), status_line); | ||
102 | + | ||
103 | + http_status = atoi (status_code); | ||
104 | + | ||
105 | + if (http_status != 200) { | ||
106 | + die (STATE_CRITICAL, _("HTTP CRITICAL: Invalid HTTP Connect Proxy Status (%s)\n"), status_line); | ||
107 | + } | ||
108 | + | ||
109 | + return STATE_OK; | ||
110 | + } | ||
111 | + | ||
112 | + | ||
113 | int | ||
114 | server_type_check (const char *type) | ||
115 | { | ||
116 | *************** | ||
117 | *** 1308,1313 **** | ||
118 | --- 1359,1368 ---- | ||
119 | #ifdef HAVE_SSL | ||
120 | printf (" %s\n", "-S, --ssl"); | ||
121 | printf (" %s\n", _("Connect via SSL. Port defaults to 443")); | ||
122 | + printf (" %s\n", "-K, --http-connect"); | ||
123 | + printf (" %s\n", _("Connect to a proxy using the HTTP CONNECT protocol (SSL tunnel).")); | ||
124 | + printf (" %s\n", _("Requires -S option. Will only connect to host through tunnel")); | ||
125 | + printf (" %s\n", _("on port 443.")); | ||
126 | printf (" %s\n", "-C, --certificate=INTEGER"); | ||
127 | printf (" %s\n", _("Minimum number of days a certificate has to be valid. Port defaults to 443")); | ||
128 | printf (" %s\n", _("(when this option is used the URL is not checked.)\n")); | ||
129 | *************** | ||
130 | *** 1406,1412 **** | ||
131 | { | ||
132 | printf (_("Usage:")); | ||
133 | printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname); | ||
134 | ! printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L]\n"); | ||
135 | printf (" [-a auth] [-f <ok | warn | critcal | follow | sticky | stickyport>]\n"); | ||
136 | printf (" [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); | ||
137 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); | ||
138 | --- 1461,1467 ---- | ||
139 | { | ||
140 | printf (_("Usage:")); | ||
141 | printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname); | ||
142 | ! printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-K]\n"); | ||
143 | printf (" [-a auth] [-f <ok | warn | critcal | follow | sticky | stickyport>]\n"); | ||
144 | printf (" [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); | ||
145 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); | ||