On Mar 24, 2014, at 9:45 AM, Leif Hedstrom <zw...@apache.org> wrote:

> Hi all,
> 
> 
> We currently have two APIs to set an “error” body. One was added at Yahoo 
> many years ago, and it was done for the wrong reasons (premature optimization 
> being one of them). I’ve made a patch that unifies these two APIs into one, 
> such that you can use TSHttpTxnErrorBodySet() anywhere you could use either 
> of those other two APIs. There are some subtle changes in how the APIs work, 
> which I’ll describe here.
> 
> 1. First, both TSHttpTxnSetHttpRetBody() and TSHttpTxnGetMaxHttpRetBodySize() 
> are removed. I’ve patched all “core” plugins to use the 
> TSHttpTxnErrorBodySet() API, but any non-Apache plugin would break. Hence, 
> this change is going in for v5.0.0, which allows breaking compatibility.
> 
> 2. More importantly, TSHttpTxnErrorBodySet() requires for the body to be heap 
> allocated, whereas TSHttpTxnSetHttpRetBody() used a fixed size (2KB) array on 
> the HttpSM. This was the primary reason why I started looking into this, 
> since this “simple” change reduces the size of the HttpSM by 25%.

Nice!

> 3. In order to make the TSHttpTxnErrorBodySet() API easier to use, I’ve 
> changed the content type argument to not transfer ownership. The common 
> (well, exclusive) pattern using this API used to be 
> 
>       TSHttpTxnErrorBodySet(txnp, body, body_len, TSstrdup(“plain/html”));
> 
> 
> This just seems like an overly generalized case, for a problem that doesn’t 
> exist (clearly we can all manage some static strings ;). The new API is 
> simply:
> 
>       TSHttpTxnErrorBodySet(txnp, body, body_len, “plain/html”);

I don't like how this mixes memory handling in the same API. I think that the 
consistent form of this API should be:

        TSHttpTxnErrorBodySet(txnp, body, body_len, content_type, 
content_type_len);

I agree that a string literal is probably the most common usage, but we should 
make it behave the same as other APIs.

> 4. The TSHttpTxnErrorBodySet() also imposes the body to be sent through the 
> body factory, for log field expansion. For starters, this is incredibly 
> inefficient , as well as imposing an 8KB size limit. This is something I 
> intend to ameliorate soon by improvements to the body factory. However, this 
> is an unnecessary inefficiency IMO; As part of the body factory improvements, 
> I also plan on exposing the body factory “log field” expansion as a generic 
> API. This would allow any plugin to decide if they want to go through the 
> pains of body factory expansions or not (and not limited to just error pages, 
> e.g. Header Rewrite would use this new API).

I'd be pretty surprised if anyone was taking advantage of the body factory 
stuff. One suggestion is to add a flags field (with valid values checking). For 
example,

        TSHttpTxnErrorBodySet(txnp, 0, body, -1, content_type, -1);
        TSHttpTxnErrorBodySet(txnp, TS_BODY_INTERPOLATE_LOG_TAGS, body, -1, 
content_type, -1);

> So, I’d like to open this up for discussions and concerns. I think 3) and 4) 
> are the primary candidates for concerns and objections. I’m willing to 
> compromise either or both if there are major concerns (for example, is it 
> worth the “cost” of changing the API in 3) ? I think it is, but I can easily 
> be persuaded otherwise).
> 
> Finally, I’ve attached the current patch to the Jira:

Which Jira was that?

J

Reply via email to