On 04/29/2014 03:51 PM, Jim Jagielski wrote:
On Apr 29, 2014, at 8:41 AM, Jan Kaluža <jkal...@redhat.com> wrote:Because later we have to match the URL of request with some proxy_worker. If you configure ProxyPassMatch like this: ProxyPassMatch ^/test/(\d+)/foo.jpg http://x/$1/foo.jpg Then the proxy_worker name would be "http://x/$1/foo.jpg". If you receive request with URL "http://x/something/foo.jpg", ap_proxy_get_worker() will have to find out the worker with name "http://x/$1/foo.jpg". The question here is how it would do that? The answer used in the patch is "we change the worker name to http://x/*/foo.jpg" and check if the URL ("http://x/something/foo.jpg" in our case) matches that worker. If we store the original name with $N, we will have to find out different way how to match the worker (probably emulating wildcard pattern matching) It would be possible to store only the original name (with "$N" variables), store the flag that the proxy worker is using regex and change ap_proxy_strcmp_ematch() function to treat "$N" as "*", but I don't see any real advantage here.In Yann's suggested patch we don't store match_name where it belongs; so we'd need to put it in shm, which means more memory. Instead, we store as is and add a simple char flag which sez if the stored name is a regex. Much savings.
Hi, could you please check the patch I've attached to this email? It changes following parts of Yann's patch: 1. keep only single name of the worker stored in shared memory. 2. when ProxyPassMatch is used, wshared->is_name_matchable = 1.3. if is_name_matchable == 1, ap_proxy_get_worker() uses ap_proxy_strcmp_ematch() which treats "$N" as '*'.
I've tested this patch a bit and it seems to work for me. Regards, Jan Kaluza
And I have no idea why storing with $1 -> * somehow makes things easier or implies a "different way how to match the worker". Finally, let's think about this deeper... Assume we do have ProxyPassMatch ^/test/(\d+)/foo.jpg http://x/$1/foo.jpg ProxyPassMatch ^/zippy/(\d+)/bar.jpg http://x/$1/omar/propjoe.gif is the intent/desire to have 2 workers or 1? A worker is, in some ways, simply a nickname for the socket related to a host and port. Maybe, in the interests of efficiency and speed, since regexes are slow as it is, a condition could be specified (a limitation, as it were), that when using PPM, only everything up to the 1st potential substitution is considered a unique worker.
httpd-trunk-proxy-matchv2.patch
Description: application/download