]> granicus.if.org Git - python/commitdiff
Change the 227 response parser to use a more liberal regular
authorGuido van Rossum <guido@python.org>
Fri, 17 Aug 2001 17:24:29 +0000 (17:24 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 17 Aug 2001 17:24:29 +0000 (17:24 +0000)
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

index fda7864a694ccf728d03d1a67448e9e7b0407391..4aa6244c5e977161b84c5523ee5410e06f8648b0 100644 (file)
@@ -551,6 +551,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)'
@@ -558,14 +560,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