# 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-шаблоны.