On Mon, Sep 21, 2009 at 6:16 PM, Graham Dumpleton <span dir="ltr">&lt;<a href="mailto:graham.dumpleton@gmail.com">graham.dumpleton@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">&gt; Of course you can directly use `environ[&#39;some_key&#39;]` if you know you&#39;ll<br>
&gt; get the &#39;right&#39; encoding all the time. But when the encoding changes,<br>
&gt; you&#39;ll have to fix all your middlewares.<br>
&gt;<br>
&gt;<br>
&gt; I am missing something?<br>
<br>
</div>For one, we aren&#39;t talking about arbitrary keys needing this treatment.<br>
<br>
We are only talking about SCRIPT_NAME and PATH_INFO.<br></blockquote><div><br></div><div>OK, another proposal entirely: we kill SCRIPT_NAME and PATH_INFO, and introduce two equivalent variables that hold the NOT url-decoded values.  So if you request /fran%e7cois then environ[&#39;PATH_INFO_RAW&#39;] is &#39;/fran%e7cois&#39;.</div>

<div><br></div><div>This will be quite disruptive, as these are variables that are frequently accessed directly (libraries that expose them as attributes can just turn them into properties that do URL decoding, using UTF8).  But it&#39;s an easy fix at least.  I would actually want to specify that if we added this key, we should disallow the old keys -- terrible confusion could ensue from both in the environ.  This also fixes the problem with not being able to distinguish %2F from /, which isn&#39;t a big problem but is annoying, and is hiding meaningful information.  (I believe the relevant spec does distinguish between these two values -- i.e., ideally decoding should happen on path segments, each segment separated by a real /.)</div>

<div><br></div><div>If we do that, then the only really tricky thing left is HTTP_COOKIE, and since the Cookie header is a mess then HTTP_COOKIE will be a mess and we just have to figure out a hacky way to deal with that.  Maybe surrogateescape, but probably just Latin1 would be fine (and easy to do in Python 2).</div>

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