簡體   English   中英

訪問cpp-netlib http服務器中的請求標頭

[英]Accessing request headers in cpp-netlib http server

我已經開始使用cpp-netlib (穩定版本0.10.1)開發HTTP服務器,並且從可用的文檔中我不知道如何在服務器處理程序中訪問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_baseheaders.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;
}

如果您的應用程序需要此級別的標頭處理,您可以使用某種模式(可能是std::map<string, std::function<void(const std::string&)>> )來概括它。

一般來說,迭代向量列表不應該花費太多時間。 如果標題數量很大(O(10,000))那么您還有其他問題。 這里的權衡是在存儲器局部性之間(向量具有連續元素而不是具有通常在存儲器的不同部分中隨機分配的元素的映射)和有效查找(對數時間僅在特定大小之后才真正有意義)。

我完全接受了便利性受到影響的觀點。 也許不同的數據結構在這里會有所幫助(也許是boost::flat_map )。 但是,接口改進將使得與客戶端請求/響應一起使用的代碼也可以與服務器請求/響應對象一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM