| // 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 |