diff options
Diffstat (limited to 'day7')
| -rw-r--r-- | day7/backend.py | 4 | ||||
| -rw-r--r-- | day7/bootstrapper.py | 55 | ||||
| -rw-r--r-- | day7/config.py | 3 | ||||
| -rw-r--r-- | day7/db.py | 13 | ||||
| -rw-r--r-- | day7/http_handler.py | 19 |
5 files changed, 77 insertions, 17 deletions
diff --git a/day7/backend.py b/day7/backend.py index b3a8cd2..5fef9c3 100644 --- a/day7/backend.py +++ b/day7/backend.py @@ -2,7 +2,7 @@ import re from templater import render_template from utils import parse_cookies, add_text_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS, METHOD_NOT_ALLOWED -from config import TEXT_TEMPLATE_NAME +from config import TEXT_TEMPLATE_NAME, FORM_TEMPLATE_NAME import db @@ -60,7 +60,7 @@ def fallback_wrong_method(query, *args): @route('/') def index_get(query, *args): - return SUCCESS, render_template('form', color=get_color()) + return SUCCESS, render_template(FORM_TEMPLATE_NAME, color=get_color()) # Хотелось попробовать сделать что-то высокоуровневое с декораторами. diff --git a/day7/bootstrapper.py b/day7/bootstrapper.py new file mode 100644 index 0000000..60d5de8 --- /dev/null +++ b/day7/bootstrapper.py @@ -0,0 +1,55 @@ +import argparse +import shelve +from config import CONFIG_DB_PATH +from sys import argv + +parser = argparse.ArgumentParser() + +parser.add_argument( + '--chunk-size', type=int, default=1024, + help='Size of chunk that server uses when fetching data from connection' +) + +parser.add_argument( + '--bg-color', type=str, default='white', + help='Default background color of all webpages' +) + +parser.add_argument('--short-log', action='store_true') +parser.add_argument('--show-errors', action='store_true') + +parser.add_argument( + '--log', default='log.log', + help='File where log will be written' +) +parser.add_argument( + '--cookies-db', default='db/cookies.db', + help='Path to file where cookies will be stored' +) + +parser.add_argument( + '--host', default='0.0.0.0', + help='IP of interface where server will be started' +) +parser.add_argument( + '--port', type=int, default=8888, + help='Port on which server will be started' +) + + +args = parser.parse_known_args(argv[1:])[0] + +with (shelve.open(CONFIG_DB_PATH), shelve.open(args.cookies_db)) as (config, cookies): + config['chunk'] = args.chunk_size + config['short_log'] = args.short_log + config['log_path'] = args.log + config['show_errors'] = args.show_errors + config['cookies_db_path'] = args.cookies_db + config['host'] = args.host + config['port'] = args.port + + cookies['bg_color'] = args.bg_color + + +import http_handler +http_handler.main() diff --git a/day7/config.py b/day7/config.py index b5d596a..71bec27 100644 --- a/day7/config.py +++ b/day7/config.py @@ -1,2 +1,3 @@ -CHUNK = 1024 TEXT_TEMPLATE_NAME = 'index' +FORM_TEMPLATE_NAME = 'form' +CONFIG_DB_PATH = 'db/config.db' @@ -1,21 +1,22 @@ import shelve +from config import CONFIG_DB_PATH def set_cookie(key, value): - _db[key] = value + _cookies_db[key] = value def get_cookie(key, default=None): - return _db.get(key, default) + return _cookies_db.get(key, default) def set_config_entry(key, value): - _config[key] = value + _config_db[key] = value def get_config_entry(key, default=None): - return _config.get(key, default) + return _config_db.get(key, default) -_db = shelve.open('db/cookies.db') -_config = shelve.open('db/config.db') +_config_db = shelve.open(CONFIG_DB_PATH) +_cookies_db = shelve.open(get_config_entry('cookies_db_path')) diff --git a/day7/http_handler.py b/day7/http_handler.py index 8fd27bc..6db918c 100644 --- a/day7/http_handler.py +++ b/day7/http_handler.py @@ -2,6 +2,7 @@ from socket import socket, AF_INET, SOCK_STREAM, SHUT_RDWR, SOL_SOCKET, SO_REUSE from time import strftime, gmtime import logging +import db from backend import run from utils import ( parse_cookies, parse_query, parse_headers, @@ -10,10 +11,9 @@ from utils import ( ) from templater import render_template from config import * -import db -logging.basicConfig(filename='log.log', level=logging.INFO) +logging.basicConfig(filename=db.get_config_entry('log_path'), level=logging.INFO) def log_requests(func): @@ -93,14 +93,15 @@ def parse_request(connection): cookies = {} if 'Content-Type' in headers and headers['Content-Type'] == 'application/x-www-form-urlencoded': + chunk = db.get_config_entry('chunk') length = int(headers['Content-Length']) - len(buffer) while length > 0: - if length < CHUNK: + if length < chunk: data = connection.recv(length) length = 0 else: - data = connection.recv(CHUNK) - length -= CHUNK + data = connection.recv(chunk) + length -= chunk buffer += data[0] @@ -138,7 +139,10 @@ def handle_connection(connection, address): connection.sendall(response.encode()) -def main(host, port): +def main(): + host = db.get_config_entry('host') + port = db.get_config_entry('port') + sock = socket(AF_INET, SOCK_STREAM) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.bind((host, port)) @@ -175,5 +179,4 @@ def main(host, port): if __name__ == '__main__': - HOST, PORT = ADDR = '0.0.0.0', 8888 - main(HOST, PORT) + main() |