asio: Add host_service_from_uri() to extract remote address from URI
This commit is contained in:
parent
2cadd38b6b
commit
5dccc88a7c
|
@ -34,19 +34,33 @@ using namespace nghttp2::asio_http2::client;
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
try {
|
try {
|
||||||
|
if (argc < 2) {
|
||||||
|
std::cerr << "Usage: asio-cl URI" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec;
|
||||||
boost::asio::io_service io_service;
|
boost::asio::io_service io_service;
|
||||||
|
|
||||||
|
std::string uri = argv[1];
|
||||||
|
std::string scheme, host, service;
|
||||||
|
|
||||||
|
if (host_service_from_uri(ec, scheme, host, service, uri)) {
|
||||||
|
std::cerr << "error: bad URI: " << ec.message() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
boost::asio::ssl::context tls_ctx(boost::asio::ssl::context::sslv23);
|
boost::asio::ssl::context tls_ctx(boost::asio::ssl::context::sslv23);
|
||||||
tls_ctx.set_default_verify_paths();
|
tls_ctx.set_default_verify_paths();
|
||||||
// disabled to make development easier...
|
// disabled to make development easier...
|
||||||
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
|
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
|
||||||
configure_tls_context(ec, tls_ctx);
|
configure_tls_context(ec, tls_ctx);
|
||||||
|
|
||||||
session sess(io_service, tls_ctx, "localhost", "3000");
|
auto sess = scheme == "https" ? session(io_service, tls_ctx, host, service)
|
||||||
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
: session(io_service, host, service);
|
||||||
|
|
||||||
|
sess.on_connect([&sess, &uri](tcp::resolver::iterator endpoint_it) {
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec;
|
||||||
auto req = sess.submit(ec, "GET", "https://localhost:3000/");
|
auto req = sess.submit(ec, "GET", uri);
|
||||||
|
|
||||||
if (ec) {
|
if (ec) {
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
std::cerr << "error: " << ec.message() << std::endl;
|
||||||
|
|
|
@ -49,6 +49,17 @@ session::session(boost::asio::io_service &io_service,
|
||||||
|
|
||||||
session::~session() {}
|
session::~session() {}
|
||||||
|
|
||||||
|
session::session(session &&other) : impl_(std::move(other.impl_)) {}
|
||||||
|
|
||||||
|
session &session::operator=(session &&other) {
|
||||||
|
if (this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_ = std::move(other.impl_);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
void session::on_connect(connect_cb cb) const {
|
void session::on_connect(connect_cb cb) const {
|
||||||
impl_->on_connect(std::move(cb));
|
impl_->on_connect(std::move(cb));
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "template.h"
|
#include "template.h"
|
||||||
|
#include "http2.h"
|
||||||
|
|
||||||
namespace nghttp2 {
|
namespace nghttp2 {
|
||||||
namespace asio_http2 {
|
namespace asio_http2 {
|
||||||
|
@ -112,5 +113,36 @@ std::string percent_decode(const std::string &s) {
|
||||||
|
|
||||||
std::string http_date(int64_t t) { return util::http_date(t); }
|
std::string http_date(int64_t t) { return util::http_date(t); }
|
||||||
|
|
||||||
|
boost::system::error_code host_service_from_uri(boost::system::error_code &ec,
|
||||||
|
std::string &scheme,
|
||||||
|
std::string &host,
|
||||||
|
std::string &service,
|
||||||
|
const std::string &uri) {
|
||||||
|
ec.clear();
|
||||||
|
|
||||||
|
http_parser_url u{};
|
||||||
|
if (http_parser_parse_url(uri.c_str(), uri.size(), 0, &u) != 0) {
|
||||||
|
ec = make_error_code(boost::system::errc::invalid_argument);
|
||||||
|
return ec;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((u.field_set & (1 << UF_SCHEMA)) == 0 ||
|
||||||
|
(u.field_set & (1 << UF_HOST)) == 0) {
|
||||||
|
ec = make_error_code(boost::system::errc::invalid_argument);
|
||||||
|
return ec;
|
||||||
|
}
|
||||||
|
|
||||||
|
http2::copy_url_component(scheme, &u, UF_SCHEMA, uri.c_str());
|
||||||
|
http2::copy_url_component(host, &u, UF_HOST, uri.c_str());
|
||||||
|
|
||||||
|
if (u.field_set & (1 << UF_PORT)) {
|
||||||
|
http2::copy_url_component(service, &u, UF_PORT, uri.c_str());
|
||||||
|
} else {
|
||||||
|
service = scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ec;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace asio_http2
|
} // namespace asio_http2
|
||||||
} // namespace nghttp2
|
} // namespace nghttp2
|
||||||
|
|
|
@ -123,6 +123,15 @@ std::string percent_decode(const std::string &s);
|
||||||
// Returns HTTP date representation of current posix time |t|.
|
// Returns HTTP date representation of current posix time |t|.
|
||||||
std::string http_date(int64_t t);
|
std::string http_date(int64_t t);
|
||||||
|
|
||||||
|
// Parses |uri| and extract scheme, host and service. The service is
|
||||||
|
// port component of URI (e.g., "8443") if available, otherwise it is
|
||||||
|
// scheme (e.g., "https").
|
||||||
|
boost::system::error_code host_service_from_uri(boost::system::error_code &ec,
|
||||||
|
std::string &scheme,
|
||||||
|
std::string &host,
|
||||||
|
std::string &service,
|
||||||
|
const std::string &uri);
|
||||||
|
|
||||||
} // namespace asio_http2
|
} // namespace asio_http2
|
||||||
|
|
||||||
} // namespace nghttp2
|
} // namespace nghttp2
|
||||||
|
|
|
@ -128,6 +128,9 @@ public:
|
||||||
const std::string &service);
|
const std::string &service);
|
||||||
~session();
|
~session();
|
||||||
|
|
||||||
|
session(session &&other);
|
||||||
|
session &operator=(session &&other);
|
||||||
|
|
||||||
// Sets callback which is invoked after connection is established.
|
// Sets callback which is invoked after connection is established.
|
||||||
void on_connect(connect_cb cb) const;
|
void on_connect(connect_cb cb) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue