You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2022/08/28 18:46:21 UTC

svn commit: r1903744 - in /httpd/httpd/trunk: docs/manual/mod/mod_proxy_hcheck.xml modules/proxy/mod_proxy.c modules/proxy/mod_proxy.h modules/proxy/mod_proxy_hcheck.c

Author: jim
Date: Sun Aug 28 18:46:21 2022
New Revision: 1903744

URL: http://svn.apache.org/viewvc?rev=1903744&view=rev
Log:
Allow for HTTP/1.1 or HTTP/1.0 protocol health checks

Modified:
    httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml
    httpd/httpd/trunk/modules/proxy/mod_proxy.c
    httpd/httpd/trunk/modules/proxy/mod_proxy.h
    httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c

Modified: httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml?rev=1903744&r1=1903743&r2=1903744&view=diff
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml (original)
+++ httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml Sun Aug 28 18:46:21 2022
@@ -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>

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1903744&r1=1903743&r2=1903744&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Sun Aug 28 18:46:21 2022
@@ -52,6 +52,9 @@ proxy_hcmethods_t PROXY_DECLARE_DATA pro
     {GET, "GET", 1},
     {CPING, "CPING", 0},
     {PROVIDER, "PROVIDER", 0},
+    {OPTIONS11, "OPTIONS11", 1},
+    {HEAD11, "HEAD11", 1},
+    {GET11, "GET11", 1},
     {EOT, NULL, 1}
 };
 

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1903744&r1=1903743&r2=1903744&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Sun Aug 28 18:46:21 2022
@@ -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 {

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c?rev=1903744&r1=1903743&r2=1903744&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c Sun Aug 28 18:46:21 2022
@@ -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 {
@@ -342,7 +343,8 @@ static const char *set_hc_tpsize (cmd_pa
  */
 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;
 
@@ -400,10 +402,12 @@ static request_rec *create_request_rec(a
     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;
@@ -427,28 +431,39 @@ static void create_hcheck_req(wctx_t *wc
 {
     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 : ""),
@@ -460,6 +475,7 @@ static void create_hcheck_req(wctx_t *wc
     }
     wctx->req = req;
     wctx->method = method;
+    wctx->protocol = protocol;
 }
 
 static proxy_worker *hc_get_hcworker(sctx_t *ctx, proxy_worker *worker,
@@ -639,7 +655,7 @@ static apr_status_t hc_check_cping(baton
     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);
     }
@@ -826,7 +842,7 @@ static apr_status_t hc_check_http(baton_
         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);
     }



Re: svn commit: r1903744 - in /httpd/httpd/trunk: docs/manual/mod/mod_proxy_hcheck.xml modules/proxy/mod_proxy.c modules/proxy/mod_proxy.h modules/proxy/mod_proxy_hcheck.c

Posted by Christophe JAILLET <ch...@wanadoo.fr>.
Le 28/08/2022 à 20:46, jim@apache.org a écrit :
> Author: jim
> Date: Sun Aug 28 18:46:21 2022
> New Revision: 1903744
> 
> URL: http://svn.apache.org/viewvc?rev=1903744&view=rev
> Log:
> Allow for HTTP/1.1 or HTTP/1.0 protocol health checks
> 
> Modified:
>      httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml
>      httpd/httpd/trunk/modules/proxy/mod_proxy.c
>      httpd/httpd/trunk/modules/proxy/mod_proxy.h
>      httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
> 
> Modified: httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml?rev=1903744&r1=1903743&r2=1903744&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml (original)
> +++ httpd/httpd/trunk/docs/manual/mod/mod_proxy_hcheck.xml Sun Aug 28 18:46:21 2022
> @@ -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>
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1903744&r1=1903743&r2=1903744&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Sun Aug 28 18:46:21 2022
> @@ -52,6 +52,9 @@ proxy_hcmethods_t PROXY_DECLARE_DATA pro
>       {GET, "GET", 1},
>       {CPING, "CPING", 0},
>       {PROVIDER, "PROVIDER", 0},
> +    {OPTIONS11, "OPTIONS11", 1},
> +    {HEAD11, "HEAD11", 1},
> +    {GET11, "GET11", 1},
>       {EOT, NULL, 1}
>   };
>   
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1903744&r1=1903743&r2=1903744&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Sun Aug 28 18:46:21 2022
> @@ -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 {
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c?rev=1903744&r1=1903743&r2=1903744&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c Sun Aug 28 18:46:21 2022
> @@ -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 {
> @@ -342,7 +343,8 @@ static const char *set_hc_tpsize (cmd_pa
>    */
>   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;
>   
> @@ -400,10 +402,12 @@ static request_rec *create_request_rec(a
>       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;
> @@ -427,28 +431,39 @@ static void create_hcheck_req(wctx_t *wc
>   {
>       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,

I don't think that 'protocol' is at the right place.
Shouldn't it be...

>                                  (wctx->path ? wctx->path : ""),
>                                  (wctx->path && *hc->s->hcuri ? "/" : "" ),
>                                  (*hc->s->hcuri ? hc->s->hcuri : ""),

there?

CJ


> @@ -460,6 +475,7 @@ static void create_hcheck_req(wctx_t *wc
>       }
>       wctx->req = req;
>       wctx->method = method;
> +    wctx->protocol = protocol;
>   }
>   
>   static proxy_worker *hc_get_hcworker(sctx_t *ctx, proxy_worker *worker,
> @@ -639,7 +655,7 @@ static apr_status_t hc_check_cping(baton
>       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);
>       }
> @@ -826,7 +842,7 @@ static apr_status_t hc_check_http(baton_
>           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);
>       }
> 
> 
>