mirror of https://github.com/python/cpython
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).
This commit is contained in:
parent
2dc07946bf
commit
70297d3bd4
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue