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}; };