Завершено
4
27.10.2014, 12:54
15.12.2014, 14:51
Требуется реализовать программу для распознавания адресов страниц на веб-сайте.
Два текстовых файла: с набором правил распознавания и с набором запросов. Если файл с набором запросов не указан, то запросы считываются из стандартного входа (std::сin).
Файл правил
Адрес страницы состоит из фрагментов, разделённых символом /. Правило распознавания имеет такую же структуру, как и адрес, и описывает, какие фрагменты адреса должны принимать фиксированное значение, а какие — могут принимать произвольное. Фрагментам с произвольным содержимым присваивается имя. В записи правила такой фрагмент начинается с символа :, после которого идёт имя.
Формат файла правил:
/<фикс_фрагмент>
/:<имя_фрагмента>
/<фикс_фрагмент>/:<имя_фрагмента>
/:<имя_фрагмента>/<фикс_фрагмент>
/<фикс_фрагмент>/:<имя_фрагмента>/<фикс_фрагмент>
...
Пример набора правил для сайта с блогами:
/posts/new
/posts/:id
/posts/:id/delete
/blogs/:name/posts/:id
Здесь id и name — имена фрагментов с произвольным содержимым.
Файл запросов состоит из строк с адресами страниц.
Например:
/posts/1
/posts/new
/posts/2
/posts/super-mega-long-title
/blogs/petya/posts/999-abc
Разработать модуль, который позволяет сопоставить адреса страниц тому или иному правилу из заранее заданного набора.
Модуль может быть полезен при обработке сервером входящих HTTP-запросов, когда ответное действие сервера должно соответствовать запрашиваемому адресу.
Функциональность модуля:
–1). В случае многозначности (адрес подходит под несколько правил), должно сработать правило, которое было добавлено раньше прочих. Дополнительно должна формироваться и возвращаться структура данных, содержащая в себе значения именованных фрагментов.Необходимо реализовать набор тестов, проверяющих работу реализованных классов.
Текстовый файл со списком найденных правил и значениями именованных фрагментов (если они есть в правиле). Если выходной файл не указан, то результаты пишутся в стандартный поток вывода (std::сout).
Например, для приведённых выше правил и запросов, результат будет выглядеть следующим образом:
2 id='1'
1
2 id='2'
2 id='super-mega-long-title'
4 name='petya' id='999-abc'
Протокол HTTP поддерживает различные методы доступа к страницам. В процессе запроса передаётся не только адрес, но и метод: GET, POST, DELETE, PUT, PATCH.
Добавить поддержку HTTP-методов. Каждое правило должно соответствовать одному или нескольким HTTP-методам (подумайте, как их задавать и хранить!). У метода поиска по правилам добавляется ещё один аргумент: HTTP-метод запроса. Теперь он должен искать первое правило, которое будет соответствовать HTTP-методу запроса и адресу.