2011/1/7 Alex Grönholm <alex.gronh...@nextday.fi>:
> 07.01.2011 01:14, Graham Dumpleton kirjoitti:
>
> One other comment about HTTP/1.1 features.
>
> You will always be battling to have some HTTP/1.1 features work in a
> controllable way. This is because WSGI gateways/adapters aren't often
> directly interfacing with the raw HTTP layer, but with FASTCGI, SCGI,
> AJP, CGI etc. In this sort of situation you are at the mercy of what
> the modules implementing those protocols do, or even are hamstrung by
> how those protocols work.
>
> The classic example is 100-continue processing. This simply cannot
> work end to end across FASTCGI, SCGI, AJP, CGI and other WSGI hosting
> mechanisms where proxying is performed as the protocol being used
> doesn't implement a notion of end to end signalling in respect of
> 100-continue.
>
> I think we need some concrete examples to figure out what is and isn't
> possible with WSGI 1.0.1.
> My motivation for participating in this discussion can be summed up in that
> I want the following two applications to work properly:
>
> - PlasmaDS (Flex Messaging implementation)
> - WebDAV
>
> The PlasmaDS project is the planned Python counterpart to Adobe's BlazeDS.
> Interoperability with the existing implementation requires that both the
> request and response use chunked transfer encoding, to achieve bidirectional
> streaming. I don't really care how this happens, I just want to make sure
> that there is nothing preventing it.

That can only be done by changing the rules around wsgi.input is used.
I'll try and find a reference to where I have posted information about
this before, otherwise I'll write something up again about it.

