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_); callback_(&request_);
buf_.Consume(); // discard data and invalidate pointers buf_.Consume(); // discard data and invalidate pointers
} else { } else {
std::string_view in(buf_.Read(header->ContentLength()), header->ContentLength()); if (!request_.GetBody().empty()) {
request_.AddIn(in); LOG(ERROR) << "received multiple stdin records. have you set \"fastcgi_request_buffering on\"?";
}
request_.SetBody({buf_.Read(header->ContentLength()), header->ContentLength()});
} }
} }
break; break;

View File

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

View File

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