Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/marian-nmt/Simple-WebSocket-Server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreidheim <eidheim@gmail.com>2017-11-08 13:31:06 +0300
committereidheim <eidheim@gmail.com>2017-11-08 13:31:06 +0300
commitb1ddfedb7c65b0acd61f35d7ed8e7c1c2696f701 (patch)
tree4808ea1486827a492d4310475f0674ce78e98260 /utility.hpp
parent00f26f5392d9fd274968e4a034b7bab098a3adf7 (diff)
Updated utility.hpp
Diffstat (limited to 'utility.hpp')
-rw-r--r--utility.hpp52
1 files changed, 26 insertions, 26 deletions
diff --git a/utility.hpp b/utility.hpp
index 5925403..b1b33e2 100644
--- a/utility.hpp
+++ b/utility.hpp
@@ -158,53 +158,53 @@ namespace SimpleWeb {
class FieldValue {
public:
- class SemicolonSeparated {
+ class SemicolonSeparatedAttributes {
public:
- /// Parse Set-Cookie or Content-Disposition header field value
- static CaseInsensitiveMultimap parse(const std::string &line) {
+ /// Parse Set-Cookie or Content-Disposition header field value. Attribute values are percent-decoded.
+ static CaseInsensitiveMultimap parse(const std::string &str) {
CaseInsensitiveMultimap result;
- std::size_t para_start_pos = std::string::npos;
- std::size_t para_end_pos = std::string::npos;
+ std::size_t name_start_pos = std::string::npos;
+ std::size_t name_end_pos = std::string::npos;
std::size_t value_start_pos = std::string::npos;
- for(std::size_t c = 0; c < line.size(); ++c) {
- if(para_start_pos == std::string::npos) {
- if(line[c] != ' ' && line[c] != ';')
- para_start_pos = c;
+ for(std::size_t c = 0; c < str.size(); ++c) {
+ if(name_start_pos == std::string::npos) {
+ if(str[c] != ' ' && str[c] != ';')
+ name_start_pos = c;
}
else {
- if(para_end_pos == std::string::npos) {
- if(line[c] == ';') {
- result.emplace(line.substr(para_start_pos, c - para_start_pos), std::string());
- para_start_pos = std::string::npos;
+ if(name_end_pos == std::string::npos) {
+ if(str[c] == ';') {
+ result.emplace(str.substr(name_start_pos, c - name_start_pos), std::string());
+ name_start_pos = std::string::npos;
}
- else if(line[c] == '=')
- para_end_pos = c;
+ else if(str[c] == '=')
+ name_end_pos = c;
}
else {
if(value_start_pos == std::string::npos) {
- if(line[c] == '"' && c + 1 < line.size())
+ if(str[c] == '"' && c + 1 < str.size())
value_start_pos = c + 1;
else
value_start_pos = c;
}
- else if(line[c] == '"' || line[c] == ';') {
- result.emplace(line.substr(para_start_pos, para_end_pos - para_start_pos), line.substr(value_start_pos, c - value_start_pos));
- para_start_pos = std::string::npos;
- para_end_pos = std::string::npos;
+ else if(str[c] == '"' || str[c] == ';') {
+ result.emplace(str.substr(name_start_pos, name_end_pos - name_start_pos), Percent::decode(str.substr(value_start_pos, c - value_start_pos)));
+ name_start_pos = std::string::npos;
+ name_end_pos = std::string::npos;
value_start_pos = std::string::npos;
}
}
}
}
- if(para_start_pos != std::string::npos) {
- if(para_end_pos == std::string::npos)
- result.emplace(line.substr(para_start_pos), std::string());
+ if(name_start_pos != std::string::npos) {
+ if(name_end_pos == std::string::npos)
+ result.emplace(str.substr(name_start_pos), std::string());
else if(value_start_pos != std::string::npos) {
- if(line.back() == '"')
- result.emplace(line.substr(para_start_pos, para_end_pos - para_start_pos), line.substr(value_start_pos, line.size() - 1));
+ if(str.back() == '"')
+ result.emplace(str.substr(name_start_pos, name_end_pos - name_start_pos), Percent::decode(str.substr(value_start_pos, str.size() - 1)));
else
- result.emplace(line.substr(para_start_pos, para_end_pos - para_start_pos), line.substr(value_start_pos));
+ result.emplace(str.substr(name_start_pos, name_end_pos - name_start_pos), Percent::decode(str.substr(value_start_pos)));
}
}