1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
# BrandNewServer Модули
## backend.py
### `route(url_format, methods)`
> *Используется как декоратор.*
Указание при каком url и методах в запросе должна вызываться декорируемая функция.
При инициализации декоратора надо указать url регулярное выражение и http методы.
В декорируемую функцию передаются параметры query из тела запроса и сматченные группы
из регулярного выражения `url_format`. Добавляет декорируемые функции в дерево роутера.
### `run(request)`
Принимает разобранный http-запрос, добавляет новые cookie-данные в базу данных.
Ищет в дереве роутера функцию, которую необходимо вызвать для обработки текущего запроса.
При нахождении такой функции передает ей все необходимые данные о запросе.
Если подходящая функция не была найдена возвращает обработчику статус `404 Not Found`.
### Пользовательские функции
### `get_color()`
Специфичная для этой программы функция. Возвращает цвет фона, который
должен быть у каждой возвращаемой страницы.
### `fallback_wrong_method(query, *args)`
Вызывается при любом url, если http-метод не GET или POST.
Возвращает обработчику статус `405 Method Not Allowed`
### `index_get(query, *args)`
Содержит страницу с формой из которой можно отправлять все остальные соответствующие запросы.
С этой страницы запросы отсылаются на POST-версии обработчиков, которые работают эквивалентно
GET-обработчикам. Далее будут описаны только GET-версии обработчиков.
* divide_get(query, *args): Делит одно число на другое, доставая эти числа из url запроса.
* show_errors_get(query, *args): Включает/выключает опцию show_errors из задания.
* set_cookie_get(query, *args): Добавляет/обновляет cookie-записи в локальной базе данных.
* short_log_get(query, *args): Включает/выключает опцию short_log из задания.
## main.py
Обрабатывает переданные аргументы командной строки, инициализирует
базу данных с конфигурацией сервера и запускает его.
## config.py
Содержит некоторые конфигурационные переменные.
## db.py
Для хранения данных используется shelve.
### `set_cookie(key, value)`
Добавляет/Обновляет данные в cookies-базе данных
### `get_cookie(key, default)`
Получение значения из cookie-базы данных.
### `set_config_entry(key, value)`
Добавляет/Обновляет данные в базу данных конфигурации сервера.
### `get_config_entry(key, default=None)`
Получение значения из базы данных конфигурации сервера.
## http_handler.py
### `main(host, port)`
Запускает сервер по адресу `host:port`. Также тут
обрабатывается остановка сервера при нажатии `Ctrl+C`
### `log_requests(func)`
> *Используется как декоратор.*
Логирует в файл все запросы, приходящие в функцию `process_request`.
### `parse_request(connection)`
Принимаем запрос от клиента и тут же парсим заголовки. Если в теле
запроса приходят дополнительные данные, то они тоже обрабатываются.
### `process_request(address, request)`
> *Эта функция логируется с помощью функции* `log_func`
Проверяется валидность url. Если url валиден,
то запрос отправляется на обработку в `backend.py`.
### `handle_connection(connection, address)`
Как только к серверу присоединяется какой-то клиент,
то это соединение обрабатывается тут. С помощью `get_request`
принимаются заголовки и отправляются в `process_request`. Ответ
клиенту, полученный из бекэнда, отправляется тут.
### `get_color()`
Специфичная для этой программы функция. Возвращает цвет фона, который
должен быть у каждой возвращаемой страницы.
## templater.py
### `render_template(template_name, **kwargs)`
Нам постоянно нужно присылать однотипные HTML-странички и для этого пригодится HTML-шаблонизатор,
который может по небольшому количеству изменяемых параметров вернуть готовую страницу.
При каждом вызове шаблон загружается заново, поэтому нет необходимости перезагружать сервер при изменении шаблона.
## utils.py
Константы для ответов в http запросах.
Функции, необходимые для обработки любых http-запросов.
* `add_text_headers(status, html)`: добавляет заголовки к ответной html-странице
* `validate_url(url)`: проверка url на валидность.
* `validate_first_line(line)`: проверка первой строки http-запроса на валидность.
* `parse_cookies(cookies_line)`: парсинг cookies
* `format_cookies(cookies)`: формирование cookie-строки из переданного словаря.
* `parse_headers(request_line)`: парсинг заголовков
* `parse_query(query_line)`: парсинг параметров в теле заголовка
* `url_decoder(url_line)`: [декодирование url](https://en.wikipedia.org/wiki/Percent-encoding)
* `url_encoder(line)`: [кодирование url](https://en.wikipedia.org/wiki/Percent-encoding)
# Директории
Перед запуском сервера необходимо предварительно создать следующие директории:
## db
По умолчанию в этой директории создадутся базы данных сервера.
## logs
По умолчанию в эту директорию будет записываться лог сервера.
## templates
Для использования шаблонизатора сервер **должен** содержать в рабочей директории
папку templates в которой будут находиться все html-шаблоны.
|