diff options
| author | Andrew <saintruler@gmail.com> | 2019-07-06 14:36:55 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2019-07-06 14:36:55 +0400 |
| commit | 1e6967f8c4f1ef64947d7f2b95268339d78db454 (patch) | |
| tree | b2ebf1ccb160e3c58f277dfec4bae8f83b03ec45 /day9/task5/utils.py | |
| parent | f1a923860c02c69d9e67d15da24f90d7306223e0 (diff) | |
WIP: Изменена структура сервера.
Diffstat (limited to 'day9/task5/utils.py')
| -rw-r--r-- | day9/task5/utils.py | 107 |
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} |