C++ HTTP头容器C+的最佳设计+;

C++ HTTP头容器C+的最佳设计+;,c++,c++11,stl,C++,C++11,Stl,我正在用C++11/14(VS 2015)编写一个HTTP客户端,用于使用ASIO进行异步和网络编程的实践(顺便说一句,是独立的,不是boost,所以请不要使用特定于boost的解决方案)。这是一个相当基本的问题,但我还是希望得到一个答案 struct Header { Header(const std::string& key, const std::string& val); // initializes key/val std::string key, va

我正在用C++11/14(VS 2015)编写一个HTTP客户端,用于使用ASIO进行异步和网络编程的实践(顺便说一句,是独立的,不是boost,所以请不要使用特定于boost的解决方案)。这是一个相当基本的问题,但我还是希望得到一个答案

struct Header {
    Header(const std::string& key, const std::string& val); // initializes key/val
    std::string key, val;
    bool operator==(const Header& header); // returns true if key/val are equal
    friend std::ostream& operator<<(std::ostream& os, const Header& header) {
        os << header.key << ": " << header.val;
        return os;
    }
};
struct头文件{
头(const std::string&key,const std::string&val);//初始化key/val
std::字符串键,val;
bool运算符==(const Header和Header);//如果key/val相等,则返回true

friend std::ostream&operator我的理解如下:

只有将标题合并到一个逗号分隔的列表中,标题才能重复


这似乎意味着法线贴图可以,但如果您尝试添加一个已经存在的新标题,您只需将“,”然后将新值附加到旧标题的末尾。

我的理解如下:

只有将标题合并到一个逗号分隔的列表中,标题才能重复


这似乎意味着普通映射可以,但如果您尝试添加一个已经存在的新标题,您只需在旧标题的末尾附加“,”然后新值。

在我的评论上展开

您只需尝试在地图中查找标题,如果它在地图中,并且不允许多次查找

您可以使用一个法向量或一组字符串来存储允许的重复项,并在那里对其执行一个简单的操作

也许是这样的

std::unodered_multimap<std::string, std::string> headers;
std::array<std::string, 2> allowed_duplicates = {{
    "set-cookie", "cookie"
}};

void add_header(std::string const& header, std::string const& data)
{
    if (headers.find(header) != headers.end())
    {
        // Header found, check if it's allowed multiple times
        if (std::find(allowed_duplicates.begin(),
                      allowed_duplicates.end(), header) == allowed_duplicates.end())
        {
            // Not found, the header is not allowed multiple times
            return;
        }
    }

    // Header is allowed
    headers.emplace(std::make_pair(header, data));
}
std::未排序的多映射头;
std::允许的数组\u重复={{
“设置cookie”,“cookie”
}};
void add_头(std::string const&header,std::string const&data)
{
if(headers.find(header)!=headers.end()
{
//找到标题,检查是否允许多次
如果(std::find(允许)重复。begin(),
允许的重复项。结束(),标题)=允许的重复项。结束()
{
//未找到,不允许多次使用标头
返回;
}
}
//允许使用标题
headers.emplace(std::make_pair(header,data));
}

展开我的评论

您只需尝试在地图中查找标题,如果它在地图中,并且不允许多次查找

您可以使用一个法向量或一组字符串来存储允许的重复项,并在那里对其执行一个简单的操作

也许是这样的

std::unodered_multimap<std::string, std::string> headers;
std::array<std::string, 2> allowed_duplicates = {{
    "set-cookie", "cookie"
}};

void add_header(std::string const& header, std::string const& data)
{
    if (headers.find(header) != headers.end())
    {
        // Header found, check if it's allowed multiple times
        if (std::find(allowed_duplicates.begin(),
                      allowed_duplicates.end(), header) == allowed_duplicates.end())
        {
            // Not found, the header is not allowed multiple times
            return;
        }
    }

    // Header is allowed
    headers.emplace(std::make_pair(header, data));
}
std::未排序的多映射头;
std::允许的数组\u重复={{
“设置cookie”,“cookie”
}};
void add_头(std::string const&header,std::string const&data)
{
if(headers.find(header)!=headers.end()
{
//找到标题,检查是否允许多次
如果(std::find(允许)重复。begin(),
允许的重复项。结束(),标题)=允许的重复项。结束()
{
//未找到,不允许多次使用标头
返回;
}
}
//允许使用标题
headers.emplace(std::make_pair(header,data));
}

std::map
std::multimap
如果用户想插入一个已经存在且不允许重复的标头,那么使用标准并报告错误如何?@JoachimPileborg有没有可能实现这个非常基本的方法?
std::无序的\ u map
对于唯一的标头,
std::无序的\ u multimap>
对于可能多次出现的标题,
const std::unordered_set
具有唯一标题名称,以及headers类的自定义迭代器,该迭代器将在唯一和非唯一标题上进行迭代。此外,您可能需要显式保留标题的传入顺序,以便能够在迭代过程中再现它。如何
std::map
std::multimap
如果用户想要插入一个已经存在且不允许重复的标头,只需使用标准并报告一个错误?@JoachimPileborg有没有可能非常基本地实现此功能?
std::unordered_map
对于唯一标头,对于标头,
std::unordered_multimap
这可能不止一次出现,
const std::unordered_set
具有唯一的头名称,以及Headers类的自定义迭代器,该迭代器将在唯一和非唯一的头上进行迭代。此外,您可能需要显式地保留头的传入顺序,以便能够在迭代过程中再现它。嗯,答案看起来是这样的要我指定哪些头可能会出现多次,而不是它们出现的形式。我不确定HTTP是否正确,但具有多个头的通用MIME消息是完全有效的,例如,
接收的
。顺序很重要。@user3159253这更适合HTTP。感谢您提供的链接。我想有一个选项是检查并删除e如果标题已经在中,如果是,则用逗号将其附加到字符串中。我仍然需要验证哪些标题必须是唯一的(如果有).@Goodies如果你想强制执行正确的头,那就没有办法了……不管建议的方法是什么。@user3159253,你可以在另一个列表上附加一个列表。这个答案在我看来是指定哪些头可能会出现多次,而不是它们出现的形式。我不确定HTTP,但通用m具有多个标题的IME消息是完全有效的,例如,
已收到
。顺序很重要。@user3159253这是针对HTTP的。感谢您的链接。我想一个选项是检查并查看标题是否已在,如果已在,则用逗号将其附加到字符串中。我仍然需要验证哪些标题必须是unique(如有).@Goodies如果您想强制执行正确的标题,则没有办法解决此问题。@user3159253并且您可以根据您的答案和@xaxxon提供的链接将一个列表附加到另一个列表上。我认为一个更好的选择可能是默认情况下允许重复,并限制唯一的。例如,如果