Возможно ли иметь динамические маршруты в пион? - PullRequest
0 голосов
/ 12 июня 2018

Я бы хотел использовать pion 5.0.6 в качестве небольшого веб-сервера в проекте VS2017 c ++.Для статических маршрутов я могу использовать

add_resource("/my/static/route", <handler>)

Мне также понадобятся динамические маршруты - например, "/data/:id/info Как мне это сделать?

1 Ответ

0 голосов
/ 13 июня 2018

Для тех, кому это может понадобиться: я нашел решение для добавления динамической маршрутизации к веб-серверу pion .Для этого требуется код интеллектуального маршрутизатора, который я нашел в hxoht на github , и работает так, что

  • все маршруты - статические и динамические - устанавливаются с httpd->add_resource(<url>, <handler);
  • обработчик 404 должен быть установлен с помощью httpd->set_not_found_handler(<handler>); и отвечает за отправку динамических маршрутов обработчикам, добавленным выше.
  • класс вашего веб-сервера должен быть производным от pion::http::server, чтобы найти обработчик по именис httpd->find_request_handler(<url>, <handler>);
  • в обработчике 404 вы используете метод Match::test(<dynamic-route>) для обнаружения динамического маршрута - как в следующем фрагменте кода:

    void handle_404(http::request_ptr& req, tcp::connection_ptr& con)
    {
        Route target;
        Match dynamic = target.set(req->get_resource());
        for (auto& route : dynamic_routes) // Our list of dynamic routes
        {
            if (dynamic.test(route)) // Does the url match the dynamic route pattern?
            {
                request_handler_t h;
                if (find_request_handler(route, h))
                {
                    auto name = get_param_name(route); // e.g. /a/:b -> "b"
                    value = dynamic.get(name); // Save value in string or map<name, value>
                    h(req, con); // Call original handler with value set properly
                    return;
                }
            }
        }
        // If no match then return a 404.
        http::response_writer_ptr w(http::response_writer::create(con, *req,
        boost::bind(&tcp::connection::finish, con)));
        http::response& res = w->get_response();
        res.set_status_code(http::types::RESPONSE_CODE_NOT_FOUND);
        res.set_status_message(http::types::RESPONSE_MESSAGE_NOT_FOUND);
        w->send();
    }
    

Для использования веб-сервера pion многопоточным способом *1029* я бы хранил проанализированное значение внутри объекта request , который будет производным от pion::http::request.

Это будет работать для Windows и Linux :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...