diff --git a/src/HTTPHeader.cpp b/src/HTTPHeader.cpp index dfb968e..af75844 100644 --- a/src/HTTPHeader.cpp +++ b/src/HTTPHeader.cpp @@ -1,9 +1,13 @@ #include "HTTPHeader.hpp" +#include +#include +#include + namespace httpsserver { HTTPHeader::HTTPHeader(const std::string &name, const std::string &value): - _name(name), + _name(normalizeHeaderName(name)), _value(value) { } @@ -16,4 +20,24 @@ std::string HTTPHeader::print() { return _name + ": " + _value; } +std::string normalizeHeaderName(std::string const &name) { + std::locale loc; + std::stringbuf buf; + std::ostream oBuf(&buf); + bool upper = true; + std::string::size_type len = name.length(); + for (std::string::size_type i = 0; i < len; ++i) { + if (upper) { + oBuf << std::toupper(name[i], loc); + upper = false; + } else { + oBuf << std::tolower(name[i], loc); + if (!std::isalnum(name[i], loc)) { + upper=true; + } + } + } + return buf.str(); +} + } /* namespace httpsserver */ diff --git a/src/HTTPHeader.hpp b/src/HTTPHeader.hpp index eaee0ca..0e0432c 100644 --- a/src/HTTPHeader.hpp +++ b/src/HTTPHeader.hpp @@ -18,6 +18,15 @@ class HTTPHeader { std::string print(); }; +/** + * \brief Normalizes case in header names + * + * It converts the first letter and every letter after a non-alnum character + * to uppercase. For example, "content-length" becomes "Content-Length" and + * "HOST" becomes "Host". + */ +std::string normalizeHeaderName(std::string const &name); + } /* namespace httpsserver */ #endif /* SRC_HTTPHEADER_HPP_ */ diff --git a/src/HTTPHeaders.cpp b/src/HTTPHeaders.cpp index 26dda1a..c06f6c6 100644 --- a/src/HTTPHeaders.cpp +++ b/src/HTTPHeaders.cpp @@ -13,8 +13,9 @@ HTTPHeaders::~HTTPHeaders() { } HTTPHeader * HTTPHeaders::get(std::string const &name) { + std::string normalizedName = normalizeHeaderName(name); for(std::vector::iterator header = _headers->begin(); header != _headers->end(); ++header) { - if ((*header)->_name.compare(name)==0) { + if ((*header)->_name.compare(normalizedName)==0) { return (*header); } } @@ -22,8 +23,9 @@ HTTPHeader * HTTPHeaders::get(std::string const &name) { } std::string HTTPHeaders::getValue(std::string const &name) { + std::string normalizedName = normalizeHeaderName(name); for(std::vector::iterator header = _headers->begin(); header != _headers->end(); ++header) { - if ((*header)->_name.compare(name)==0) { + if ((*header)->_name.compare(normalizedName)==0) { return ((*header)->_value); } }