summaryrefslogtreecommitdiff
path: root/day9/task5/utils.py
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2019-07-06 14:36:55 +0400
committerAndrew <saintruler@gmail.com>2019-07-06 14:36:55 +0400
commit1e6967f8c4f1ef64947d7f2b95268339d78db454 (patch)
treeb2ebf1ccb160e3c58f277dfec4bae8f83b03ec45 /day9/task5/utils.py
parentf1a923860c02c69d9e67d15da24f90d7306223e0 (diff)
WIP: Изменена структура сервера.
Diffstat (limited to 'day9/task5/utils.py')
-rw-r--r--day9/task5/utils.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/day9/task5/utils.py b/day9/task5/utils.py
new file mode 100644
index 0000000..5a48a9f
--- /dev/null
+++ b/day9/task5/utils.py
@@ -0,0 +1,107 @@
+import re
+
+HTTP_STATUS_CODES = {
+ 100: "Continue",
+ 101: "Switching Protocols",
+ 102: "Processing",
+ 200: "OK",
+ 201: "Created",
+ 202: "Accepted",
+ 203: "Non Authoritative Information",
+ 204: "No Content",
+ 205: "Reset Content",
+ 206: "Partial Content",
+ 207: "Multi Status",
+ 226: "IM Used", # see RFC 3229
+ 300: "Multiple Choices",
+ 301: "Moved Permanently",
+ 302: "Found",
+ 303: "See Other",
+ 304: "Not Modified",
+ 305: "Use Proxy",
+ 307: "Temporary Redirect",
+ 308: "Permanent Redirect",
+ 400: "Bad Request",
+ 401: "Unauthorized",
+ 402: "Payment Required", # unused
+ 403: "Forbidden",
+ 404: "Not Found",
+ 405: "Method Not Allowed",
+ 406: "Not Acceptable",
+ 407: "Proxy Authentication Required",
+ 408: "Request Timeout",
+ 409: "Conflict",
+ 410: "Gone",
+ 411: "Length Required",
+ 412: "Precondition Failed",
+ 413: "Request Entity Too Large",
+ 414: "Request URI Too Long",
+ 415: "Unsupported Media Type",
+ 416: "Requested Range Not Satisfiable",
+ 417: "Expectation Failed",
+ 418: "I'm a teapot", # see RFC 2324
+ 421: "Misdirected Request", # see RFC 7540
+ 422: "Unprocessable Entity",
+ 423: "Locked",
+ 424: "Failed Dependency",
+ 426: "Upgrade Required",
+ 428: "Precondition Required", # see RFC 6585
+ 429: "Too Many Requests",
+ 431: "Request Header Fields Too Large",
+ 449: "Retry With", # proprietary MS extension
+ 451: "Unavailable For Legal Reasons",
+ 500: "Internal Server Error",
+ 501: "Not Implemented",
+ 502: "Bad Gateway",
+ 503: "Service Unavailable",
+ 504: "Gateway Timeout",
+ 505: "HTTP Version Not Supported",
+ 507: "Insufficient Storage",
+ 510: "Not Extended",
+}
+
+SUCCESS_CODE = 200
+BAD_REQUEST_CODE = 400
+NOT_FOUND_CODE = 404
+METHOD_NOT_ALLOWED_CODE = 405
+
+
+def render_template(path, **kwargs):
+ with open(path, encoding='utf-8') as f:
+ template = f.read()
+
+ for key in kwargs:
+ template = template.replace(f'%%{key}%%', kwargs[key])
+
+ return template
+
+
+def parse_query(query):
+ parsed_query = {'expression': {}, 'condition': {}}
+
+ pattern = re.compile(r'(expression|condition)(\d+)_(key|value)')
+
+ for key, (value,) in query.items():
+ match = pattern.fullmatch(key)
+ if match is not None:
+ index = int(match.group(2))
+ if index not in parsed_query[match.group(1)]:
+ parsed_query[match.group(1)][index] = {}
+
+ parsed_query[match.group(1)][index][match.group(3)] = value
+
+ expressions = []
+ for expression in parsed_query['expression'].values():
+ expressions.append('`{}`="{}"'.format(
+ expression['key'], expression['value']
+ ))
+ expressions = ','.join(expressions)
+
+ conditions = []
+ for condition in parsed_query['condition'].values():
+ conditions.append('`{}`="{}"'.format(
+ condition['key'], condition['value']
+ ))
+ conditions = ' AND '.join(conditions)
+
+ return {'expressions': expressions, 'conditions': conditions}