From a5d6faaa0b53687b4e1080dab448ef01e29352cb Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 18 Dec 2001 14:17:02 +0000 Subject: [PATCH] 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). """ --- Lib/ftplib.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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 -- 2.47.3