Fix payload iteration issue of FormBody; Log form body; ignore body for response of HEAD.
This commit is contained in:
+35
-43
@@ -1,6 +1,7 @@
|
||||
#include "webcc/body.h"
|
||||
|
||||
#include "boost/algorithm/string.hpp"
|
||||
#include "boost/core/ignore_unused.hpp"
|
||||
|
||||
#include "webcc/logger.h"
|
||||
#include "webcc/utility.h"
|
||||
@@ -13,17 +14,6 @@ namespace webcc {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
namespace misc_strings {
|
||||
|
||||
// Literal strings can't be used because they have an extra '\0'.
|
||||
|
||||
const char CRLF[] = { '\r', '\n' };
|
||||
const char DOUBLE_DASHES[] = { '-', '-' };
|
||||
|
||||
} // misc_strings
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#if WEBCC_ENABLE_GZIP
|
||||
bool StringBody::Compress() {
|
||||
if (data_.size() <= kGzipThreshold) {
|
||||
@@ -45,7 +35,9 @@ void StringBody::InitPayload() {
|
||||
index_ = 0;
|
||||
}
|
||||
|
||||
Payload StringBody::NextPayload() {
|
||||
Payload StringBody::NextPayload(bool free_previous) {
|
||||
boost::ignore_unused(free_previous);
|
||||
|
||||
if (index_ == 0) {
|
||||
index_ = 1;
|
||||
return Payload{ boost::asio::buffer(data_) };
|
||||
@@ -57,27 +49,8 @@ Payload StringBody::NextPayload() {
|
||||
// - The data will be truncated if it's too large to display.
|
||||
// - Binary content will not be dumped (TODO).
|
||||
void StringBody::Dump(std::ostream& os, const std::string& prefix) const {
|
||||
if (data_.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Split by EOL to achieve more readability.
|
||||
std::vector<std::string> lines;
|
||||
boost::split(lines, data_, boost::is_any_of("\n"));
|
||||
|
||||
std::size_t size = 0;
|
||||
|
||||
for (const std::string& line : lines) {
|
||||
os << prefix;
|
||||
|
||||
if (line.size() + size > kMaxDumpSize) {
|
||||
os.write(line.c_str(), kMaxDumpSize - size);
|
||||
os << "..." << std::endl;
|
||||
break;
|
||||
} else {
|
||||
os << line << std::endl;
|
||||
size += line.size();
|
||||
}
|
||||
if (!data_.empty()) {
|
||||
utility::DumpByLine(data_, os, prefix);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,43 +75,62 @@ std::size_t FormBody::GetSize() const {
|
||||
}
|
||||
|
||||
void FormBody::Dump(std::ostream& os, const std::string& prefix) const {
|
||||
// TODO
|
||||
for (auto& part : parts_) {
|
||||
os << prefix << "--" << boundary_ << std::endl;
|
||||
part->Dump(os, prefix);
|
||||
}
|
||||
os << prefix << "--" << boundary_ << "--" << std::endl;
|
||||
}
|
||||
|
||||
void FormBody::InitPayload() {
|
||||
index_ = 0;
|
||||
}
|
||||
|
||||
// TODO: Clear previous payload memory.
|
||||
Payload FormBody::NextPayload() {
|
||||
Payload FormBody::NextPayload(bool free_previous) {
|
||||
Payload payload;
|
||||
|
||||
// Free previous payload.
|
||||
if (free_previous) {
|
||||
if (index_ > 0) {
|
||||
Free(index_ - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (index_ < parts_.size()) {
|
||||
auto& part = parts_[index_];
|
||||
AddBoundary(&payload);
|
||||
part->Prepare(&payload);
|
||||
parts_[index_]->Prepare(&payload);
|
||||
|
||||
if (index_ + 1 == parts_.size()) {
|
||||
AddBoundaryEnd(&payload);
|
||||
}
|
||||
}
|
||||
|
||||
++index_;
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
void FormBody::AddBoundary(Payload* payload) {
|
||||
using boost::asio::buffer;
|
||||
payload->push_back(buffer(misc_strings::DOUBLE_DASHES));
|
||||
|
||||
payload->push_back(buffer(literal_buffers::DOUBLE_DASHES));
|
||||
payload->push_back(buffer(boundary_));
|
||||
payload->push_back(buffer(misc_strings::CRLF));
|
||||
payload->push_back(buffer(literal_buffers::CRLF));
|
||||
}
|
||||
|
||||
void FormBody::AddBoundaryEnd(Payload* payload) {
|
||||
using boost::asio::buffer;
|
||||
payload->push_back(buffer(misc_strings::DOUBLE_DASHES));
|
||||
|
||||
payload->push_back(buffer(literal_buffers::DOUBLE_DASHES));
|
||||
payload->push_back(buffer(boundary_));
|
||||
payload->push_back(buffer(misc_strings::DOUBLE_DASHES));
|
||||
payload->push_back(buffer(misc_strings::CRLF));
|
||||
payload->push_back(buffer(literal_buffers::DOUBLE_DASHES));
|
||||
payload->push_back(buffer(literal_buffers::CRLF));
|
||||
}
|
||||
|
||||
void FormBody::Free(std::size_t index) {
|
||||
if (index < parts_.size()) {
|
||||
parts_[index]->Free();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webcc
|
||||
|
||||
Reference in New Issue
Block a user