Доступ к заголовкам запросов на http-сервере cpp-netlib

Я начал разработку HTTP-сервера, используя cpp-netlib (стабильный выпуск 0.10.1) и из доступной документации я не уверен, как получить доступ к заголовкам HTTP-запросов в обработчике сервера. Я знаю, что это можно сделать с помощью обертки следующим образом:

void operator()(async_server::request const &Request, async_server::connection_ptr pConnection)
{
http::impl::request_headers_wrapper<http::tags::http_async_server> Headers = headers(Request);
}

Но согласно определению not_quite_pod_request_base в headers.hpp на самом деле это вектор пар, который трудно найти, если я хочу, например, найти, присутствует ли определенный заголовок Если нет других вариантов, то, конечно, я буду придерживаться этого, однако, похоже, что изначально это подразумевалось как мультикарта, по крайней мере, исходя из headers_container.hpp:

namespace boost { namespace network {

template <class Tag>
struct headers_container {
typedef std::multimap<
typename string<Tag>::type,
typename string<Tag>::type
> type;
};

} // namespace network
} // namespace boost

Так может кто-нибудь либо указать, почему существует такое переопределение, или я упускаю какой-то способ на самом деле получить multimap или это обертка с vector «перейти к» способ работы с заголовками в cpp-netlib? По крайней мере, мне кажется, что multimap было бы намного проще работать.

ОБНОВИТЬ

Я также быстро взглянул на библиотеки POCO, но не смог понять, предназначены ли их классы аутентификации только для клиентских сессий или для сервера? Если кто-то может дать подсказку по этому вопросу, возможно, я все же смогу перейти на POCO, если это значительно облегчит жизнь.

3

Решение

Эта черта, на которую вы ссылаетесь, применяется к заголовкам в запросе на стороне клиента для реализации на стороне клиента в cpp-netlib. Была проделана некоторая работа (незавершенная), чтобы сделать получение заголовка из запроса на сервере таким же, как для получения запроса от клиентских объектов запроса / ответа.

Причина, по которой заголовки на стороне сервера представляют собой вектор пар, заключается в «эффективности» с точки зрения пространства и времени. Если вы можете оплатить стоимость создания мультикарты на обработчике сервера, вам, вероятно, следует сделать это вместо этого. Обычный шаблон для эффективной работы с заголовками в запросе — всегда выполнять линейное сканирование искомых заголовков и обрабатывать их по мере их поступления. Что-то похожее на это:

string content_type, content_length;
for (const auto& header : request.headers) {
if (header.name == "Content-Type") content_type = header.value;
if (header.name == "Content-Length") content_length = header.value;
if (!content_type.empty() && !content_length.empty()) break;
}

Вы можете обобщить это, используя какой-то шаблон ( std::map<string, std::function<void(const std::string&)>> возможно), если ваше приложение требует этот уровень обработки заголовка.

В общем, перебор списка векторов не должен занимать слишком много времени. Если количество заголовков велико (O (10000)), то у вас есть другие проблемы. Компромисс здесь находится между локальностью памяти (вектор имеет смежные элементы в отличие от карты, в которой элементы обычно расположены случайным образом в разных частях памяти) и эффективным поиском (логарифмическое время действительно имеет смысл только после определенного размера).

Я полностью согласен с тем, что удобство немного страдает. Может быть, здесь была бы полезна другая структура данных ( boost::flat_map возможно). Но усовершенствование интерфейса должно было бы сделать так, чтобы код, который работает с запросом / ответом клиента, также работал с объектами запроса / ответа сервера.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]