Skip to content

Commit

Permalink
Allow for HTTP/1.1 or HTTP/1.0 protocol health checks
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1903744 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
jimjag committed Aug 28, 2022
1 parent 7b0b059 commit eb2325b
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 13 deletions.
9 changes: 6 additions & 3 deletions docs/manual/mod/mod_proxy_hcheck.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,12 @@
<tr><th>Method</th><th>Description</th><th>Note</th></tr>
<tr><td>None</td><td>No dynamic health checking done</td><td></td></tr>
<tr><td>TCP</td><td>Check that a socket to the backend can be created: e.g. "are you up"</td><td></td></tr>
<tr><td>OPTIONS</td><td>Send an <code>HTTP OPTIONS</code> request to the backend</td><td>*</td></tr>
<tr><td>HEAD</td><td>Send an <code>HTTP HEAD</code> request to the backend</td><td>*</td></tr>
<tr><td>GET</td><td>Send an <code>HTTP GET</code> request to the backend</td><td>*</td></tr>
<tr><td>OPTIONS</td><td>Send a <code>HTTP OPTIONS</code> request to the backend via <code>HTTP/1.0</code></td><td>*</td></tr>
<tr><td>HEAD</td><td>Send a <code>HTTP HEAD</code> request to the backend via <code>HTTP/1.0</code></td><td>*</td></tr>
<tr><td>GET</td><td>Send a <code>HTTP GET</code> request to the backend via <code>HTTP/1.0</code></td><td>*</td></tr>
<tr><td>OPTIONS11</td><td>Send a <code>HTTP OPTIONS</code> request to the backend via <code>HTTP/1.1</code></td><td>*</td></tr>
<tr><td>HEAD11</td><td>Send a <code>HTTP HEAD</code> request to the backend via <code>HTTP/1.1</code></td><td>*</td></tr>
<tr><td>GET11</td><td>Send a <code>HTTP GET</code> request to the backend via <code>HTTP/1.1</code></td><td>*</td></tr>
<!--
<tr><td>CPING</td><td><strong>AJP only</strong> Do <code>CPING/CPONG</code> check</td><td></td></tr>
<tr><td>PROVIDER</td><td>Name of <code>provider</code> to be used to check health</td><td></td></tr>
Expand Down
3 changes: 3 additions & 0 deletions modules/proxy/mod_proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ proxy_hcmethods_t PROXY_DECLARE_DATA proxy_hcmethods[] = {
{GET, "GET", 1},
{CPING, "CPING", 0},
{PROVIDER, "PROVIDER", 0},
{OPTIONS11, "OPTIONS11", 1},
{HEAD11, "HEAD11", 1},
{GET11, "GET11", 1},
{EOT, NULL, 1}
};

Expand Down
2 changes: 1 addition & 1 deletion modules/proxy/mod_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ enum enctype {
};

typedef enum {
NONE, TCP, OPTIONS, HEAD, GET, CPING, PROVIDER, EOT
NONE, TCP, OPTIONS, HEAD, GET, CPING, PROVIDER, OPTIONS11, HEAD11, GET11, EOT
} hcmethod_t;

typedef struct {
Expand Down
34 changes: 25 additions & 9 deletions modules/proxy/mod_proxy_hcheck.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ typedef struct {
const char *method; /* Method string for the HTTP/AJP request */
const char *req; /* pre-formatted HTTP/AJP request */
proxy_worker *w; /* Pointer to the actual worker */
const char *protocol; /* HTTP 1.0 or 1.1? */
} wctx_t;

typedef struct {
Expand Down Expand Up @@ -342,7 +343,8 @@ static const char *set_hc_tpsize (cmd_parms *cmd, void *dummy, const char *arg)
*/
static request_rec *create_request_rec(apr_pool_t *p, server_rec *s,
proxy_balancer *balancer,
const char *method)
const char *method,
const char *protocol)
{
request_rec *r;

Expand Down Expand Up @@ -400,10 +402,12 @@ static request_rec *create_request_rec(apr_pool_t *p, server_rec *s,
else {
r->header_only = 0;
}

r->protocol = "HTTP/1.0";
r->proto_num = HTTP_VERSION(1, 0);

if ( protocol && (protocol[7] == '1') ) {
r->protocol = "HTTP/1.1";
r->proto_num = HTTP_VERSION(1, 1);
}
r->hostname = NULL;

return r;
Expand All @@ -427,28 +431,39 @@ static void create_hcheck_req(wctx_t *wctx, proxy_worker *hc,
{
char *req = NULL;
const char *method = NULL;
const char *protocol = NULL;

/* TODO: Fold into switch/case below? This seems more obvious */
if ( (hc->s->method == OPTIONS11) || (hc->s->method == HEAD11) || (hc->s->method == GET11) ) {
protocol = "HTTP/1.1";
} else {
protocol = "HTTP/1.0";
}
switch (hc->s->method) {
case OPTIONS:
case OPTIONS11:
method = "OPTIONS";
req = apr_psprintf(p,
"OPTIONS * HTTP/1.0\r\n"
"OPTIONS * %s\r\n"
"Host: %s:%d\r\n"
"\r\n",
"\r\n", protocol,
hc->s->hostname_ex, (int)hc->s->port);
break;

case HEAD:
case HEAD11:
method = "HEAD";
/* fallthru */
case GET:
case GET11:
if (!method) { /* did we fall thru? If not, we are GET */
method = "GET";
}
req = apr_psprintf(p,
"%s %s%s%s HTTP/1.0\r\n"
"%s %s%s%s %s\r\n"
"Host: %s:%d\r\n"
"\r\n",
method,
method, protocol,
(wctx->path ? wctx->path : ""),
(wctx->path && *hc->s->hcuri ? "/" : "" ),
(*hc->s->hcuri ? hc->s->hcuri : ""),
Expand All @@ -460,6 +475,7 @@ static void create_hcheck_req(wctx_t *wctx, proxy_worker *hc,
}
wctx->req = req;
wctx->method = method;
wctx->protocol = protocol;
}

static proxy_worker *hc_get_hcworker(sctx_t *ctx, proxy_worker *worker,
Expand Down Expand Up @@ -639,7 +655,7 @@ static apr_status_t hc_check_cping(baton_t *baton, apr_thread_t *thread)
if ((status = ap_proxy_connect_backend("HCCPING", backend, hc, ctx->s)) != OK) {
return backend_cleanup("HCCPING", backend, ctx->s, status);
}
r = create_request_rec(ptemp, ctx->s, baton->balancer, "CPING");
r = create_request_rec(ptemp, ctx->s, baton->balancer, "CPING", NULL);
if ((status = ap_proxy_connection_create_ex("HCCPING", backend, r)) != OK) {
return backend_cleanup("HCCPING", backend, ctx->s, status);
}
Expand Down Expand Up @@ -826,7 +842,7 @@ static apr_status_t hc_check_http(baton_t *baton, apr_thread_t *thread)
return backend_cleanup("HCOH", backend, ctx->s, status);
}

r = create_request_rec(ptemp, ctx->s, baton->balancer, wctx->method);
r = create_request_rec(ptemp, ctx->s, baton->balancer, wctx->method, wctx->protocol);
if ((status = ap_proxy_connection_create_ex("HCOH", backend, r)) != OK) {
return backend_cleanup("HCOH", backend, ctx->s, status);
}
Expand Down

0 comments on commit eb2325b

Please sign in to comment.