webserver: Move web server functionality into webservd
Moved libmicrohttpd from libwebserv to webservd daemon. Added the
D-Bus interface between the web server daemon and client library.
Updated privetd to use the new interface.
BUG=brillo:10
TEST=`FEATURES=test emerge-link libwebserv privetd`
CQ-DEPEND=CL:245780,CL:245118,CL:*195757
Change-Id: I26bfab64c6a0fd9460a47fd3fa9205c89abb943a
Reviewed-on: https://chromium-review.googlesource.com/245980
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/libwebserv/request.cc b/libwebserv/request.cc
index 37ea1c1..b51aa94 100644
--- a/libwebserv/request.cc
+++ b/libwebserv/request.cc
@@ -4,86 +4,49 @@
#include <libwebserv/request.h>
-#include <libwebserv/connection.h>
+#include <base/callback.h>
+#include <chromeos/http/http_utils.h>
+
+#include <libwebserv/protocol_handler.h>
namespace libwebserv {
-FileInfo::FileInfo(const std::string& file_name,
+FileInfo::FileInfo(ProtocolHandler* handler,
+ int file_id,
+ const std::string& request_id,
+ const std::string& file_name,
const std::string& content_type,
const std::string& transfer_encoding)
- : file_name_(file_name),
+ : handler_{handler},
+ file_id_{file_id},
+ request_id_{request_id},
+ file_name_(file_name),
content_type_(content_type),
transfer_encoding_(transfer_encoding) {
}
-const std::vector<uint8_t>& FileInfo::GetData() const {
- return data_;
+void FileInfo::GetData(
+ const base::Callback<void(const std::vector<uint8_t>&)>& success_callback,
+ const base::Callback<void(chromeos::Error*)>& error_callback) {
+ handler_->GetFileData(request_id_,
+ file_id_,
+ success_callback,
+ error_callback);
}
-Request::Request(const std::string& url, const std::string& method)
- : url_{url}, method_{method} {
+Request::Request(ProtocolHandler* handler,
+ const std::string& url,
+ const std::string& method)
+ : handler_{handler}, url_{url}, method_{method} {
}
Request::~Request() {
}
-scoped_ptr<Request> Request::Create(const std::string& url,
- const std::string& method) {
- // Can't use make_shared here since Request::Request is private.
- return scoped_ptr<Request>(new Request(url, method));
-}
-
const std::vector<uint8_t>& Request::GetData() const {
return raw_data_;
}
-bool Request::AddRawRequestData(const void* data, size_t size) {
- const uint8_t* byte_data_ = static_cast<const uint8_t*>(data);
- raw_data_.insert(raw_data_.end(), byte_data_, byte_data_ + size);
- return true;
-}
-
-bool Request::AddPostFieldData(const char* key,
- const char* filename,
- const char* content_type,
- const char* transfer_encoding,
- const char* data,
- size_t size) {
- if (filename) {
- std::unique_ptr<FileInfo> file_info{
- new FileInfo{filename, content_type ? content_type : "",
- transfer_encoding ? transfer_encoding : ""}};
- file_info->data_.assign(data, data + size);
- file_info_.emplace(key, std::move(file_info));
- last_posted_data_was_file_ = true;
- return true;
- }
- std::string value{data, size};
- post_data_.emplace(key, value);
- last_posted_data_was_file_ = false;
- return true;
-}
-
-bool Request::AppendPostFieldData(const char* key,
- const char* data,
- size_t size) {
- if (last_posted_data_was_file_) {
- auto file_pair = file_info_.equal_range(key);
- if (file_pair.first == file_info_.end())
- return false;
- FileInfo* file_info = file_pair.second->second.get();
- file_info->data_.insert(file_info->data_.end(), data, data + size);
- return true;
- }
-
- auto pair = post_data_.equal_range(key);
- if (pair.first == post_data_.end())
- return false;
- --pair.second; // Get the last form field with this name/key.
- pair.second->second.append(data, size);
- return true;
-}
-
std::vector<PairOfStrings> Request::GetFormData() const {
auto data = GetFormDataGet();
auto post_data = GetFormDataPost();
@@ -162,30 +125,19 @@
std::vector<std::string> Request::GetHeader(const std::string& name) const {
std::vector<std::string> data;
- auto pair = headers_.equal_range(GetCanonicalHeaderName(name));
- while (pair.first != pair.second) {
- data.push_back(pair.first->second);
- ++pair.first;
+ auto range =
+ headers_.equal_range(chromeos::http::GetCanonicalHeaderName(name));
+ while (range.first != range.second) {
+ data.push_back(range.first->second);
+ ++range.first;
}
return data;
}
-std::string Request::GetCanonicalHeaderName(const std::string& name) {
- std::string canonical_name = name;
- bool word_begin = true;
- for (char& c : canonical_name) {
- if (c == '-') {
- word_begin = true;
- } else {
- if (word_begin) {
- c = toupper(c);
- } else {
- c = tolower(c);
- }
- word_begin = false;
- }
- }
- return canonical_name;
+std::string Request::GetFirstHeader(const std::string& name) const {
+ auto p = headers_.find(chromeos::http::GetCanonicalHeaderName(name));
+ return (p != headers_.end()) ? p->second : std::string{};
}
+
} // namespace libwebserv