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

View File

@ -136,6 +136,9 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame,
break; break;
} }
auto& req = strm->request().impl();
req.remote_endpoint(handler->remote_endpoint());
handler->call_on_request(*strm); handler->call_on_request(*strm);
if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
@ -225,8 +228,9 @@ int on_frame_not_send_callback(nghttp2_session *session,
} // namespace } // namespace
http2_handler::http2_handler(boost::asio::io_service &io_service, http2_handler::http2_handler(boost::asio::io_service &io_service,
boost::asio::ip::tcp::endpoint ep,
connection_write writefun, serve_mux &mux) 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), session_(nullptr), buf_(nullptr), buflen_(0), inside_callback_(false),
tstamp_cached_(time(nullptr)), tstamp_cached_(time(nullptr)),
formatted_date_(util::http_date(tstamp_cached_)) {} 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::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) { callback_guard::callback_guard(http2_handler &h) : handler(h) {
handler.enter_callback(); 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> { class http2_handler : public std::enable_shared_from_this<http2_handler> {
public: 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); serve_mux &mux);
~http2_handler(); ~http2_handler();
@ -89,6 +90,8 @@ public:
boost::asio::io_service &io_service(); boost::asio::io_service &io_service();
boost::asio::ip::tcp::endpoint remote_endpoint();
const std::string &http_date(); const std::string &http_date();
template <size_t N> template <size_t N>
@ -152,6 +155,7 @@ private:
connection_write writefun_; connection_write writefun_;
serve_mux &mux_; serve_mux &mux_;
boost::asio::io_service &io_service_; boost::asio::io_service &io_service_;
boost::asio::ip::tcp::endpoint remote_ep_;
nghttp2_session *session_; nghttp2_session *session_;
const uint8_t *buf_; const uint8_t *buf_;
std::size_t buflen_; 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_; } request_impl &request::impl() const { return *impl_; }
boost::asio::ip::tcp::endpoint request::remote_endpoint() const {
return impl_->remote_endpoint();
}
} // namespace server } // namespace server
} // namespace asio_http2 } // namespace asio_http2
} // namespace nghttp2 } // 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 server
} // namespace asio_http2 } // namespace asio_http2
} // namespace nghttp2 } // namespace nghttp2

View File

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

View File

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