libnghttp2_asio: Added access to a requests remote endpoint

This commit is contained in:
Andreas Pohl 2015-12-16 18:38:21 +01:00
parent 15d9f222ed
commit a30dad4f5e
7 changed files with 35 additions and 4 deletions

View File

@ -70,7 +70,8 @@ public:
/// Start the first asynchronous operation for the connection.
void start() {
handler_ = std::make_shared<http2_handler>(socket_.get_io_service(),
handler_ = std::make_shared<http2_handler>(
socket_.get_io_service(), socket_.lowest_layer().remote_endpoint(),
[this]() { do_write(); }, mux_);
if (handler_->start() != 0) {
return;

View File

@ -136,6 +136,9 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame,
break;
}
auto& req = strm->request().impl();
req.remote_endpoint(handler->remote_endpoint());
handler->call_on_request(*strm);
if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
@ -225,8 +228,9 @@ int on_frame_not_send_callback(nghttp2_session *session,
} // namespace
http2_handler::http2_handler(boost::asio::io_service &io_service,
boost::asio::ip::tcp::endpoint ep,
connection_write writefun, serve_mux &mux)
: writefun_(writefun), mux_(mux), io_service_(io_service),
: writefun_(writefun), mux_(mux), io_service_(io_service), remote_ep_(ep),
session_(nullptr), buf_(nullptr), buflen_(0), inside_callback_(false),
tstamp_cached_(time(nullptr)),
formatted_date_(util::http_date(tstamp_cached_)) {}
@ -449,6 +453,8 @@ response *http2_handler::push_promise(boost::system::error_code &ec,
boost::asio::io_service &http2_handler::io_service() { return io_service_; }
boost::asio::ip::tcp::endpoint http2_handler::remote_endpoint() { return remote_ep_; }
callback_guard::callback_guard(http2_handler &h) : handler(h) {
handler.enter_callback();
}

View File

@ -53,7 +53,8 @@ using connection_write = std::function<void(void)>;
class http2_handler : public std::enable_shared_from_this<http2_handler> {
public:
http2_handler(boost::asio::io_service &io_service, connection_write writefun,
http2_handler(boost::asio::io_service &io_service,
boost::asio::ip::tcp::endpoint ep, connection_write writefun,
serve_mux &mux);
~http2_handler();
@ -89,6 +90,8 @@ public:
boost::asio::io_service &io_service();
boost::asio::ip::tcp::endpoint remote_endpoint();
const std::string &http_date();
template <size_t N>
@ -152,6 +155,7 @@ private:
connection_write writefun_;
serve_mux &mux_;
boost::asio::io_service &io_service_;
boost::asio::ip::tcp::endpoint remote_ep_;
nghttp2_session *session_;
const uint8_t *buf_;
std::size_t buflen_;

View File

@ -50,6 +50,10 @@ void request::on_data(data_cb cb) const {
request_impl &request::impl() const { return *impl_; }
boost::asio::ip::tcp::endpoint request::remote_endpoint() const {
return impl_->remote_endpoint();
}
} // namespace server
} // namespace asio_http2
} // namespace nghttp2

View File

@ -54,6 +54,14 @@ void request_impl::call_on_data(const uint8_t *data, std::size_t len) {
}
}
boost::asio::ip::tcp::endpoint request_impl::remote_endpoint() const {
return remote_ep_;
}
void request_impl::remote_endpoint(boost::asio::ip::tcp::endpoint ep) {
remote_ep_ = ep;
}
} // namespace server
} // namespace asio_http2
} // namespace nghttp2

View File

@ -28,6 +28,7 @@
#include "nghttp2_config.h"
#include <nghttp2/asio_http2_server.h>
#include <boost/asio/ip/tcp.hpp>
namespace nghttp2 {
namespace asio_http2 {
@ -54,12 +55,16 @@ public:
void stream(class stream *s);
void call_on_data(const uint8_t *data, std::size_t len);
boost::asio::ip::tcp::endpoint remote_endpoint() const;
void remote_endpoint(boost::asio::ip::tcp::endpoint ep);
private:
class stream *strm_;
header_map header_;
std::string method_;
uri_ref uri_;
data_cb on_data_cb_;
boost::asio::ip::tcp::endpoint remote_ep_;
};
} // namespace server

View File

@ -59,6 +59,9 @@ public:
// Application must not call this directly.
request_impl &impl() const;
// Returns the remote endpoint of the request
boost::asio::ip::tcp::endpoint remote_endpoint() const;
private:
std::unique_ptr<request_impl> impl_;
};