Commit c4b487be authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

asio: Add client::request::write_trailer()

parent c976a0fc
...@@ -38,6 +38,10 @@ request::request() : impl_(make_unique<request_impl>()) {} ...@@ -38,6 +38,10 @@ request::request() : impl_(make_unique<request_impl>()) {}
request::~request() {} request::~request() {}
void request::write_trailer(header_map h) const {
impl_->write_trailer(std::move(h));
}
void request::cancel(uint32_t error_code) const { impl_->cancel(error_code); } void request::cancel(uint32_t error_code) const { impl_->cancel(error_code); }
void request::on_response(response_cb cb) const { void request::on_response(response_cb cb) const {
......
...@@ -34,6 +34,11 @@ namespace client { ...@@ -34,6 +34,11 @@ namespace client {
request_impl::request_impl() : strm_(nullptr) {} request_impl::request_impl() : strm_(nullptr) {}
void request_impl::write_trailer(header_map h) {
auto sess = strm_->session();
sess->write_trailer(*strm_, std::move(h));
}
void request_impl::cancel(uint32_t error_code) { void request_impl::cancel(uint32_t error_code) {
auto sess = strm_->session(); auto sess = strm_->session();
sess->cancel(*strm_, error_code); sess->cancel(*strm_, error_code);
......
...@@ -43,6 +43,8 @@ public: ...@@ -43,6 +43,8 @@ public:
request_impl(const request_impl &) = delete; request_impl(const request_impl &) = delete;
request_impl &operator=(const request_impl &) = delete; request_impl &operator=(const request_impl &) = delete;
void write_trailer(header_map h);
void cancel(uint32_t error_code); void cancel(uint32_t error_code);
void on_response(response_cb cb); void on_response(response_cb cb);
......
...@@ -330,6 +330,27 @@ bool session_impl::setup_session() { ...@@ -330,6 +330,27 @@ bool session_impl::setup_session() {
return true; return true;
} }
int session_impl::write_trailer(stream &strm, header_map h) {
int rv;
auto nva = std::vector<nghttp2_nv>();
nva.reserve(h.size());
for (auto &hd : h) {
nva.push_back(nghttp2::http2::make_nv(hd.first, hd.second.value,
hd.second.sensitive));
}
rv = nghttp2_submit_trailer(session_, strm.stream_id(), nva.data(),
nva.size());
if (rv != 0) {
return -1;
}
signal_write();
return 0;
}
void session_impl::cancel(stream &strm, uint32_t error_code) { void session_impl::cancel(stream &strm, uint32_t error_code) {
nghttp2_submit_rst_stream(session_, NGHTTP2_FLAG_NONE, strm.stream_id(), nghttp2_submit_rst_stream(session_, NGHTTP2_FLAG_NONE, strm.stream_id(),
error_code); error_code);
......
...@@ -55,6 +55,8 @@ public: ...@@ -55,6 +55,8 @@ public:
const connect_cb &on_connect() const; const connect_cb &on_connect() const;
const error_cb &on_error() const; const error_cb &on_error() const;
int write_trailer(stream &strm, header_map h);
void cancel(stream &strm, uint32_t error_code); void cancel(stream &strm, uint32_t error_code);
void resume(stream &strm); void resume(stream &strm);
......
...@@ -89,6 +89,12 @@ public: ...@@ -89,6 +89,12 @@ public:
// must not access request and response object. // must not access request and response object.
void on_close(close_cb cb) const; void on_close(close_cb cb) const;
// Write trailer part. This must be called after setting both
// NGHTTP2_DATA_FLAG_EOF and NGHTTP2_DATA_FLAG_NO_END_STREAM set in
// *data_flag parameter in generator_cb passed to session::submit()
// function.
void write_trailer(header_map h) const;
// Cancels this request and response with given error code. // Cancels this request and response with given error code.
void cancel(uint32_t error_code = NGHTTP2_INTERNAL_ERROR) const; void cancel(uint32_t error_code = NGHTTP2_INTERNAL_ERROR) const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment