How many people have implemented custom rewriters?  I'm guessing it's a
small number, in which case I'd suggest a more radical reorganization of the
code.

In any case these are all good ideas.

On Fri, Apr 30, 2010 at 5:13 PM, John Hjelmstad <fa...@google.com> wrote:

> Hi all,
>
> I'm looking into the rewriting pipeline, specifically for HTTP responses,
> with a few goals in mind:
> 1. Consolidate ImageRewriter with RequestRewriter, so it's not just a
> one-off rewriter injection.
>  - And to simplify the rewriter interfaces overall, to allow for uniform
> rewriter profiling code etc.
> 2. Expand RequestRewriters' capability to modify HTTP response headers.
> 3. Maintain - and expand - our ability to cache the result of rewriting
> passes intelligently. Especially important for ImageRewriter, the output of
> which is presently cached for notable performance gains.
>
> To this end, I've created the following CL as a starting point. It builds
> upon the CL I recently submitted adding the ability to manipulate
> MutableContent by byte-array: http://codereview.appspot.com/1032042/show
>
> Downstream of this CL, I'm proposing to change the rewriter interface
> roughly as follows:
>
> OLD
> // Return true if content modified.
> boolean RequestRewriter.rewrite(HttpRequest, HttpResponse, MutableContent);
>
> NEW
> // Return value represents caching behavior.
> // Naive strategy: return boolean. True = HttpRequest is a sufficient key
> to
> cache the rewrite. Works for simple cases, but compound rewriter cases may
> be more difficult.
> // More sophisticated implementation: return a RewriteCacheKey object,
> containing a normalized set of all inputs to the rewrite behavior
> (essentially a compound key).
> //    In turn, these objects would be used by a RewriterCache manager
> responsible for managing these states.
> ??? ResponseRewriter.rewrite(HttpRequest, HttpResponseBuilder);
>
> Note that I suggest a new interface: ResponseRewriter (a more accurate name
> for RequestRewriter anyway), so we can support both Request and
> ResponseRewriter implementations during transition.
>
> Alternate approaches:
> I also considered simply splitting out the HTTP header-manipulation methods
> from HttpResponseBuilder into an interface: HttpResponseHeaders.
> RequestRewriter's API would be modified simply as:
> boolean RequestRewriter.rewrite(HttpRequest, HttpResponseHeaders,
> MutableContent);
>
> While simpler, this had the downsides:
> * Still involves a signature change.
> * Doesn't account for better caching behavior.
> * Involves 2 objects rather than 1 to manipulate for output.
>
>
> At present, I'd like to go the conservative route:
> 1. HttpResponseBuilder as MutableContent (@see CL)
> 2. Introduce ResponseRewriter interface, returning RewriteCacheKey with
> simple flags: HttpRequest-is-sufficient and rewrite-is-idempotent.
> 3. Transition ImageRewriter to ResponseRewriter.
> 4. Transition RequestRewriters to ResponseRewriter interface.
>
>
> Thoughts? Input welcome.
>
> Cheers,
> John
>

Reply via email to