gpt4 book ai didi

c++ - 在 cpp-netlib http 服务器中访问请求 header

转载 作者:太空狗 更新时间:2023-10-29 23:05:31 26 4
gpt4 key购买 nike

我已经开始使用 cpp-netlib(稳定版本 0.10.1)开发 HTTP 服务器,根据可用的文档,我不确定如何在服务器处理程序中访问 HTTP 请求 header 。我知道可以使用这样的包装器来完成:

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);
}

但是根据 headers.hppnot_quite_pod_request_base 的定义,这实际上是一个成对的 vector ,如果我想搜索它就很难,例如查找是否存在某个 header 。如果没有其他选择,那么我当然会坚持这一点,但它似乎最初是作为一个 multimap 至少从 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 的包装器是“go -to"在 cpp-netlib 中处理 header 的方式?至少对我来说,multimap 似乎更容易使用。

更新

我还快速浏览了 POCO 库,但无法理解它们的身份验证类是否仅适用于客户端 session 或服务器?如果有人可以就此给出提示,也许我仍然可以切换到 POCO,如果这能让生活更轻松的话。

最佳答案

您所指的特征适用于客户端请求中的 header ,用于 cpp-netlib 中的客户端实现。有一些工作正在完成(未完成)以使从服务器中的请求获取 header 与从客户端请求/响应对象获取请求相同。

服务器端的 header 是成对 vector 的原因是为了空间和时间方面的“效率”。如果您可以支付在服务器处理程序上创建多重映射的费用,您应该改为这样做。以高效方式有效地处理请求中的 header 的通常模式是始终对您要查找的 header 进行线性扫描,并在它们进入时对其进行处理。类似于此:

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;
}

如果您的应用程序需要这种级别的 header 处理,您可以使用某种模式(可能是 std::map<string, std::function<void(const std::string&)>>)对此进行概括。

不过,一般来说,遍历 vector 列表不会花费太多时间。如果 header 数量很大 (O(10,000)),那么您还有其他问题。这里的权衡是在内存局部性( vector 具有连续元素,而不是具有通常随机分配在内存不同部分的元素的映射)和高效查找(对数时间只有在一定大小后才真正有意义)之间。

我完全接受便利性受到一点影响的观点。也许不同的数据结构在这里会有帮助(可能是 boost::flat_map)。但是界面改进是使处理客户端请求/响应的代码也可以处理服务器请求/响应对象。

关于c++ - 在 cpp-netlib http 服务器中访问请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com