1// Copyright 2015 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15#include <libwebserv/request_impl.h> 16 17#include <base/callback.h> 18#include <brillo/http/http_utils.h> 19#include <brillo/streams/file_stream.h> 20 21#include <libwebserv/dbus_protocol_handler.h> 22 23namespace libwebserv { 24 25FileInfo::FileInfo(DBusProtocolHandler* handler, 26 int file_id, 27 const std::string& request_id, 28 const std::string& file_name, 29 const std::string& content_type, 30 const std::string& transfer_encoding) 31 : handler_{handler}, 32 file_id_{file_id}, 33 request_id_{request_id}, 34 file_name_(file_name), 35 content_type_(content_type), 36 transfer_encoding_(transfer_encoding) { 37} 38 39void FileInfo::GetData( 40 const base::Callback<void(brillo::StreamPtr)>& success_callback, 41 const base::Callback<void(brillo::Error*)>& error_callback) const { 42 handler_->GetFileData(request_id_, 43 file_id_, 44 success_callback, 45 error_callback); 46} 47 48RequestImpl::RequestImpl(DBusProtocolHandler* handler, 49 const std::string& url, 50 const std::string& method) 51 : Request{url, method}, handler_{handler} { 52} 53 54brillo::StreamPtr RequestImpl::GetDataStream() { 55 return brillo::FileStream::FromFileDescriptor( 56 raw_data_fd_.GetPlatformFile(), false, nullptr); 57} 58 59std::vector<PairOfStrings> Request::GetFormData() const { 60 auto data = GetFormDataGet(); 61 auto post_data = GetFormDataPost(); 62 data.insert(data.end(), post_data.begin(), post_data.end()); 63 return data; 64} 65 66std::vector<PairOfStrings> Request::GetFormDataGet() const { 67 return std::vector<PairOfStrings>{get_data_.begin(), get_data_.end()}; 68} 69 70std::vector<PairOfStrings> Request::GetFormDataPost() const { 71 return std::vector<PairOfStrings>{post_data_.begin(), post_data_.end()}; 72} 73 74std::vector<std::pair<std::string, const FileInfo*>> Request::GetFiles() const { 75 std::vector<std::pair<std::string, const FileInfo*>> data; 76 data.reserve(file_info_.size()); 77 for (const auto& pair : file_info_) { 78 data.emplace_back(pair.first, pair.second.get()); 79 } 80 return data; 81} 82 83std::vector<std::string> Request::GetFormField(const std::string& name) const { 84 std::vector<std::string> data; 85 auto pair = get_data_.equal_range(name); 86 while (pair.first != pair.second) { 87 data.push_back(pair.first->second); 88 ++pair.first; 89 } 90 pair = post_data_.equal_range(name); 91 while (pair.first != pair.second) { 92 data.push_back(pair.first->second); 93 ++pair.first; 94 } 95 return data; 96} 97 98std::vector<std::string> Request::GetFormFieldPost( 99 const std::string& name) const { 100 std::vector<std::string> data; 101 auto pair = post_data_.equal_range(name); 102 while (pair.first != pair.second) { 103 data.push_back(pair.first->second); 104 ++pair.first; 105 } 106 return data; 107} 108 109std::vector<std::string> Request::GetFormFieldGet( 110 const std::string& name) const { 111 std::vector<std::string> data; 112 auto pair = get_data_.equal_range(name); 113 while (pair.first != pair.second) { 114 data.push_back(pair.first->second); 115 ++pair.first; 116 } 117 return data; 118} 119 120std::vector<const FileInfo*> Request::GetFileInfo( 121 const std::string& name) const { 122 std::vector<const FileInfo*> data; 123 auto pair = file_info_.equal_range(name); 124 while (pair.first != pair.second) { 125 data.push_back(pair.first->second.get()); 126 ++pair.first; 127 } 128 return data; 129} 130 131std::vector<PairOfStrings> Request::GetHeaders() const { 132 return std::vector<PairOfStrings>{headers_.begin(), headers_.end()}; 133} 134 135std::vector<std::string> Request::GetHeader(const std::string& name) const { 136 std::vector<std::string> data; 137 auto range = 138 headers_.equal_range(brillo::http::GetCanonicalHeaderName(name)); 139 while (range.first != range.second) { 140 data.push_back(range.first->second); 141 ++range.first; 142 } 143 return data; 144} 145 146std::string Request::GetFirstHeader(const std::string& name) const { 147 auto p = headers_.find(brillo::http::GetCanonicalHeaderName(name)); 148 return (p != headers_.end()) ? p->second : std::string{}; 149} 150 151 152} // namespace libwebserv 153