blob: e32d665df847b15485482210d3e03876ddbe7ec4 [file] [log] [blame]
// Copyright 2017 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.
#include "public/platform/WebHTTPHeaderMap.h"
#include <memory>
#include <string>
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
#include "platform/network/HTTPHeaderMap.h"
#include "platform/wtf/text/AtomicString.h"
#include "public/platform/WebString.h"
namespace blink {
class WebHTTPHeaderMap::WebHTTPHeaderMapImpl {
public:
explicit WebHTTPHeaderMapImpl(const HTTPHeaderMap& map) : map_(map){};
explicit WebHTTPHeaderMapImpl(const net::HttpRequestHeaders* headers) {
for (net::HttpRequestHeaders::Iterator it(*headers); it.GetNext();) {
map_.Add(
WTF::AtomicString::FromUTF8(it.name().c_str(), it.name().length()),
WTF::AtomicString::FromUTF8(it.value().c_str(), it.value().length()));
}
};
explicit WebHTTPHeaderMapImpl(const net::HttpResponseHeaders* headers) {
size_t iter = 0;
std::string name;
std::string value;
while (headers->EnumerateHeaderLines(&iter, &name, &value)) {
WTF::AtomicString atomic_name =
WTF::AtomicString::FromUTF8(name.c_str(), name.length());
WTF::AtomicString atomic_value =
WTF::AtomicString::FromUTF8(value.c_str(), value.length());
if (map_.Contains(atomic_name))
map_.Set(atomic_name, map_.Get(atomic_name) + "," + atomic_value);
else
map_.Add(atomic_name, atomic_value);
}
};
const HTTPHeaderMap& map() const { return map_; };
private:
HTTPHeaderMap map_;
};
WebHTTPHeaderMap::~WebHTTPHeaderMap() = default;
;
WebHTTPHeaderMap::WebHTTPHeaderMap(const HTTPHeaderMap& map) {
implementation_ = std::make_unique<WebHTTPHeaderMapImpl>(map);
}
WebHTTPHeaderMap::WebHTTPHeaderMap(const net::HttpResponseHeaders* headers) {
implementation_ = std::make_unique<WebHTTPHeaderMapImpl>(headers);
}
WebHTTPHeaderMap::WebHTTPHeaderMap(const net::HttpRequestHeaders* headers) {
implementation_ = std::make_unique<WebHTTPHeaderMapImpl>(headers);
}
const HTTPHeaderMap& WebHTTPHeaderMap::GetHTTPHeaderMap() const {
return implementation_->map();
}
WebString WebHTTPHeaderMap::Get(const WebString& name) const {
return implementation_->map().Get(name).GetString();
}
} // namespace blink