// Copyright 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <libwebserv/request_impl.h>
#include <base/callback.h>
#include <brillo/http/http_utils.h>
#include <brillo/streams/file_stream.h>
#include <libwebserv/dbus_protocol_handler.h>
namespace libwebserv {
FileInfo::FileInfo(DBusProtocolHandler* handler,
int file_id,
const std::string& request_id,
const std::string& file_name,
const std::string& content_type,
const std::string& transfer_encoding)
: handler_{handler},
file_id_{file_id},
request_id_{request_id},
file_name_(file_name),
content_type_(content_type),
transfer_encoding_(transfer_encoding) {
}
void FileInfo::GetData(
const base::Callback<void(brillo::StreamPtr)>& success_callback,
const base::Callback<void(brillo::Error*)>& error_callback) const {
handler_->GetFileData(request_id_,
file_id_,
success_callback,
error_callback);
}
RequestImpl::RequestImpl(DBusProtocolHandler* handler,
const std::string& url,
const std::string& method)
: Request{url, method}, handler_{handler} {
}
brillo::StreamPtr RequestImpl::GetDataStream() {
return brillo::FileStream::FromFileDescriptor(
raw_data_fd_.GetPlatformFile(), false, nullptr);
}
std::vector<PairOfStrings> Request::GetFormData() const {
auto data = GetFormDataGet();
auto post_data = GetFormDataPost();
data.insert(data.end(), post_data.begin(), post_data.end());
return data;
}
std::vector<PairOfStrings> Request::GetFormDataGet() const {
return std::vector<PairOfStrings>{get_data_.begin(), get_data_.end()};
}
std::vector<PairOfStrings> Request::GetFormDataPost() const {
return std::vector<PairOfStrings>{post_data_.begin(), post_data_.end()};
}
std::vector<std::pair<std::string, const FileInfo*>> Request::GetFiles() const {
std::vector<std::pair<std::string, const FileInfo*>> data;
data.reserve(file_info_.size());
for (const auto& pair : file_info_) {
data.emplace_back(pair.first, pair.second.get());
}
return data;
}
std::vector<std::string> Request::GetFormField(const std::string& name) const {
std::vector<std::string> data;
auto pair = get_data_.equal_range(name);
while (pair.first != pair.second) {
data.push_back(pair.first->second);
++pair.first;
}
pair = post_data_.equal_range(name);
while (pair.first != pair.second) {
data.push_back(pair.first->second);
++pair.first;
}
return data;
}
std::vector<std::string> Request::GetFormFieldPost(
const std::string& name) const {
std::vector<std::string> data;
auto pair = post_data_.equal_range(name);
while (pair.first != pair.second) {
data.push_back(pair.first->second);
++pair.first;
}
return data;
}
std::vector<std::string> Request::GetFormFieldGet(
const std::string& name) const {
std::vector<std::string> data;
auto pair = get_data_.equal_range(name);
while (pair.first != pair.second) {
data.push_back(pair.first->second);
++pair.first;
}
return data;
}
std::vector<const FileInfo*> Request::GetFileInfo(
const std::string& name) const {
std::vector<const FileInfo*> data;
auto pair = file_info_.equal_range(name);
while (pair.first != pair.second) {
data.push_back(pair.first->second.get());
++pair.first;
}
return data;
}
std::vector<PairOfStrings> Request::GetHeaders() const {
return std::vector<PairOfStrings>{headers_.begin(), headers_.end()};
}
std::vector<std::string> Request::GetHeader(const std::string& name) const {
std::vector<std::string> data;
auto range =
headers_.equal_range(brillo::http::GetCanonicalHeaderName(name));
while (range.first != range.second) {
data.push_back(range.first->second);
++range.first;
}
return data;
}
std::string Request::GetFirstHeader(const std::string& name) const {
auto p = headers_.find(brillo::http::GetCanonicalHeaderName(name));
return (p != headers_.end()) ? p->second : std::string{};
}
} // namespace libwebserv