Example #1
0
    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;
    }
Example #2
0
    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;
    }
Example #3
0
    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);
      }
    }