summaryrefslogtreecommitdiff
path: root/day7/README.md
blob: 73b300381cda486b86bd52c3a82aaeb839ec8a80 (plain)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
# BrandNewServer Модули

## router.py
### `Route`
Представляет из себя класс роута. При инициализации принимает допустимые 
методы и регулярное выражение. Содержит методы для работы роутинга.
Чтобы созданный путь стал обрабатываться необходимо поместить объект Route в таблицу роутера.

* `check_route(url, method)`: По указанным URL и методу проверят подходит ли URL под соответсвующие настройки пути.
* `invoke_callback(url, method, query)`: Как и `check_route` проверяет параметр на валидность, но если он валиден, то
  вызывается соответствующий обработчик.

### `route(url_format, methods)`
> *Используется как декоратор.*

Указание при каком url и методах в запросе должна вызываться декорируемая функция.
При инициализации декоратора надо указать url регулярное выражение и http методы.
В декорируемую функцию передаются параметры query из тела запроса и сматченные группы 
из регулярного выражения `url_format`. Добавляет декорируемые функции в дерево роутера.

### `run(request)`
Принимает разобранный http-запрос, добавляет новые cookie-данные в базу данных.
Ищет в таблице роутера функцию, которую необходимо вызвать для обработки текущего запроса.
При нахождении такой функции передает ей все необходимые данные о запросе.
Если подходящая функция не была найдена возвращает обработчику статус `404 Not Found`.

## backend.py
### Пользовательские функции
### `get_color()`
Специфичная для этой программы функция. Возвращает цвет фона, который
должен быть у каждой возвращаемой страницы.

### `get_error_template(text, 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`. Также тут
обрабатывается остановка сервера при нажатии `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-шаблоны.