@@ -412,12 +412,14 @@ def retrbinary(self, cmd, callback, blocksize=8192, rest=None): |
412 | 412 | """ |
413 | 413 | self.voidcmd('TYPE I') |
414 | 414 | conn = self.transfercmd(cmd, rest) |
415 | | - while 1: |
416 | | - data = conn.recv(blocksize) |
417 | | - if not data: |
418 | | - break |
419 | | - callback(data) |
420 | | - conn.close() |
| 415 | + try: |
| 416 | + while 1: |
| 417 | + data = conn.recv(blocksize) |
| 418 | + if not data: |
| 419 | + break |
| 420 | + callback(data) |
| 421 | + finally: |
| 422 | + conn.close() |
421 | 423 | return self.voidresp() |
422 | 424 |
|
423 | 425 | def retrlines(self, cmd, callback = None): |
@@ -435,21 +437,25 @@ def retrlines(self, cmd, callback = None): |
435 | 437 | if callback is None: callback = print_line |
436 | 438 | resp = self.sendcmd('TYPE A') |
437 | 439 | conn = self.transfercmd(cmd) |
438 | | - fp = conn.makefile('rb') |
439 | | - while 1: |
440 | | - line = fp.readline(self.maxline + 1) |
441 | | - if len(line) > self.maxline: |
442 | | - raise Error("got more than %d bytes" % self.maxline) |
443 | | - if self.debugging > 2: print '*retr*', repr(line) |
444 | | - if not line: |
445 | | - break |
446 | | - if line[-2:] == CRLF: |
447 | | - line = line[:-2] |
448 | | - elif line[-1:] == '\n': |
449 | | - line = line[:-1] |
450 | | - callback(line) |
451 | | - fp.close() |
452 | | - conn.close() |
| 440 | + fp = None |
| 441 | + try: |
| 442 | + fp = conn.makefile('rb') |
| 443 | + while 1: |
| 444 | + line = fp.readline(self.maxline + 1) |
| 445 | + if len(line) > self.maxline: |
| 446 | + raise Error("got more than %d bytes" % self.maxline) |
| 447 | + if self.debugging > 2: print '*retr*', repr(line) |
| 448 | + if not line: |
| 449 | + break |
| 450 | + if line[-2:] == CRLF: |
| 451 | + line = line[:-2] |
| 452 | + elif line[-1:] == '\n': |
| 453 | + line = line[:-1] |
| 454 | + callback(line) |
| 455 | + finally: |
| 456 | + if fp: |
| 457 | + fp.close() |
| 458 | + conn.close() |
453 | 459 | return self.voidresp() |
454 | 460 |
|
455 | 461 | def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): |
@@ -469,12 +475,14 @@ def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): |
469 | 475 | """ |
470 | 476 | self.voidcmd('TYPE I') |
471 | 477 | conn = self.transfercmd(cmd, rest) |
472 | | - while 1: |
473 | | - buf = fp.read(blocksize) |
474 | | - if not buf: break |
475 | | - conn.sendall(buf) |
476 | | - if callback: callback(buf) |
477 | | - conn.close() |
| 478 | + try: |
| 479 | + while 1: |
| 480 | + buf = fp.read(blocksize) |
| 481 | + if not buf: break |
| 482 | + conn.sendall(buf) |
| 483 | + if callback: callback(buf) |
| 484 | + finally: |
| 485 | + conn.close() |
478 | 486 | return self.voidresp() |
479 | 487 |
|
480 | 488 | def storlines(self, cmd, fp, callback=None): |
@@ -491,17 +499,19 @@ def storlines(self, cmd, fp, callback=None): |
491 | 499 | """ |
492 | 500 | self.voidcmd('TYPE A') |
493 | 501 | conn = self.transfercmd(cmd) |
494 | | - while 1: |
495 | | - buf = fp.readline(self.maxline + 1) |
496 | | - if len(buf) > self.maxline: |
497 | | - raise Error("got more than %d bytes" % self.maxline) |
498 | | - if not buf: break |
499 | | - if buf[-2:] != CRLF: |
500 | | - if buf[-1] in CRLF: buf = buf[:-1] |
501 | | - buf = buf + CRLF |
502 | | - conn.sendall(buf) |
503 | | - if callback: callback(buf) |
504 | | - conn.close() |
| 502 | + try: |
| 503 | + while 1: |
| 504 | + buf = fp.readline(self.maxline + 1) |
| 505 | + if len(buf) > self.maxline: |
| 506 | + raise Error("got more than %d bytes" % self.maxline) |
| 507 | + if not buf: break |
| 508 | + if buf[-2:] != CRLF: |
| 509 | + if buf[-1] in CRLF: buf = buf[:-1] |
| 510 | + buf = buf + CRLF |
| 511 | + conn.sendall(buf) |
| 512 | + if callback: callback(buf) |
| 513 | + finally: |
| 514 | + conn.close() |
505 | 515 | return self.voidresp() |
506 | 516 |
|
507 | 517 | def acct(self, password): |
|