summaryrefslogtreecommitdiff
path: root/day7
diff options
context:
space:
mode:
Diffstat (limited to 'day7')
-rw-r--r--day7/backend.py4
-rw-r--r--day7/bootstrapper.py55
-rw-r--r--day7/config.py3
-rw-r--r--day7/db.py13
-rw-r--r--day7/http_handler.py19
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'
diff --git a/day7/db.py b/day7/db.py
index 11d2a45..4502bfd 100644
--- a/day7/db.py
+++ b/day7/db.py
@@ -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()