void SimpleHttpResult::addHeaderField (std::string const& key, std::string const& value) { string k = StringUtils::trim(StringUtils::tolower(key)); if (k == "http/1.1" || k == "http/1.0") { if (value.length() > 2) { // we assume the status code is 3 chars long string code = value.substr(0, 3); setHttpReturnCode(atoi(code.c_str())); setHttpReturnMessage(value.substr(3 + 1)); } } else if (k == "content-length") { setContentLength((size_t) StringUtils::int64(value.c_str())); } else if (k == "transfer-encoding") { if (StringUtils::tolower(value) == "chunked") { _chunked = true; } } else if (k == "content-encoding") { if (StringUtils::tolower(value) == "deflate") { _deflated = true; } } _headerFields[k] = value; }
void SimpleHttpResult::addHeaderField (string const& key, string const& value) { string k = StringUtils::tolower(key); if (k == "http/1.1") { if (value.length() > 2) { string code = value.substr(0, 3); setHttpReturnCode(atoi(code.c_str())); } } else if (k == "content-length") { setContenLength(StringUtils::int64(value.c_str())); } else if (k == "transfer-encoding") { if (StringUtils::tolower(value) == "chunked") { _chunked = true; } } _headerFields[k] = value; }
void SimpleHttpResult::addHeaderField (char const* key, size_t keyLength, char const* value, size_t valueLength) { // trim key char const* end = key + keyLength; while (key < end && (*key == ' ' || *key == '\t')) { ++key; --keyLength; } // lower-case key std::string keyString(key, keyLength); StringUtils::tolowerInPlace(&keyString); // trim value end = value + valueLength; while (value < end && (*value == ' ' || *value == '\t')) { ++value; --valueLength; } if (keyString[0] == 'h') { if (! _foundHeader && (keyString == "http/1.1" || keyString == "http/1.0")) { if (valueLength > 2) { _foundHeader = true; // we assume the status code is 3 chars long if ((value[0] >= '0' && value[0] <= '9') && (value[1] >= '0' && value[1] <= '9') && (value[2] >= '0' && value[2] <= '9')) { // set response code setHttpReturnCode(100 * (value[0] - '0') + 10 * (value[1] - '0') + (value[2] - '0')); } if (valueLength >= 4) { setHttpReturnMessage(std::string(value + 4, valueLength - 4)); } } } } else if (keyString[0] == 'c') { if (keyString.size() == strlen("content-length") && keyString == "content-length") { setContentLength((size_t) StringUtils::int64(value, valueLength)); } else if (keyString.size() == strlen("content-encoding") && keyString == "content-encoding") { if (valueLength == strlen("deflate") && (value[0] == 'd' || value[0] == 'D') && (value[1] == 'e' || value[1] == 'E') && (value[2] == 'f' || value[2] == 'F') && (value[3] == 'l' || value[3] == 'L') && (value[4] == 'a' || value[4] == 'A') && (value[5] == 't' || value[5] == 'T') && (value[6] == 'e' || value[6] == 'E')) { _deflated = true; } } } else if (keyString[0] == 't') { if (keyString.size() == strlen("transfer-encoding") && keyString == "transfer-encoding") { if (valueLength == strlen("chunked") && (value[0] == 'c' || value[0] == 'C') && (value[1] == 'h' || value[1] == 'H') && (value[2] == 'u' || value[2] == 'U') && (value[3] == 'n' || value[3] == 'N') && (value[4] == 'k' || value[4] == 'K') && (value[5] == 'e' || value[5] == 'E') && (value[6] == 'd' || value[6] == 'D')) { _chunked = true; } } } auto result = _headerFields.emplace(keyString, std::string(value, valueLength)); if (! result.second) { // header already present _headerFields[keyString] = std::string(value, valueLength); } }