So... there&#39;s been some discussion of WSGI on Python 3 lately.  I&#39;m not feeling as pessimistic as some people, I feel like we were close but just didn&#39;t *quite* get there.<br clear="all"><br>Here&#39;s my thoughts:<br>

<br>* Everyone agrees keys in the environ should be native strings<br>* Bodies should stay bytes<br>* Can we make all &quot;standard&quot; values that are str on Python 2, str on Python 3 with a Latin1 encoding?  This is basically what wsgiref did.  This means HTTP_*, SERVER_NAME, etc.  Everything CGIish, and everything with an all-caps key.  There&#39;s only a couple tricky keys: SCRIPT_NAME, PATH_INFO, and HTTP_COOKIE.<br>

* I propose we let libraries handle HTTP_COOKIE however they want; don&#39;t bother transcoding *into* the environ, just do so when you parse the cookie (if you so choose).  Happy developers will just urlencode all their cookie values to keep their cookies ASCII-clean.  Unhappy developers who have to handle legacy cookies will just run environ[&#39;HTTP_COOKIE&#39;].decode(&#39;latin1&#39;) and then do whatever sad magic they are forced to do.<br>

* I (re)propose we eliminate SCRIPT_NAME and PATH_INFO and replace them exclusively with encoded versions (that represent the original request URI).  We use Latin1 encoding, but it should be ASCII anyway, like most of the headers.<br>

* I&#39;m terrible at naming, but let&#39;s say these new values are RAW_SCRIPT_NAME and RAW_PATH_INFO.<br><br>Does this solve everything?  There&#39;s broken stuff in the stdlib, but we shouldn&#39;t bother ourselves with that -- if we need working code we should just write it and ignore the stdlib or submit our stuff as patches to the stdlib.<br>

<br>Some environments will have a hard time constructing RAW_SCRIPT_NAME and RAW_PATH_INFO, but in my opinion they can just encode SCRIPT_NAME and PATH_INFO and be done with it; it&#39;s not as accurate, but it&#39;s no less accurate than what we have now.<br>

<br>Actual transcoding in the environ is not supported or encouraged in this scheme.  If you want to adjust an encoding you should do it in your application/library code.<br><br>There&#39;s some other topics, like chunked responses, unknown request body lengths, start_response, and maybe some other things, but these aren&#39;t Python 3 issues, they are just... generic issues.  app_iter.close() might be worth thinking about given new iterator semantics introduced since WSGI was written.<br>

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