I think the patch is going to restrict plugin registering to the same hook multiple times but i don't think it will restrict number of times a hook is called.
-Vijay On Tue, Nov 29, 2016 at 12:53 PM, Sudheer Vinukonda < sudheervinuko...@yahoo.com.invalid> wrote: > I think there are some plugins that do depend on a hook getting called > multiple times (example, redirect response based plugins like escalate, > collapsed_forwarding etc). > > To solve the issue of multiple gzips, would it be simpler to store in the > continuation the info that gzip has already been completed? If not, may be > Txn arg or even an @header ? > > Thanks, > > Sudheer > > > 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. > > > > 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. > >