diff options
Diffstat (limited to 'day7/utils.py')
| -rw-r--r-- | day7/utils.py | 34 |
1 files changed, 28 insertions, 6 deletions
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 |