[Nagiosplug-devel] check_http, redirects and expect
Lamprecht, Andreas
andreas.a.lamprecht at atos.net
Wed Nov 21 14:20:33 CET 2012
Helo!
We recently ran into problems with check_http.
One of our checked webapps redirects to another website and that redirected page sends back a stupid, but correct result code of 494.
The command we run looks ike this:
check_http -p 8080 -c 30 -I ServerIP -u "URL" -f follow -e '302,494'
However, the check always returns OK, even if the redirected page returns a different error code.
It seems check_http is not following redirects when "-e" is used.
This is because of that "if" statement in line 996 . This completely disables the checking for a possible redirection.
994 /* Bypass normal status line check if server_expect was set by user and not default */
995 /* NOTE: After this if/else block msg *MUST* be an asprintf-allocated string */
996 if ( server_expect_yn ) {
997 asprintf (&msg,
998 _("Status line output matched \"%s\" - "), server_expect);
999 if (verbose)
1000 printf ("%s\n",msg);
1001 }
1002 else {
....
1028 /* check redirected page if specified */
1029 else if (http_status >= 300) {
1030
1031 if (onredirect == STATE_DEPENDENT)
1032 redir (header, status_line);
1033 else
1034 result = max_state_alt(onredirect, result);
1035 asprintf (&msg, _("%s - "), status_line);
1036 } /* end if (http_status >= 300) */
1037 else {
i could "fix" this behaviour by simply disabling the "if" in line 996 by adding a " && 0" to the if:
996 if ( server_expect_yn && 0 ) {
That works for the moment, but now check_http finishes with a WARNING state because the status-code is greater than 400.
To fix this, too, i had to change the stauts-code logic to include a check for the expected status code. And since this resulted into a segfault, i had to extend the "if" even further.
The result is this:
1006 /* server errors result in a critical state */
1007 else if (http_status >= 500 && http_status < 600 && ! expected_statuscode (status_line, server_expect) ) {
1008 asprintf (&msg, _("%s - "), status_line);
1009 result = STATE_CRITICAL;
1010 }
1011 /* client errors result in a warning state */
1012 else if (http_status >= 400 && http_status < 500 && ! expected_statuscode (status_line, server_expect) ) {
1013 asprintf (&msg, _("%s - "), status_line);
1014 result = max_state_alt(STATE_WARNING, result);
1015 }
1016 /* check redirected page if specified */
1017 else if (http_status >= 300 && http_status < 400 ) {
This seems to work now.
I am sure that could be done in a more elegant way and i am willing to invest more time in coding a better fix but first of all i would like to check with you guys if such a change in the behaviour of check_http would be acceptable.
Greetings
Andreas Lamprecht
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nagios-plugins.org/archive/devel/attachments/20121121/e33291f5/attachment.html>
More information about the Devel
mailing list