152 lines
4.6 KiB
C++
152 lines
4.6 KiB
C++
// 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
|