> The WebDAV spec, on the other hand, says
> (http://www.webdav.org/specs/rfc2518.html#STATUS_102):
>
> The 102 (Processing) status code is an interim response used to inform the
> client that the server has accepted the complete request, but has not yet
> completed it. This status code SHOULD only be sent when the server has a
> reasonable expectation that the request will take significant time to
> complete. As guidance, if a method is taking longer than 20 seconds (a
> reasonable, but arbitrary value) to process the server SHOULD return a 102
> (Processing) response. The server MUST send a final response after the
> request has been completed.

That I don't offhand see a way of being able to do as protocols like
SCGI and CGI definitely don't allow interim status. I am suspecting
that FASTCGI and AJP don't allow it either.

I'll have to even do some digging as to how you would even handle that
in Apache with a normal Apache handler.

Graham

> Again, I don't care how this is done as long as it's possible.
>
> The current WSGI specification acknowledges that by saying:
>
> """
> Servers and gateways that implement HTTP 1.1 must provide transparent
> support for HTTP 1.1's "expect/continue" mechanism. This may be done
> in any of several ways:
>
> * Respond to requests containing an Expect: 100-continue request with
> an immediate "100 Continue" response, and proceed normally.
> * Proceed with the request normally, but provide the application with
> a wsgi.input stream that will send the "100 Continue" response if/when
> the application first attempts to read from the input stream. The read
> request must then remain blocked until the client responds.
> * Wait until the client decides that the server does not support
> expect/continue, and sends the request body on its own. (This is
> suboptimal, and is not recommended.)
> """
>
> If you are going to try and push for full visibility of HTTP/1.1 and
> an ability to control it at the application level then you will fail
> with 100-continue to start with.
>
> So, although option 2 above would be the most ideal and is giving the
> application control, specifically the ability to send an error
> response based on request headers alone, and with reading the response
> and triggering the 100-continue, it isn't practical to require it, as
> the majority of hosting mechanisms for WSGI wouldn't even be able to
> implement it that way.
>
> The same goes for any other feature, there is no point mandating a
> feature that can only be realistically implementing on a minority of
> implementations. This would be even worse where dependence on such a
> feature would mean that the WSGI application would no longer be
> portable to another WSGI server and destroys the notion that WSGI
> provides a portable interface.
>
> This isn't just restricted to HTTP/1.1 features either, but also
> applies to raw SCRIPT_NAME and PATH_INFO as well. Only WSGI servers
> that are directly hooked into the URL parsing of the base HTTP server
> can provide that information, which basically means that only pure
> Python HTTP/WSGI servers are likely able to provide it without
> guessing, and in that case such servers usually are always used where
> WSGI application mounted at root anyway.
>
> Graham
>
> On 7 January 2011 09:29, Graham Dumpleton <graham.dumple...@gmail.com>
> wrote:
>
> On 7 January 2011 08:56, Alice Bevan–McGregor <al...@gothcandy.com> wrote:
>
> On 2011-01-06 13:06:36 -0800, James Y Knight said:
>
> On Jan 6, 2011, at 3:52 PM, Alice Bevan–McGregor wrote:
>
> :: Making optional (and thus rarely-implemented) features non-optional.
> E.g. server support for HTTP/1.1 with clarifications for interfacing
> applications to 1.1 servers.  Thus pipelining, chunked encoding, et. al. as
> per the HTTP 1.1 RFC.
>
> Requirements on the HTTP compliance of the server don't really have any
> place in the WSGI spec. You should be able to be WSGI compliant even if you
> don't use the HTTP transport at all (e.g. maybe you just send around
> requests via SCGI).
> The original spec got this right: chunking etc are something which is not
> relevant to the wsgi application code -- it is up to the server to implement
> the HTTP transport according to the HTTP spec, if it's purporting to be an
> HTTP server.
>
> Chunking is actually quite relevant to the specification, as WSGI and PEP
> 444 / WSGI 2 (damn, that's getting tedious to keep dual-typing ;) allow for
> chunked bodies regardless of higher-level support for chunking.  The body
> iterator.  Previously you /had/ to define a length, with chunked encoding at
> the server level, you don't.
>
> I agree, however, that not all gateways will be able to implement the
> relevant HTTP/1.1 features.  FastCGI does, SCGI after a quick Google search,
> seems to support it as well. I should re-word it as:
>
> "For those servers capable of HTTP/1.1 features the implementation of such
> features is required."
>
> I would question whether FASTCGI, SCGI or AJP support the concept of
> chunking of responses to the extent that the application can prepare
> the final content including chunks as required by the HTTP
> specification. Further, in Apache at least, the output from a web
> application served via those protocols is still pushed through the
> Apache output filter chain so as to allow the filters to modify the
> response, eg., apply compression using mod_deflate. As a consequence,
> the standard HTTP 'CHUNK' output filter is still a part of the output
> filter stack. This means that were a web application to try and do
> chunking itself, then Apache would rechunk such that the original
> chunking became part of the content, rather than the transfer
> encoding.
>
> So, in order to be able to achieve what I think you want, with a web
> application being able to do chunking itself, you would need to modify
> the implementations of mod_fcgid, mod_fastcgi, mod_scgi, mod_ajp and
> also like mod_cgi and mod_cgid of Apache.
>
> The only WSGI implementation I know of for Apache where you might even
> be able to do what you want is uWSGI. This is because I believe from
> memory it uses a mode in Apache by default called assbackwords. What
> this allows is for the output from the web application to bypass the
> Apache output filter stack and directly control the raw HTTP output.
> This gives uWSGI a little bit less overhead in Apache, but at the loss
> of the ability to actually use Apache output filters and for Apache to
> fix up response headers in any way. There is a flag in uWSGI which can
> optionally be set to make it use the more traditional mode and not use
> assbackwords.
>
> Thus, I believe you would be fighting against server implementations
> such as Apache and likely also nginx, Cherokee, lighttpd etc, to allow
> chunking to be supported at the level of the web application.
>
> About all you can do is ensure that the WSGI specification doesn't
> include anything in it which would prevent a web application
> harnessing indirectly such a feature as chunking where the web server
> supports it.
>
> As it is, it isn't chunked responses which is even the problem,
> because if a underlying web server supports chunking for responses,
> all you need to do is not set the content length.
>
> The problem area with chunking is the request content as the way that
> the WSGI specification is written prevents being able to have chunked
> request content. I have described the issue previously and made
> suggestions about alternate way that wsgi.input could be used.
>
> Graham
>
> +1
>
>        - Alice.
>
>
> _______________________________________________
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe:
> http://mail.python.org/mailman/options/web-sig/graham.dumpleton%40gmail.com
>
> _______________________________________________
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe:
> http://mail.python.org/mailman/options/web-sig/alex.gronholm%40nextday.fi
>
>
> _______________________________________________
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe:
> http://mail.python.org/mailman/options/web-sig/graham.dumpleton%40gmail.com
>
>
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to