summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2010-01-27 11:28:42 +0100
committerWilly Tarreau <w@1wt.eu>2010-01-28 23:16:59 +0100
commit91caa6fe504f74368af078ea6b8222a994dd89ce (patch)
treeeea24bc2d4c0ec41bb0c1526ab6841a75b3b833a /src
parent197538f56e9bdfa47b5ceadd4f2d76ccc1092eb0 (diff)
downloadhaproxy-91caa6fe504f74368af078ea6b8222a994dd89ce.tar.gz
[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)
Diffstat (limited to 'src')
-rw-r--r--src/cfgparse.c8
-rw-r--r--src/checks.c14
2 files changed, 16 insertions, 6 deletions
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 8903a8205..4765a527d 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 a7facf0da..5445b8831 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 <timeout.check> if nonzero for a responce */
if (s->proxy->timeout.check)
t->expire = tick_add_ifset(now_ms, s->proxy->timeout.check);