summaryrefslogtreecommitdiffstats
path: root/Lib/xmlrpclib.py
diff options
context:
space:
mode:
authorFredrik Lundh <fredrik@pythonware.com>2002-10-22 18:23:00 (GMT)
committerFredrik Lundh <fredrik@pythonware.com>2002-10-22 18:23:00 (GMT)
commit1303c7cb166ed404945ac79a3a20c06b702c6224 (patch)
tree3781c6ec3090c211e58a5ce025fcb4554d1350a5 /Lib/xmlrpclib.py
parent7d428ecc57b25616f890f67398bdf190084f9d2d (diff)
downloadcpython-1303c7cb166ed404945ac79a3a20c06b702c6224.zip
cpython-1303c7cb166ed404945ac79a3a20c06b702c6224.tar.gz
cpython-1303c7cb166ed404945ac79a3a20c06b702c6224.tar.bz2
add support for basic authentication, based on patch #624180
by Phillip J. Eby
Diffstat (limited to 'Lib/xmlrpclib.py')
-rw-r--r--Lib/xmlrpclib.py56
1 files changed, 44 insertions, 12 deletions
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
index 4b6fc43..e984baf 100644
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -43,6 +43,7 @@
# 2002-04-16 fl Added __str__ methods to datetime/binary wrappers
# 2002-05-15 fl Added error constants (from Andrew Kuchling)
# 2002-06-27 fl Merged with Python CVS version
+# 2002-10-22 fl Added basic authentication (based on code from Phillip Eby)
#
# Copyright (c) 1999-2002 by Secret Labs AB.
# Copyright (c) 1999-2002 by Fredrik Lundh.
@@ -1044,6 +1045,37 @@ class Transport:
return getparser()
##
+ # Get authorization info from host parameter
+ # Host may be a string, or a (host, x509-dict) tuple; if a string,
+ # it is checked for a "user:pw@host" format, and a "Basic
+ # Authentication" header is added if appropriate.
+ #
+ # @param host Host descriptor (URL or (URL, x509 info) tuple).
+ # @return A 3-tuple containing (actual host, extra headers,
+ # x509 info). The header and x509 fields may be None.
+
+ def get_host_info(self, host):
+
+ x509 = {}
+ if isinstance(host, TupleType):
+ host, x509 = host
+
+ import urllib
+ auth, host = urllib.splituser(host)
+
+ if auth:
+ import base64
+ auth = base64.encodestring(auth)
+ auth = string.join(string.split(auth), "") # get rid of whitespace
+ extra_headers = [
+ ("Authorization", "Basic " + auth)
+ ]
+ else:
+ extra_headers = None
+
+ return host, extra_headers, x509
+
+ ##
# Connect to server.
#
# @param host Target host.
@@ -1052,6 +1084,7 @@ class Transport:
def make_connection(self, host):
# create a HTTP connection object from a host descriptor
import httplib
+ host, extra_headers, x509 = self.get_host_info(host)
return httplib.HTTP(host)
##
@@ -1071,7 +1104,13 @@ class Transport:
# @param host Host name.
def send_host(self, connection, host):
+ host, extra_headers, x509 = self.get_host_info(host)
connection.putheader("Host", host)
+ if extra_headers:
+ if isinstance(extra_headers, DictType):
+ extra_headers = extra_headers.items()
+ for key, value in extra_headers:
+ connection.putheader(key, value)
##
# Send user-agent identifier.
@@ -1147,22 +1186,15 @@ class SafeTransport(Transport):
# create a HTTPS connection object from a host descriptor
# host may be a string, or a (host, x509-dict) tuple
import httplib
- if isinstance(host, TupleType):
- host, x509 = host
- else:
- x509 = {}
+ host, extra_headers, x509 = self.get_host_info(host)
try:
HTTPS = httplib.HTTPS
except AttributeError:
- raise NotImplementedError,\
- "your version of httplib doesn't support HTTPS"
+ raise NotImplementedError(
+ "your version of httplib doesn't support HTTPS"
+ )
else:
- return apply(HTTPS, (host, None), x509)
-
- def send_host(self, connection, host):
- if isinstance(host, TupleType):
- host, x509 = host
- connection.putheader("Host", host)
+ return apply(HTTPS, (host, None), x509 or {})
##
# Standard server proxy. This class establishes a virtual connection