blob: 3a8199c994f4a12d31e09cad38d94552967b2918 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_FETCH_HEADER_LIST_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_FETCH_HEADER_LIST_H_
#include <utility>
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
// http://fetch.spec.whatwg.org/#terminology-headers
class CORE_EXPORT FetchHeaderList final
: public GarbageCollected<FetchHeaderList> {
public:
struct ByteCaseInsensitiveCompare {
bool operator()(const String& lhs, const String& rhs) const {
return CodeUnitCompareLessThan(lhs.LowerASCII(), rhs.LowerASCII());
}
};
typedef std::pair<String, String> Header;
FetchHeaderList* Clone() const;
FetchHeaderList();
~FetchHeaderList();
void Append(const String&, const String&);
void Set(const String&, const String&);
// FIXME: Implement parse()
String ExtractMIMEType() const;
size_t size() const;
void Remove(const String&);
bool Get(const String&, String&) const;
String GetAsRawString(int status_code, String status_message) const;
bool Has(const String&) const;
void ClearList();
Vector<Header> SortAndCombine() const;
const std::multimap<String, String, ByteCaseInsensitiveCompare>& List()
const {
return header_list_;
}
static bool IsValidHeaderName(const String&);
static bool IsValidHeaderValue(const String&);
void Trace(Visitor* visitor) const {}
private:
// While using STL data structures in Blink is not very common or
// encouraged, we do need a multimap here. The closest WTF structure
// comparable to what we need would be a
// HashMap<String, Vector<String>>
// but it is not a "flat" data structure like std::multimap is. The
// size() of the HashMap is the number of distinct header names, not
// the total number of headers and values on the list.
// This would cause FetchHeaderList::size() to have to manually
// iterate through all keys and vectors in the HashMap. Similarly,
// list() would require callers to manually iterate through the
// HashMap's keys and value vector.
std::multimap<String, String, ByteCaseInsensitiveCompare> header_list_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_FETCH_HEADER_LIST_H_