On Fri, Jul 16, 2010 at 4:33 AM, And Clover <span dir="ltr">&lt;<a href="mailto:and-py@doxdesk.com">and-py@doxdesk.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div class="im">On 07/14/2010 06:43 AM, Ian Bicking wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
There&#39;s only a couple tricky keys: SCRIPT_NAME, PATH_INFO,<br>
and HTTP_COOKIE.<br>
</blockquote>
<br></div>
(And of those, PATH_INFO is the only one that really matters, in that no-one really uses non-ASCII script filenames, and non-ASCII characters in Cookie/Set-Cookie are still handled so differently/brokenly across browsers that you can&#39;t rely on them at all.)<div class="im">

<br>
<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
* I (re)propose we eliminate SCRIPT_NAME and PATH_INFO and replace them<br>
exclusively with encoded versions<br>
</blockquote>
<br></div>
For compatibility with existing apps, how about keeping the existing SCRIPT_NAME and PATH_INFO as-is (with all their problems), and specifying that the new &#39;raw&#39; versions (whatever they are called) are added only if they really are raw, not reconstructed.<br>

</blockquote><div><br>Having two ways of expressing the same information will lead to bugs related to which data is canonical.  If an application is using SCRIPT_NAME/PATH_INFO and then updates those values in any way, and wsgi.raw_script_name/wsgi.raw_path_info are present, then there will be weird bugs and code will disagree about which one is correct.  Since %2f can exist in the raw versions, there isn&#39;t even a way to chunk the two variables in the same way.<br>

<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Then existing scripts that don&#39;t care about non-ASCII and slashes can carry on as before, and for apps that do care about them, they&#39;ll be able to be *sure* the input is correct. Or they can fall back to PATH_INFO when not present, and avoid producing these kind of URLs in response.<br>

</blockquote><div><br>I don&#39;t think it works to imagine you can just not care about non-ASCII.  Requests come in.  WSGI should represent those requests.  If a request comes in with non-ASCII bytes then WSGI needs to do *something* with it.  I don&#39;t want to have to configure servers with application policy; servers should just work.<br>

<br>And this doesn&#39;t help with Python 3: either we have byte values of SCRIPT_NAME and PATH_INFO in Python 3, or we have text values.  I think bytes will be more awkward to port to than text, and inconsistent with other WSGI values.  If we have text then we have to choose an encoding.  Latin1 will work, but it will be the exact wrong encoding most of the time as UTF-8 is the typical  (unlike other headers, where Latin1 will mostly be an okay encoding, or as good a guess as we have).  If we firmly remove these keys then we can avoid this choice entirely... and we conveniently also get a better representation of the request.<br>

<br>Note that libraries can smooth over this change; WebOb for instance will certainly still support req.script_name/req.path_info by decoding the raw values.  Admittedly lots of code use these values directly... but at least if they get a KeyError the port/fix will be obvious (as opposed to out of sync values, which will only emerge as a problem occasionally -- I&#39;d rather not invite more occasional bugs).<br>

</div></div><br>-- <br>Ian Bicking  |  <a href="http://blog.ianbicking.org">http://blog.ianbicking.org</a><br>