From 91caa6fe504f74368af078ea6b8222a994dd89ce Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 27 Jan 2010 11:28:42 +0100 Subject: [PATCH] [MEDIUM] checks: make the HTTP check code add the CRLF itself Currently we cannot easily add headers nor anything to HTTP checks because the requests are pre-formatted with the last CRLF. Make the check code add the CRLF itself so that we can later add useful info. (cherry picked from commit e9d8788fddae2dfdb06f84000718cb9b2f5da37c) --- include/common/defaults.h | 2 +- src/cfgparse.c | 8 ++++---- src/checks.c | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/common/defaults.h b/include/common/defaults.h index f0873cfae4..ae91d322b5 100644 --- a/include/common/defaults.h +++ b/include/common/defaults.h @@ -127,7 +127,7 @@ #define DEF_CHKINTR 2000 #define DEF_FALLTIME 3 #define DEF_RISETIME 2 -#define DEF_CHECK_REQ "OPTIONS / HTTP/1.0\r\n\r\n" +#define DEF_CHECK_REQ "OPTIONS / HTTP/1.0\r\n" #define DEF_SMTP_CHECK_REQ "HELO localhost\r\n" // X-Forwarded-For header default diff --git a/src/cfgparse.c b/src/cfgparse.c index 8903a82052..4765a527db 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2015,12 +2015,12 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) curproxy->check_req = strdup(DEF_CHECK_REQ); /* default request */ curproxy->check_len = strlen(DEF_CHECK_REQ); } else if (!*args[3]) { /* one argument : URI */ - int reqlen = strlen(args[2]) + strlen("OPTIONS HTTP/1.0\r\n\r\n") + 1; + int reqlen = strlen(args[2]) + strlen("OPTIONS HTTP/1.0\r\n") + 1; curproxy->check_req = (char *)malloc(reqlen); curproxy->check_len = snprintf(curproxy->check_req, reqlen, - "OPTIONS %s HTTP/1.0\r\n\r\n", args[2]); /* URI to use */ + "OPTIONS %s HTTP/1.0\r\n", args[2]); /* URI to use */ } else { /* more arguments : METHOD URI [HTTP_VER] */ - int reqlen = strlen(args[2]) + strlen(args[3]) + 3 + strlen("\r\n\r\n"); + int reqlen = strlen(args[2]) + strlen(args[3]) + 3 + strlen("\r\n"); if (*args[4]) reqlen += strlen(args[4]); else @@ -2028,7 +2028,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) curproxy->check_req = (char *)malloc(reqlen); curproxy->check_len = snprintf(curproxy->check_req, reqlen, - "%s %s %s\r\n\r\n", args[2], args[3], *args[4]?args[4]:"HTTP/1.0"); + "%s %s %s\r\n", args[2], args[3], *args[4]?args[4]:"HTTP/1.0"); } } else if (!strcmp(args[1], "ssl-hello-chk")) { diff --git a/src/checks.c b/src/checks.c index a7facf0da8..5445b8831b 100644 --- a/src/checks.c +++ b/src/checks.c @@ -349,6 +349,9 @@ static int event_srv_chk_w(int fd) (s->proxy->options & PR_O_SSL3_CHK) || (s->proxy->options & PR_O_SMTP_CHK)) { int ret; + const char *check_req = s->proxy->check_req; + int check_len = s->proxy->check_len; + /* we want to check if this host replies to HTTP or SSLv3 requests * so we'll send the request, and won't wake the checker up now. */ @@ -358,9 +361,16 @@ static int event_srv_chk_w(int fd) int gmt_time = htonl(date.tv_sec); memcpy(s->proxy->check_req + 11, &gmt_time, 4); } + else if (s->proxy->options & PR_O_HTTP_CHK) { + memcpy(trash, check_req, check_len); + trash[check_len++] = '\r'; + trash[check_len++] = '\n'; + trash[check_len] = '\0'; + check_req = trash; + } - ret = send(fd, s->proxy->check_req, s->proxy->check_len, MSG_DONTWAIT | MSG_NOSIGNAL); - if (ret == s->proxy->check_len) { + ret = send(fd, check_req, check_len, MSG_DONTWAIT | MSG_NOSIGNAL); + if (ret == check_len) { /* we allow up to if nonzero for a responce */ if (s->proxy->timeout.check) t->expire = tick_add_ifset(now_ms, s->proxy->timeout.check); -- 2.47.3