summaryrefslogtreecommitdiff
path: root/day7/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'day7/utils.py')
-rw-r--r--day7/utils.py34
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