Only allow one stdin record, avoid the copy
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
10
request.cc
10
request.cc
@@ -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));
|
||||||
|
|||||||
@@ -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_;
|
||||||
|
|||||||
Reference in New Issue
Block a user