summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2000-08-21 21:42:42 (GMT)
committerFred Drake <fdrake@acm.org>2000-08-21 21:42:42 (GMT)
commit567ca8e732a75682adfdca08daaf2afa59582ad9 (patch)
treee86dea26392b18e6e13d08e5f2a9aafd06e4edca
parent908768858174326cad3b3efaf785075fb440f73f (diff)
downloadcpython-567ca8e732a75682adfdca08daaf2afa59582ad9.zip
cpython-567ca8e732a75682adfdca08daaf2afa59582ad9.tar.gz
cpython-567ca8e732a75682adfdca08daaf2afa59582ad9.tar.bz2
Patch from Paul Schreiber <paul@commerceflow.com>:
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 !=).
-rw-r--r--Lib/urllib.py25
1 files changed, 19 insertions, 6 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 7c9446b..a5be416 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -302,15 +302,24 @@ class URLopener:
def open_https(self, url, data=None):
"""Use HTTPS protocol."""
import httplib
+ user_passwd = None
if type(url) is type(""):
host, selector = splithost(url)
- user_passwd, host = splituser(host)
+ if host:
+ user_passwd, host = splituser(host)
+ host = unquote(host)
+ realhost = host
else:
host, selector = url
urltype, rest = splittype(selector)
- if string.lower(urltype) == 'https':
+ url = rest
+ user_passwd = None
+ if string.lower(urltype) != 'https':
+ realhost = None
+ else:
realhost, rest = splithost(rest)
- user_passwd, realhost = splituser(realhost)
+ if realhost:
+ user_passwd, realhost = splituser(realhost)
if user_passwd:
selector = "%s://%s%s" % (urltype, realhost, rest)
#print "proxy via https:", host, selector
@@ -331,6 +340,7 @@ class URLopener:
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,8 +350,11 @@ class URLopener:
if errcode == 200:
return addinfourl(fp, headers, url)
else:
- return self.http_error(url, fp, errcode, errmsg, headers)
-
+ 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,7 +885,7 @@ def splituser(host):
_userprog = re.compile('^([^@]*)@(.*)$')
match = _userprog.match(host)
- if match: return match.group(1, 2)
+ if match: return map(unquote, match.group(1, 2))
return None, host
_passwdprog = None