我已经开始使用cpp-netlib (稳定版本0.10.1)开发HTTP服务器,从可用的文档中我不知道如何在服务器处理程序中访问headers。我知道可以使用这样的包装来完成:
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,如果这能让生活变得更简单。
发布于 2015-03-23 15:54:22
您所指的特性适用于客户端请求中的标头,适用于cpp中的客户端实现。有一些工作正在完成(不完整),以使从服务器中的请求获取头部与从客户端请求/响应对象获取请求相同。
服务器端的头是成对向量的原因是为了提高空间和时间的“效率”。如果您能够支付在服务器处理程序上创建一个multimap的成本,您可能应该这样做。以高效的方式在请求中有效地处理标头的通常模式是始终对所寻找的标头进行线性扫描,并在它们进来时处理它们。与此类似的是:
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(10,000)),那么您还有其他问题。这里的权衡是在内存局部性(向量有连续的元素,而不是映射的元素通常是随机分配在内存的不同部分)和有效查找(对数时间只有在一定大小之后才有意义)之间的权衡。
我完全接受这样的观点,即方便会受到一点影响。也许不同的数据结构在这里会有帮助(可能是boost::flat_map )。但是,接口改进将使处理客户端请求/响应的代码也能处理服务器请求/响应对象。
https://stackoverflow.com/questions/19118940
复制相似问题