Allow multiple calls Request::GetData
Change-Id: I8c497ab81cc02fbb8913790be5d97ec82f143f6f
Reviewed-on: https://weave-review.googlesource.com/1290
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/event_http_server.cc b/libweave/examples/ubuntu/event_http_server.cc
index 14a5723..865a05a 100644
--- a/libweave/examples/ubuntu/event_http_server.cc
+++ b/libweave/examples/ubuntu/event_http_server.cc
@@ -30,31 +30,6 @@
base, -1, SSL_new(ctx), BUFFEREVENT_SSL_ACCEPTING, BEV_OPT_CLOSE_ON_FREE);
}
-class MemoryReadStream : public InputStream {
- public:
- MemoryReadStream(const std::vector<uint8_t>& data,
- provider::TaskRunner* task_runner)
- : data_{data}, task_runner_{task_runner} {}
-
- void Read(void* buffer,
- size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
- CHECK_LE(read_position_, data_.size());
- size_t size_read = std::min(size_to_read, data_.size() - read_position_);
- if (size_read > 0)
- memcpy(buffer, data_.data() + read_position_, size_read);
- read_position_ += size_read;
- task_runner_->PostDelayedTask(FROM_HERE,
- base::Bind(success_callback, size_read), {});
- }
-
- private:
- std::vector<uint8_t> data_;
- provider::TaskRunner* task_runner_{nullptr};
- size_t read_position_{0};
-};
-
} // namespace
class HttpServerImpl::RequestImpl : public Request {
@@ -63,6 +38,9 @@
: task_runner_{task_runner} {
req_.reset(req);
uri_ = evhttp_request_get_evhttp_uri(req_.get());
+
+ data_.resize(evbuffer_get_length(req_->input_buffer));
+ evbuffer_remove(req_->input_buffer, &data_[0], data_.size());
}
~RequestImpl() {}
@@ -77,12 +55,7 @@
return {};
return header;
}
- std::string GetData() {
- std::string data;
- data.resize(evbuffer_get_length(req_->input_buffer));
- evbuffer_remove(req_->input_buffer, &data[0], data.size());
- return data;
- }
+ std::string GetData() { return data_; }
void SendReply(int status_code,
const std::string& data,
@@ -98,7 +71,7 @@
std::unique_ptr<evhttp_request, decltype(&evhttp_cancel_request)> req_{
nullptr, &evhttp_cancel_request};
provider::TaskRunner* task_runner_{nullptr};
- std::unique_ptr<InputStream> data_;
+ std::string data_;
const evhttp_uri* uri_{nullptr};
};