From: Guido van Rossum Date: Tue, 18 Dec 2001 14:17:02 +0000 (+0000) Subject: Backport patch 1.57 to 2.1.2. Apparently ftp servers that send 227 X-Git-Tag: v2.1.2c1~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5d6faaa0b53687b4e1080dab448ef01e29352cb;p=thirdparty%2FPython%2Fcpython.git Backport patch 1.57 to 2.1.2. Apparently ftp servers that send 227 responses that the original parse227() routine can't handle are becoming more common. """ Change the 227 response parser to use a more liberal regular expression. This is needed for certain servers that (in violation of the standard) don't return the parentheses in the response. This fixes SF bug #441712 by Henrik Weber (not exactly using his patch). """ --- diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 3263281bc305..c08ad45cb563 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -503,6 +503,8 @@ def parse150(resp): return None +_227_re = None + def parse227(resp): '''Parse the '227' response for a PASV request. Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' @@ -510,14 +512,14 @@ def parse227(resp): if resp[:3] != '227': raise error_reply, resp - left = resp.find('(') - if left < 0: raise error_proto, resp - right = resp.find(')', left + 1) - if right < 0: - raise error_proto, resp # should contain '(h1,h2,h3,h4,p1,p2)' - numbers = resp[left+1:right].split(',') - if len(numbers) != 6: + global _227_re + if _227_re is None: + import re + _227_re = re.compile(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)') + m = _227_re.search(resp) + if not m: raise error_proto, resp + numbers = m.groups() host = '.'.join(numbers[:4]) port = (int(numbers[4]) << 8) + int(numbers[5]) return host, port