On Tue, Jun 25, 2024 at 11:35 PM Eric Covener <cove...@gmail.com> wrote: > > On Tue, Jun 25, 2024 at 5:22 PM Eric Covener <cove...@gmail.com> wrote: > > > > On Tue, Jun 25, 2024 at 5:06 PM Eric Covener <cove...@gmail.com> wrote: > > > > > > On Tue, Jun 25, 2024 at 4:35 PM Helmut K. C. Tessarek > > > <tessa...@evermeet.cx> wrote: > > > > > > > > On 2024-06-25 02:53, Ruediger Pluem wrote: > > > > > Can you provide more details on your configuration how you forward > > > > > stuff to fcgi and what request you made? > > > > > > > > Very simple: > > > > > > > > <FilesMatch "\.php$"> > > > > SetHandler "proxy:unix:/run/php82-fpm/xxx.sock|fcgi://xxx" > > > > </FilesMatch> > > > > > > I think this new path needs to account for UDS. The URL is e.g. > > > "unix:/tmp/fake.sock|fcgi://xxx..." during proxy_fcgi_canon so it > > > declines, then the core handler reports the error on the > > > pseudo-filename. > > > > Or for now, skip the newly added proxy_fixup() and escape just > > r->filename before it gets the handler prefixed to it? > > These all seem hairy. We can do something more targetted from the > start to decrease the fallout?
The attached might work, currently testing but sending early if you want to try too.
Index: include/ap_mmn.h =================================================================== --- include/ap_mmn.h (revision 1918625) +++ include/ap_mmn.h (working copy) @@ -601,6 +601,7 @@ * 20120211.131 (2.4.59-dev) Add DAV_WALKTYPE_TOLERANT * 20120211.131 (2.4.60-dev) Add ap_set_content_type_ex(), ap_filepath_merge(), * and AP_REQUEST_TRUSTED_CT BNOTE. + * 20120211.133 (2.4.60-dev) Add ap_proxy_fixup_uds_filename() */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ @@ -608,7 +609,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20120211 #endif -#define MODULE_MAGIC_NUMBER_MINOR 131 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 133 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a Index: modules/proxy/mod_proxy.c =================================================================== --- modules/proxy/mod_proxy.c (revision 1918625) +++ modules/proxy/mod_proxy.c (working copy) @@ -1298,7 +1298,7 @@ static int proxy_handler(request_rec *r) ap_get_module_config(sconf, &proxy_module); apr_array_header_t *proxies = conf->proxies; struct proxy_remote *ents = (struct proxy_remote *) proxies->elts; - int i, rc, access_status; + int rc = DECLINED, access_status, i; int direct_connect = 0; const char *str; apr_int64_t maxfwd; @@ -1314,22 +1314,30 @@ static int proxy_handler(request_rec *r) } if (!r->proxyreq) { - rc = DECLINED; /* We may have forced the proxy handler via config or .htaccess */ if (r->handler && strncmp(r->handler, "proxy:", 6) == 0 && strncmp(r->filename, "proxy:", 6) != 0) { + char *old_filename = r->filename; + /* Still need to fixup/canonicalize r->filename */ r->proxyreq = PROXYREQ_REVERSE; r->filename = apr_pstrcat(r->pool, r->handler, r->filename, NULL); - /* Still need to fixup/canonicalize r->filename */ - rc = proxy_fixup(r); + rc = ap_proxy_fixup_uds_filename(r, &r->filename); + if (rc <= OK) { + rc = proxy_fixup(r); + } + if (rc != OK) { + r->filename = old_filename; + r->proxyreq = 0; + } } - if (rc != OK) { - return rc; - } - } else if (strncmp(r->filename, "proxy:", 6) != 0) { - return DECLINED; } + else if (strncmp(r->filename, "proxy:", 6) == 0) { + rc = OK; + } + if (rc != OK) { + return rc; + } /* handle max-forwards / OPTIONS / TRACE */ if ((str = apr_table_get(r->headers_in, "Max-Forwards"))) { Index: modules/proxy/mod_proxy.h =================================================================== --- modules/proxy/mod_proxy.h (revision 1918625) +++ modules/proxy/mod_proxy.h (working copy) @@ -1003,6 +1003,16 @@ PROXY_DECLARE(proxy_balancer_shared *) ap_proxy_fi proxy_balancer *balancer, unsigned int *index); +/* + * In the case of the reverse proxy, we need to see if we + * were passed a UDS url (eg: from mod_proxy) and adjust uds_path + * as required. + * @param r current request + * @param url request url to be fixed + * @return OK if fixed up, DECLINED if not UDS, or an HTTP_XXX error + */ +PROXY_DECLARE(int) ap_proxy_fixup_uds_filename(request_rec *r, char **url); + /** * Get the most suitable worker and/or balancer for the request * @param worker worker used for processing request Index: modules/proxy/proxy_util.c =================================================================== --- modules/proxy/proxy_util.c (revision 1918625) +++ modules/proxy/proxy_util.c (working copy) @@ -2429,7 +2429,7 @@ static int ap_proxy_retry_worker(const char *proxy * were passed a UDS url (eg: from mod_proxy) and adjust uds_path * as required. */ -static int fix_uds_filename(request_rec *r, char **url) +PROXY_DECLARE(int) ap_proxy_fixup_uds_filename(request_rec *r, char **url) { char *uds_url = r->filename + 6, *origin_url; @@ -2452,7 +2452,7 @@ static int ap_proxy_retry_worker(const char *proxy if (!uds_path) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(10292) "Invalid proxy UDS filename (%s)", r->filename); - return 0; + return HTTP_BAD_REQUEST; } apr_table_setn(r->notes, "uds_path", uds_path); @@ -2464,8 +2464,10 @@ static int ap_proxy_retry_worker(const char *proxy ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, "*: rewrite of url due to UDS(%s): %s (%s)", uds_path, *url, r->filename); + return OK; } - return 1; + + return DECLINED; } PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, @@ -2484,7 +2486,7 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_work ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, "%s: found worker %s for %s", (*worker)->s->scheme, (*worker)->s->name_ex, *url); - if (!forward && !fix_uds_filename(r, url)) { + if (!forward && ap_proxy_fixup_uds_filename(r, url) > OK) { return HTTP_INTERNAL_SERVER_ERROR; } access_status = OK; @@ -2516,7 +2518,7 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_work * regarding the Connection header in the request. */ apr_table_setn(r->subprocess_env, "proxy-nokeepalive", "1"); - if (!fix_uds_filename(r, url)) { + if (ap_proxy_fixup_uds_filename(r, url) > OK) { return HTTP_INTERNAL_SERVER_ERROR; } }