httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jason Cwik <ja...@connecticinc.com>
Subject Re: Changing request method
Date Tue, 05 Apr 2011 03:55:30 GMT


Sent from my iPhone

On Apr 4, 2011, at 5:49 PM, Ben Noordhuis <info@bnoordhuis.nl> wrote:

> On Tue, Apr 5, 2011 at 00:10, Jason Cwik <jason@connecticinc.com> wrote:
>> I'm trying to write a module that will improve REST compatibility with Flex
>> & JS by implementing support for X-Http-Method-Override to change the
>> request method when only GET/POST are the only methods supported from the
>> client.
>> 
>> I've read the modules book and looked through lots of other modules, but I
>> can't figure out the right way to do this.  I've implemented a input filter,
>> but it always seems like the request has been read by the time my filter
>> runs and I only get body content (I've tried registering it at
>> AP_FTYPE_CONNECTION and even AP_FTYPE_CONNECTION+1, but never see the raw
>> request)
>> 
>> Looking at hooks, it seems like the earliest I can hook in is
>> post_read_request; also too late.
> 
> Well... you can add your input filter at the end of the chain, buffer
> everything until you see the X-Http-Method-Override header and then
> pass on the buffered input with a modified request line. But that's a
> hack and probably a can of worms, I really wouldn't recommend it.

The problem is that wherever I try to insert my filter, I don't ever seem to see the request,
I only get one bucket that contains the body.  Should I be using something other than the
register input filter hook? (and then SetInputFilter in httpd.conf)


> 
>> Another direction I went was to create a subrequest and execute that instead
>> of the current request.  That worked fine, but ended up executing my current
>> request twice.  Is this the right way to go?  If so,
>> 1) how do I stream data to the subrequest (e.g. POST and PUT)
>> 2) how do I terminate the current processing chain so it stops after my
>> subrequest (and doesn't execute again)?  I tried ap_internal_fast_redirect,
>> but that ended up crashing mod_php in the subrequest.
> 
> Depends on what you want to do. To trick mod_php into thinking that a
> POST is really a PUT, add a fixup hook where you update r->method and
> r->method_number. The drawback is that you break <Limit> directives
> this way.
> 
> Out of curiosity, why don't you handle this from within PHP itself?
> 
>  if (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
>    $_SERVER['REQUEST_METHOD'] = $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'];
>  }
> 
> That should be all it takes, right?

The problem here is that I don't have access to the web service code (it's not really php
either, I'm just using
Php for testing). 

I want to implement it as a filter so it's generic and completely transparent to the web service
itself. 

In the module source, r->method is const and the comments say "look, but don't touch".
That said, besides breaking the limit directive will it work?
Mime
View raw message