Commit d64146c4 authored by Ivan Mokeev's avatar Ivan Mokeev Committed by Victor Stinner

Fix socket leaks (#351)

* Fix socket leaks

* Fixed sockets leak
parent 9c2c42c2
...@@ -412,12 +412,14 @@ class FTP: ...@@ -412,12 +412,14 @@ class FTP:
""" """
self.voidcmd('TYPE I') self.voidcmd('TYPE I')
conn = self.transfercmd(cmd, rest) conn = self.transfercmd(cmd, rest)
while 1: try:
data = conn.recv(blocksize) while 1:
if not data: data = conn.recv(blocksize)
break if not data:
callback(data) break
conn.close() callback(data)
finally:
conn.close()
return self.voidresp() return self.voidresp()
def retrlines(self, cmd, callback = None): def retrlines(self, cmd, callback = None):
...@@ -435,21 +437,25 @@ class FTP: ...@@ -435,21 +437,25 @@ class FTP:
if callback is None: callback = print_line if callback is None: callback = print_line
resp = self.sendcmd('TYPE A') resp = self.sendcmd('TYPE A')
conn = self.transfercmd(cmd) conn = self.transfercmd(cmd)
fp = conn.makefile('rb') fp = None
while 1: try:
line = fp.readline(self.maxline + 1) fp = conn.makefile('rb')
if len(line) > self.maxline: while 1:
raise Error("got more than %d bytes" % self.maxline) line = fp.readline(self.maxline + 1)
if self.debugging > 2: print '*retr*', repr(line) if len(line) > self.maxline:
if not line: raise Error("got more than %d bytes" % self.maxline)
break if self.debugging > 2: print '*retr*', repr(line)
if line[-2:] == CRLF: if not line:
line = line[:-2] break
elif line[-1:] == '\n': if line[-2:] == CRLF:
line = line[:-1] line = line[:-2]
callback(line) elif line[-1:] == '\n':
fp.close() line = line[:-1]
conn.close() callback(line)
finally:
if fp:
fp.close()
conn.close()
return self.voidresp() return self.voidresp()
def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
...@@ -469,12 +475,14 @@ class FTP: ...@@ -469,12 +475,14 @@ class FTP:
""" """
self.voidcmd('TYPE I') self.voidcmd('TYPE I')
conn = self.transfercmd(cmd, rest) conn = self.transfercmd(cmd, rest)
while 1: try:
buf = fp.read(blocksize) while 1:
if not buf: break buf = fp.read(blocksize)
conn.sendall(buf) if not buf: break
if callback: callback(buf) conn.sendall(buf)
conn.close() if callback: callback(buf)
finally:
conn.close()
return self.voidresp() return self.voidresp()
def storlines(self, cmd, fp, callback=None): def storlines(self, cmd, fp, callback=None):
...@@ -491,17 +499,19 @@ class FTP: ...@@ -491,17 +499,19 @@ class FTP:
""" """
self.voidcmd('TYPE A') self.voidcmd('TYPE A')
conn = self.transfercmd(cmd) conn = self.transfercmd(cmd)
while 1: try:
buf = fp.readline(self.maxline + 1) while 1:
if len(buf) > self.maxline: buf = fp.readline(self.maxline + 1)
raise Error("got more than %d bytes" % self.maxline) if len(buf) > self.maxline:
if not buf: break raise Error("got more than %d bytes" % self.maxline)
if buf[-2:] != CRLF: if not buf: break
if buf[-1] in CRLF: buf = buf[:-1] if buf[-2:] != CRLF:
buf = buf + CRLF if buf[-1] in CRLF: buf = buf[:-1]
conn.sendall(buf) buf = buf + CRLF
if callback: callback(buf) conn.sendall(buf)
conn.close() if callback: callback(buf)
finally:
conn.close()
return self.voidresp() return self.voidresp()
def acct(self, password): def acct(self, password):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment