[Python-checkins] python/dist/src/Lib xmlrpclib.py,1.20,1.21
effbot@users.sourceforge.net
effbot@users.sourceforge.net
Tue, 22 Oct 2002 11:23:02 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv4346/Lib
Modified Files:
xmlrpclib.py
Log Message:
add support for basic authentication, based on patch #624180
by Phillip J. Eby
Index: xmlrpclib.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/xmlrpclib.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** xmlrpclib.py 30 Jun 2002 03:39:14 -0000 1.20
--- xmlrpclib.py 22 Oct 2002 18:23:00 -0000 1.21
***************
*** 44,47 ****
--- 44,48 ----
# 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.
***************
*** 1045,1048 ****
--- 1046,1080 ----
##
+ # 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.
#
***************
*** 1053,1056 ****
--- 1085,1089 ----
# create a HTTP connection object from a host descriptor
import httplib
+ host, extra_headers, x509 = self.get_host_info(host)
return httplib.HTTP(host)
***************
*** 1072,1076 ****
--- 1105,1115 ----
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)
##
***************
*** 1148,1167 ****
# host may be a string, or a (host, x509-dict) tuple
import httplib
! if isinstance(host, TupleType):
! host, x509 = host
! else:
! x509 = {}
try:
HTTPS = httplib.HTTPS
except AttributeError:
! 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)
##
--- 1187,1199 ----
# host may be a string, or a (host, x509-dict) tuple
import httplib
! 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"
! )
else:
! return apply(HTTPS, (host, None), x509 or {})
##