From 11979f1e220587198ba05fd3c1f88d4f81195fff Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 24 May 2019 18:42:16 +0400 Subject: =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=B0=D1=8F=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0,=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=82=D0=BE=D1=80.=20=D0=9F=D0=B0=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D0=B3=20HTTP=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BE=D0=B2=20=D1=81=D1=82=D0=B0=D0=BB=20=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=D0=B5=20=D1=81=D1=82=D1=80=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BC.=20=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BA=D0=B0=D0=BD=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BF=D1=80=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=BD=D0=BE=D0=BC=20HTTP?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B5.=20=D0=9D=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B4=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day7/utils.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'day7/utils.py') diff --git a/day7/utils.py b/day7/utils.py index 0aa0709..ec0c0b4 100644 --- a/day7/utils.py +++ b/day7/utils.py @@ -13,6 +13,8 @@ BAD_REQUEST = 'HTTP/1.1 400 Bad Request' NOT_FOUND = 'HTTP/1.1 404 Not Found' SUCCESS = 'HTTP/1.1 200 OK' METHOD_NOT_ALLOWED = 'HTTP/1.1 405 Method Not Allowed' +URL_REGEX_PATTERN = re.compile(r'/((.*?/?)+)?') +HTTP_METHODS = ['GET', 'POST', 'OPTIONS', 'HEAD', 'PUT', 'PATCH', 'DELETE', 'TRACE', 'CONNECT'] def add_headers(status, html: str): @@ -27,8 +29,13 @@ def add_headers(status, html: str): def validate_url(url): - url_pattern = re.compile(r'/((.*?/?)+)?') - return bool(url_pattern.fullmatch(url)) + return bool(URL_REGEX_PATTERN.fullmatch(url)) + + +def validate_first_line(line): + methods_groups = f"({'|'.join(HTTP_METHODS)})" + first_line_pattern = re.compile(rf'{methods_groups} {URL_REGEX_PATTERN.pattern} HTTP/1\.[01]') + return bool(first_line_pattern.fullmatch(line)) def parse_cookies(cookies_line: str): @@ -41,16 +48,30 @@ def parse_cookies(cookies_line: str): d[key] = value except ValueError: raise ValueError('Wrong format of cookies') - return d def parse_headers(request_line: str): request = request_line.split('\r\n') - method, url, http_ver = request.pop(0).split() + + first_line = request.pop(0) + if validate_first_line(first_line): + method, url, http_ver = first_line + else: + # Я не знаю зачем в условии необходимо завершать работу сервера, если пришел не-HTTP запрос, + # поэтому оставлю эту строку здесь. + # raise ValueError('Wrong format of HTTP request') + raise ConnectionError('Wrong format of HTTP request') + headers = {} for line in request: - field, value = line.split(': ', maxsplit=1) + + try: + field, value = line.split(': ', maxsplit=1) + except ValueError: + # raise ValueError('Wrong format of HTTP header') + raise ConnectionError('Wrong format of HTTP request') + headers[field] = value return method, url, http_ver, headers @@ -64,7 +85,8 @@ def parse_query(query_line: str): key, value = pair.split('=', maxsplit=1) d[url_decoder(key)] = url_decoder(value) except ValueError: - raise ValueError('Wrong format of query') + # raise ValueError('Wrong format of query') + raise ConnectionError('Wrong format of query') return d -- cgit v1.2.3