Merge branch 'bcard-bcard/address-nghttp2-server'
This commit is contained in:
commit
30acb41561
|
@ -31,6 +31,7 @@
|
|||
#include <fcntl.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <set>
|
||||
|
@ -1412,6 +1413,7 @@ int start_listen(struct ev_loop *loop, Sessions *sessions,
|
|||
addrinfo hints;
|
||||
int r;
|
||||
bool ok = false;
|
||||
const char *addr = nullptr;
|
||||
|
||||
auto acceptor = std::make_shared<AcceptHandler>(sessions, config);
|
||||
auto service = util::utos(config->port);
|
||||
|
@ -1424,12 +1426,17 @@ int start_listen(struct ev_loop *loop, Sessions *sessions,
|
|||
hints.ai_flags |= AI_ADDRCONFIG;
|
||||
#endif // AI_ADDRCONFIG
|
||||
|
||||
if (!config->address.empty()) {
|
||||
addr = config->address.c_str();
|
||||
}
|
||||
|
||||
addrinfo *res, *rp;
|
||||
r = getaddrinfo(nullptr, service.c_str(), &hints, &res);
|
||||
r = getaddrinfo(addr, service.c_str(), &hints, &res);
|
||||
if (r != 0) {
|
||||
std::cerr << "getaddrinfo() failed: " << gai_strerror(r) << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (rp = res; rp; rp = rp->ai_next) {
|
||||
int fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
||||
if (fd == -1) {
|
||||
|
@ -1455,8 +1462,9 @@ int start_listen(struct ev_loop *loop, Sessions *sessions,
|
|||
new ListenEventHandler(sessions, fd, acceptor);
|
||||
|
||||
if (config->verbose) {
|
||||
std::cout << (rp->ai_family == AF_INET ? "IPv4" : "IPv6")
|
||||
<< ": listen on port " << config->port << std::endl;
|
||||
std::string s = util::numeric_name(rp->ai_addr, rp->ai_addrlen);
|
||||
std::cout << (rp->ai_family == AF_INET ? "IPv4" : "IPv6") << ": listen "
|
||||
<< s << ":" << config->port << std::endl;
|
||||
}
|
||||
ok = true;
|
||||
continue;
|
||||
|
|
|
@ -55,6 +55,7 @@ struct Config {
|
|||
std::string private_key_file;
|
||||
std::string cert_file;
|
||||
std::string dh_param_file;
|
||||
std::string address;
|
||||
ev_tstamp stream_read_timeout;
|
||||
ev_tstamp stream_write_timeout;
|
||||
nghttp2_option *session_option;
|
||||
|
|
|
@ -109,20 +109,6 @@ std::string strip_fragment(const char *raw_uri) {
|
|||
}
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
// Returns numeric address string of |addr|. If getnameinfo() is
|
||||
// failed, "unknown" is returned.
|
||||
std::string numeric_name(addrinfo *addr) {
|
||||
std::array<char, NI_MAXHOST> host;
|
||||
auto rv = getnameinfo(addr->ai_addr, addr->ai_addrlen, host.data(),
|
||||
host.size(), nullptr, 0, NI_NUMERICHOST);
|
||||
if (rv != 0) {
|
||||
return "unknown";
|
||||
}
|
||||
return host.data();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
Request::Request(const std::string &uri, const http_parser_url &u,
|
||||
const nghttp2_data_provider *data_prd, int64_t data_length,
|
||||
const nghttp2_priority_spec &pri_spec,
|
||||
|
@ -686,13 +672,15 @@ int HttpClient::noop() { return 0; }
|
|||
void HttpClient::on_connect_fail() {
|
||||
if (state == ClientState::IDLE) {
|
||||
std::cerr << "[ERROR] Could not connect to the address "
|
||||
<< numeric_name(cur_addr) << std::endl;
|
||||
<< util::numeric_name(cur_addr->ai_addr, cur_addr->ai_addrlen)
|
||||
<< std::endl;
|
||||
}
|
||||
auto cur_state = state;
|
||||
disconnect();
|
||||
if (cur_state == ClientState::IDLE) {
|
||||
if (initiate_connection() == 0) {
|
||||
std::cerr << "Trying next address " << numeric_name(cur_addr)
|
||||
std::cerr << "Trying next address "
|
||||
<< util::numeric_name(cur_addr->ai_addr, cur_addr->ai_addrlen)
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -97,6 +97,9 @@ void print_help(std::ostream &out) {
|
|||
<CERT> Set path to server's certificate. Required unless
|
||||
--no-tls is specified.
|
||||
Options:
|
||||
-a --address
|
||||
The address to bind to. If not specified the default IP
|
||||
address determined by getaddrinfo is used.
|
||||
-D, --daemon
|
||||
Run in a background. If -D is used, the current working
|
||||
directory is changed to '/'. Therefore if this option
|
||||
|
@ -151,6 +154,7 @@ int main(int argc, char **argv) {
|
|||
while (1) {
|
||||
static int flag = 0;
|
||||
static option long_options[] = {
|
||||
{"address", required_argument, nullptr, 'a'},
|
||||
{"daemon", no_argument, nullptr, 'D'},
|
||||
{"htdocs", required_argument, nullptr, 'd'},
|
||||
{"help", no_argument, nullptr, 'h'},
|
||||
|
@ -168,13 +172,16 @@ int main(int argc, char **argv) {
|
|||
{"early-response", no_argument, &flag, 5},
|
||||
{nullptr, 0, nullptr, 0}};
|
||||
int option_index = 0;
|
||||
int c =
|
||||
getopt_long(argc, argv, "DVb:c:d:ehn:p:v", long_options, &option_index);
|
||||
int c = getopt_long(argc, argv, "DVb:c:d:ehn:p:va:", long_options,
|
||||
&option_index);
|
||||
char *end;
|
||||
if (c == -1) {
|
||||
break;
|
||||
}
|
||||
switch (c) {
|
||||
case 'a':
|
||||
config.address = optarg;
|
||||
break;
|
||||
case 'D':
|
||||
config.daemon = true;
|
||||
break;
|
||||
|
|
10
src/util.cc
10
src/util.cc
|
@ -658,6 +658,16 @@ bool numeric_host(const char *hostname) {
|
|||
return true;
|
||||
}
|
||||
|
||||
std::string numeric_name(const struct sockaddr *sa, socklen_t salen) {
|
||||
std::array<char, NI_MAXHOST> host;
|
||||
auto rv = getnameinfo(sa, salen, host.data(), host.size(), nullptr, 0,
|
||||
NI_NUMERICHOST);
|
||||
if (rv != 0) {
|
||||
return "unknown";
|
||||
}
|
||||
return host.data();
|
||||
}
|
||||
|
||||
int reopen_log_file(const char *path) {
|
||||
#if defined(__ANDROID__) || defined(ANDROID)
|
||||
int fd;
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
@ -470,6 +471,10 @@ void write_uri_field(std::ostream &o, const char *uri, const http_parser_url &u,
|
|||
|
||||
bool numeric_host(const char *hostname);
|
||||
|
||||
// Returns numeric address string of |addr|. If getnameinfo() is
|
||||
// failed, "unknown" is returned.
|
||||
std::string numeric_name(const struct sockaddr *sa, socklen_t salen);
|
||||
|
||||
// Opens |path| with O_APPEND enabled. If file does not exist, it is
|
||||
// created first. This function returns file descriptor referring the
|
||||
// opened file if it succeeds, or -1.
|
||||
|
|
Loading…
Reference in New Issue