# 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 из задания. ## 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)