On 1 Aug 2013, at 7:25 AM, "Ray (a.k.a. Iceberg)" <[email protected]> wrote:
> Thanks for trying to help Niphlod. More details so far.
> 
> Strangely, that problem does NOT exist when I test with 
> http://web2py.com/examples/simple_examples/status
> 
> So I compare the output page between mine and the one from web2py.com, then I 
> found something.
> 
> On my server's output, there are only TWO appearances of "application/json", 
> one in request.env.content_type and another in 
> request.wsgi.environ.CONTENT_TYPE.
> 
> On web2py.com's output, there are FOUR appearances of "application/json", 
> they are request.env.content_type, request.env.http_content_type, 
> request.wsgi.environ.CONTENT_TYPE, and request.wsgi.environ.HTTP_CONTENT_TYPE.
> 
> And turns out line 343 of parse_get_post_vars() uses only "http_content_type" 
> to trigger the json 
> support.http://code.google.com/p/web2py/source/browse/gluon/main.py
> 
> No wonder the symptom. So the next question is, what makes the 
> request.env.http_content_type missing in my case? Is it somehow because my 
> apache sits behind an nginx (a webfaction convention) so the request.is_local 
> is always True (which is not the case of web2py.com)?
> 
> Or, shall we simply change that line 343 of gluon/main.py into this:
> 
>     
> is_json = (env.get('http_content_type', '')
>     or env.get('content_type', '')
>     )[:16] == 'application/json'
> 
> Thoughts?

The specs associated with the Content-Type header are a little complicated. 
WSGI inherits them from CGI. 

The general idea is that (if the protocol is http), the environ members 
beginning with http_ were supplied by the client. Headers not starting with 
http_ are supplied by the server (possibly based on client headers).

The bottom line: the server is required to provide content_type if the client 
supplies one (otherwise it's optional); it is *not* required to supply the 
client header http_content_type.

GGI/1.1: http://ken.coar.org/cgi/draft-coar-cgi-v11-03.txt

6.1.3. CONTENT_TYPE
...
   Servers MUST provide this metavariable to scripts if a
   "Content-Type" field was present in the original request
   header. If the server receives a request with an attached
   entity but no "Content-Type" header field, it MAY attempt to
   determine the correct datatype, or it MAY omit this
   metavariable when communicating the request information to the
   script.

6.1.5. Protocol-Specific Metavariables
...
   Metavariables with names beginning with "HTTP_" contain values
   from the request header, if the scheme used was HTTP. Each
   HTTP header field name is converted to upper case, has all
   occurrences of "-" replaced with "_", and has "HTTP_"
   prepended to form the metavariable name.
...
   Servers are not required to create metavariables for all the
   request header fields that they receive. In particular, they
   MAY decline to make available any header fields carrying
   authentication information, such as "Authorization", or which
   are available to the script via other metavariables, such as
   "Content-Length" and "Content-Type".

Rocket, for example, complies:

        if 'HTTP_CONTENT_TYPE' in environ:
            environ['CONTENT_TYPE'] = environ['HTTP_CONTENT_TYPE']


So, if anything, web2py should be looking at content_type only; it's a mistake 
to look at http_content_type only, and (by spec) unnecessary to look at 
http_content_type at all.

If we're really worried about spec-breaking servers, we could repeat the Rocket 
logic (above) early on incoming requests (and the same for content_length, 
which has similar rules).

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to