我已经开始使用开发 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
in 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
合作起来会容易得多。
UPDATE
我还快速浏览了 POCO 库,但无法理解它们的身份验证类是否仅适用于客户端会话或服务器?如果有人能对此给出提示,也许我仍然可以切换到 POCO,如果这能让生活变得更轻松的话。
您所指的特征适用于客户端请求中的标头,适用于 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;
}
您可以使用某种模式(astd::map<string, std::function<void(const std::string&)>>
也许)如果您的应用程序需要这种级别的标头处理。
但一般来说,迭代向量列表不会花费太多时间。如果标头数量很大 (O(10,000)),那么您还会遇到其他问题。这里的权衡在于内存局部性(向量具有连续的元素,而不是映射,其元素通常随机分配在内存的不同部分)和高效查找(对数时间只有在达到一定大小后才真正有意义)。
我完全接受便利性受到一点影响的观点。也许不同的数据结构在这里会有帮助(aboost::flat_map
也许)。但是接口的改进是使处理客户端请求/响应的代码也可以处理服务器请求/响应对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)