@@ -107,7 +107,8 @@ class FTP:
107107 # Optional arguments are host (for connect()),
108108 # and user, passwd, acct (for login())
109109 def __init__ (self , host = '' , user = '' , passwd = '' , acct = '' ,
110- timeout = _GLOBAL_DEFAULT_TIMEOUT ):
110+ timeout = _GLOBAL_DEFAULT_TIMEOUT , source_address = None ):
111+ self .source_address = source_address
111112 self .timeout = timeout
112113 if host :
113114 self .connect (host )
@@ -128,18 +129,23 @@ def __exit__(self, *args):
128129 if self .sock is not None :
129130 self .close ()
130131
131- def connect (self , host = '' , port = 0 , timeout = - 999 ):
132+ def connect (self , host = '' , port = 0 , timeout = - 999 , source_address = None ):
132133 '''Connect to host. Arguments are:
133134 - host: hostname to connect to (string, default previous host)
134135 - port: port to connect to (integer, default previous port)
136+ - source_address: a 2-tuple (host, port) for the socket to bind
137+ to as its source address before connecting.
135138 '''
136139 if host != '' :
137140 self .host = host
138141 if port > 0 :
139142 self .port = port
140143 if timeout != - 999 :
141144 self .timeout = timeout
142- self .sock = socket .create_connection ((self .host , self .port ), self .timeout )
145+ if source_address is not None :
146+ self .source_address = source_address
147+ self .sock = socket .create_connection ((self .host , self .port ), self .timeout ,
148+ source_address = self .source_address )
143149 self .af = self .sock .family
144150 self .file = self .sock .makefile ('r' , encoding = self .encoding )
145151 self .welcome = self .getresp ()
@@ -334,7 +340,8 @@ def ntransfercmd(self, cmd, rest=None):
334340 size = None
335341 if self .passiveserver :
336342 host , port = self .makepasv ()
337- conn = socket .create_connection ((host , port ), self .timeout )
343+ conn = socket .create_connection ((host , port ), self .timeout ,
344+ source_address = self .source_address )
338345 if rest is not None :
339346 self .sendcmd ("REST %s" % rest )
340347 resp = self .sendcmd (cmd )
@@ -637,7 +644,7 @@ class FTP_TLS(FTP):
637644
638645 def __init__ (self , host = '' , user = '' , passwd = '' , acct = '' , keyfile = None ,
639646 certfile = None , context = None ,
640- timeout = _GLOBAL_DEFAULT_TIMEOUT ):
647+ timeout = _GLOBAL_DEFAULT_TIMEOUT , source_address = None ):
641648 if context is not None and keyfile is not None :
642649 raise ValueError ("context and keyfile arguments are mutually "
643650 "exclusive" )
@@ -648,7 +655,7 @@ def __init__(self, host='', user='', passwd='', acct='', keyfile=None,
648655 self .certfile = certfile
649656 self .context = context
650657 self ._prot_p = False
651- FTP .__init__ (self , host , user , passwd , acct , timeout )
658+ FTP .__init__ (self , host , user , passwd , acct , timeout , source_address )
652659
653660 def login (self , user = '' , passwd = '' , acct = '' , secure = True ):
654661 if secure and not isinstance (self .sock , ssl .SSLSocket ):
0 commit comments