Only allow one stdin record, avoid the copy

This commit is contained in:
flamingcow
2019-05-09 19:30:36 -07:00
parent 67f0fc48f9
commit 05382c76a5
3 changed files with 14 additions and 7 deletions

View File

@@ -124,8 +124,10 @@ int Connection::Read() {
callback_(&request_);
buf_.Consume(); // discard data and invalidate pointers
} else {
std::string_view in(buf_.Read(header->ContentLength()), header->ContentLength());
request_.AddIn(in);
if (!request_.GetBody().empty()) {
LOG(ERROR) << "received multiple stdin records. have you set \"fastcgi_request_buffering on\"?";
}
request_.SetBody({buf_.Read(header->ContentLength()), header->ContentLength()});
}
}
break;

View File

@@ -23,7 +23,7 @@ Request::Request(Connection* conn)
void Request::NewRequest(uint16_t request_id) {
request_id_ = request_id;
params_.clear();
in_.clear();
body_ = {};
out_buf_.Reset();
body_written_ = false;
}
@@ -36,8 +36,8 @@ void Request::AddParam(const std::string_view& key, const std::string_view& valu
params_.try_emplace(std::string(key), std::string(value));
}
void Request::AddIn(const std::string_view& in) {
in_.append(in);
void Request::SetBody(const std::string_view& body) {
body_ = body;
}
const std::string& Request::GetParam(const std::string& key) {
@@ -49,6 +49,10 @@ const std::string& Request::GetParam(const std::string& key) {
return iter->second;
}
const std::string_view& Request::GetBody() {
return body_;
}
void Request::WriteHeader(const std::string_view& name, const std::string_view& value) {
CHECK(!body_written_);
CHECK(out_buf_.Write(name));

View File

@@ -19,9 +19,10 @@ class Request {
uint16_t RequestId();
void AddParam(const std::string_view& key, const std::string_view& value);
void AddIn(const std::string_view& in);
void SetBody(const std::string_view& in);
const std::string& GetParam(const std::string& key);
const std::string_view& GetBody();
void WriteHeader(const std::string_view& name, const std::string_view& value);
void WriteBody(const std::string_view& body);
@@ -36,7 +37,7 @@ class Request {
uint16_t request_id_ = 0;
std::unordered_map<std::string, std::string> params_;
std::string in_;
std::string_view body_;
firebuf::Buffer out_buf_;
bool body_written_;