[Patches] urllib.py patch

Paul Schreiber paul@commerceflow.com
Wed, 14 Jun 2000 16:52:02 -0700


This is a multi-part message in MIME format.
--------------3EE36A3787159ED881FD3EC3
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I confirm that, to the best of my knowledge and belief, this
contribution is free of any claims of third parties under
copyright, patent or other rights or interests ("claims").  To
the extent that I have any such claims, I hereby grant to CNRI a
nonexclusive, irrevocable, royalty-free, worldwide license to
reproduce, distribute, perform and/or display publicly, prepare
derivative versions, and otherwise use this contribution as part
of the Python software and its related documentation, or any
derivative versions thereof, at no cost to CNRI or its licensed
users, and to authorize others to do so.

I acknowledge that CNRI may, at its sole discretion, decide
whether or not to incorporate this contribution in the Python
software and its related documentation.  I further grant CNRI
permission to use my name and other identifying information
provided to CNRI by me for use in connection with the Python
software and its related documentation.

Patch description
-----------------
This addresses four issues:

(1) usernames and passwords in urls with special characters are now
decoded properly. i.e. http://foo%2C:bar@www.whatever.com/

(2) Basic Auth support has been added to HTTPS, like it was in HTTP.

(3) Version 1.92 sent the POSTed data, but did not deal with errors
(HTTP responses other than 200) properly. HTTPS now behaves the same way
HTTP does.

(4) made URL-checking beahve the same way with HTTPS as it does with
HTTP (changed == to !=).


Paul Schreiber
--------------3EE36A3787159ED881FD3EC3
Content-Type: text/plain; charset=us-ascii;
 name="urllib-diff-2"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="urllib-diff-2"

*** urllib.old	Tue Jun 13 18:27:02 2000
--- urllib.py	Tue Jun 13 18:33:27 2000
***************
*** 302,316 ****
          def open_https(self, url, data=None):
              """Use HTTPS protocol."""
              import httplib
              if type(url) is type(""):
                  host, selector = splithost(url)
!                 user_passwd, host = splituser(host)
              else:
                  host, selector = url
                  urltype, rest = splittype(selector)
!                 if string.lower(urltype) == 'https':
                      realhost, rest = splithost(rest)
!                     user_passwd, realhost = splituser(realhost)
                      if user_passwd:
                          selector = "%s://%s%s" % (urltype, realhost, rest)
                  #print "proxy via https:", host, selector
--- 302,325 ----
          def open_https(self, url, data=None):
              """Use HTTPS protocol."""
              import httplib
+             user_passwd = None
              if type(url) is type(""):
                  host, selector = splithost(url)
!                 if host:
!                     user_passwd, host = splituser(host)
!                     host = unquote(host)
!                 realhost = host
              else:
                  host, selector = url
                  urltype, rest = splittype(selector)
!                 url = rest
!                 user_passwd = None
!                 if string.lower(urltype) != 'https':
!                     realhost = None
!                 else:
                      realhost, rest = splithost(rest)
!                     if realhost:
!                         user_passwd, realhost = splituser(realhost)
                      if user_passwd:
                          selector = "%s://%s%s" % (urltype, realhost, rest)
                  #print "proxy via https:", host, selector
***************
*** 331,336 ****
--- 340,346 ----
              else:
                  h.putrequest('GET', selector)
              if auth: h.putheader('Authorization: Basic %s' % auth)
+             if realhost: h.putheader('Host', realhost)
              for args in self.addheaders: apply(h.putheader, args)
              h.endheaders()
              if data is not None:
***************
*** 340,347 ****
              if errcode == 200:
                  return addinfourl(fp, headers, url)
              else:
!                 return self.http_error(url, fp, errcode, errmsg, headers)
!   
      def open_gopher(self, url):
          """Use Gopher protocol."""
          import gopherlib
--- 350,360 ----
              if errcode == 200:
                  return addinfourl(fp, headers, url)
              else:
!                 if data is None:
!                     return self.http_error(url, fp, errcode, errmsg, headers)
!                 else:
!                     return self.http_error(url, fp, errcode, errmsg, headers, data)
! 
      def open_gopher(self, url):
          """Use Gopher protocol."""
          import gopherlib
***************
*** 872,878 ****
          _userprog = re.compile('^([^@]*)@(.*)$')
  
      match = _userprog.match(host)
!     if match: return match.group(1, 2)
      return None, host
  
  _passwdprog = None
--- 885,891 ----
          _userprog = re.compile('^([^@]*)@(.*)$')
  
      match = _userprog.match(host)
!     if match: return map(unquote, match.group(1, 2))
      return None, host
  
  _passwdprog = None


--------------3EE36A3787159ED881FD3EC3--