> On Nov 29, 2016, at 11:38 AM, Meera Mosale Nataraja <mech...@gmail.com> wrote: > > Hello all, > > I'm working on TS-5024 <https://issues.apache.org/jira/browse/TS-5024> where > the content is gzip’ed multiple times. Please find the sample output > provided below which indicates multiple gzips. > > curl -v -o/dev/null http://proxy-test:8080/get -H "Host: proxy-test" -x > localhost:8080 -H "Accept-encoding: gzip" > > - About to connect() to proxy localhost port 8080 (#0) > - Trying ::1... connected > - Connected to localhost (::1) port 8080 (#0) >> GET http://proxy-test:8080/get HTTP/1.1 >> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 > NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 >> Accept: */* >> Proxy-Connection: Keep-Alive >> Host: proxy-test >> Accept-encoding: gzip >> > % Total % Received % Xferd Average Speed Time Time Time Current > Dload Upload Total Spent Left Speed > 0 0 0 0 0 0 0 0 -::- -::- -::- 0< HTTP/1.1 404 Not Found > < Server: ATS/7.1.0 > < X-Frame-Options: SAMEORIGIN > < X-Xss-Protection: 1; mode=block > < Accept-Ranges: bytes > < X-Content-Type-Options: nosniff > < Content-Type: text/html; charset=UTF-8 > < Cache-Control: max-age=300 > < Expires: Mon, 31 Oct 2016 18:29:44 GMT > < Date: Mon, 31 Oct 2016 18:24:44 GMT > < Content-Encoding: gzip > < Vary: Accept-Encoding > < Content-Encoding: gzip > < Content-Encoding: gzip > < Content-Length: 4456 > < Age: 0 > < Proxy-Connection: keep-alive > > > For example, if OS returns 302 and redirection is enabled, send request > hook is called multiple times and the plugin then registers the > TS_HTTP_READ_RESPONSE_HDR_HOOK multiple times - once for the first request > and again for the redirected request. Hence TSHttpTxnHookAdd API adds the > hook multiple times without checking if the hook is already present in the > list of hooks. This will result in multiple transformations and each of > them trying to gzip the content. > > One solution is to modify the current implementation of TSHttpTxnHookAdd by > adding the functionality to traverse the list of hooks and append the hook > only if it is not present in the list. Please find the changeset provided > below.
This isn’t sufficient when the plugin attaches a new continuation to the hook, eg. esi, pagespeed, cache_range_requests, remap_purge, etc. I don’t think this would be enough for gzip either, since it creates a nee transform continuation each time. > > diff --git proxy/InkAPI.cc <http://inkapi.cc/> proxy/InkAPI.cc > <http://inkapi.cc/> > index 48697d5..8b73779 100644 > --- proxy/InkAPI.cc <http://inkapi.cc/> > +++ proxy/InkAPI.cc <http://inkapi.cc/> > @@ -4599,6 +4599,15 @@ TSHttpTxnHookAdd(TSHttpTxn txnp, TSHttpHookID id, > TSCont contp) > sdk_assert(sdk_sanity_check_hook_id(id) == TS_SUCCESS); > > HttpSM *sm = (HttpSM *)txnp; > + APIHook *hook = sm->txn_hook_get(id); > + > + // Traverse list of hooks and add a particular hook only once > + while (hook != NULL) { > + if (hook->m_cont == (INKContInternal *)contp) { > + return; > + } > + hook = hook->m_link.next; > + } > sm->txn_hook_append(id, (INKContInternal *)contp); > } > > If we think a plugin would need a functionality of calling the hook > multiple times we can add a new API but i can’t think of any plugin that > would need such an API. Please let me know your thoughts and feedback. > > Meera.