Rework the body of request and response

This commit is contained in:
Chunting Gu
2019-07-03 17:37:44 +08:00
parent b9f2ba6a41
commit 98aeeae012
39 changed files with 1122 additions and 677 deletions
+20 -29
View File
@@ -11,33 +11,41 @@
namespace webcc {
RequestPtr RequestBuilder::operator()() {
assert(parameters_.size() % 2 == 0);
assert(headers_.size() % 2 == 0);
auto request = std::make_shared<Request>(method_, url_);
auto request = std::make_shared<Request>(method_);
for (std::size_t i = 1; i < parameters_.size(); i += 2) {
request->AddQuery(parameters_[i - 1], parameters_[i]);
}
request->set_url(std::move(url_));
for (std::size_t i = 1; i < headers_.size(); i += 2) {
request->SetHeader(std::move(headers_[i - 1]), std::move(headers_[i]));
}
// No keep-alive?
// If no Keep-Alive, explicitly set `Connection` to "Close".
if (!keep_alive_) {
request->SetHeader(headers::kConnection, "Close");
}
if (!data_.empty()) {
SetContent(request, std::move(data_));
if (body_) {
request->SetContentType(media_type_, charset_);
// TODO: Request-level charset.
if (json_) {
request->SetContentType(media_types::kApplicationJson, "");
#if WEBCC_ENABLE_GZIP
if (gzip_ && body_->Compress()) {
request->SetHeader(headers::kContentEncoding, "gzip");
}
#endif
} else if (!form_parts_.empty()) {
request->set_form_parts(std::move(form_parts_));
// Another choice to generate the boundary is like what Apache does.
// See: https://stackoverflow.com/a/5686863
auto boundary = utility::RandomUuid();
request->SetContentType("multipart/form-data; boundary=" + boundary);
body_ = std::make_shared<FormBody>(form_parts_, boundary);
}
if (body_) {
request->SetBody(body_, true);
}
return request;
@@ -84,21 +92,4 @@ RequestBuilder& RequestBuilder::Date() {
return *this;
}
void RequestBuilder::SetContent(RequestPtr request, std::string&& data) {
#if WEBCC_ENABLE_GZIP
if (gzip_ && data.size() > kGzipThreshold) {
std::string compressed;
if (gzip::Compress(data, &compressed)) {
request->SetContent(std::move(compressed), true);
request->SetHeader(headers::kContentEncoding, "gzip");
return;
}
LOG_WARN("Cannot compress the content data!");
}
#endif // WEBCC_ENABLE_GZIP
request->SetContent(std::move(data), true);
}
} // namespace webcc