/* */ #include "HttpHeader.h" #include "Range.h" #include "Util.h" namespace aria2 { void HttpHeader::put(const std::string& name, const std::string& value) { std::multimap::value_type vt(Util::toLower(name), value); table.insert(vt); } bool HttpHeader::defined(const std::string& name) const { return table.count(Util::toLower(name)) >= 1; } std::string HttpHeader::getFirst(const std::string& name) const { std::multimap::const_iterator itr = table.find(Util::toLower(name)); if(itr == table.end()) { return ""; } else { return (*itr).second; } } std::deque HttpHeader::get(const std::string& name) const { std::deque v; for(std::multimap::const_iterator itr = table.find(Util::toLower(name)); itr != table.end(); itr++) { v.push_back((*itr).second); } return v; } unsigned int HttpHeader::getFirstAsUInt(const std::string& name) const { return getFirstAsULLInt(name); } uint64_t HttpHeader::getFirstAsULLInt(const std::string& name) const { std::string value = getFirst(name); if(value == "") { return 0; } else { return strtoull(value.c_str(), 0, 10); } } RangeHandle HttpHeader::getRange() const { std::string rangeStr = getFirst("Content-Range"); if(rangeStr == "") { std::string contentLengthStr = getFirst("Content-Length"); if(contentLengthStr == "") { return new Range(0, 0, 0); } else { uint64_t contentLength = strtoull(contentLengthStr.c_str(), 0, 10); if(contentLength == 0) { return new Range(0, 0, 0); } else { return new Range(0, contentLength-1, contentLength); } } } std::string::size_type rangeSpecIndex = rangeStr.find("bytes "); if(rangeSpecIndex == std::string::npos) { return new Range(0, 0, 0); } std::pair rangePair; Util::split(rangePair, rangeStr.substr(rangeSpecIndex+6), '/'); std::pair startEndBytePair; Util::split(startEndBytePair, rangePair.first, '-'); uint64_t startByte = STRTOULL(startEndBytePair.first.c_str()); uint64_t endByte = STRTOULL(startEndBytePair.second.c_str()); uint64_t entityLength = STRTOULL(rangePair.second.c_str()); return new Range(startByte, endByte, entityLength); } } // namespace aria2