summaryrefslogtreecommitdiffstats
path: root/src/nghttp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nghttp.cc')
-rw-r--r--src/nghttp.cc116
1 files changed, 62 insertions, 54 deletions
diff --git a/src/nghttp.cc b/src/nghttp.cc
index 6684374..8ca37bb 100644
--- a/src/nghttp.cc
+++ b/src/nghttp.cc
@@ -89,13 +89,13 @@ enum {
};
namespace {
-constexpr auto anchors = std::array<Anchor, 5>{{
+constexpr auto anchors = std::to_array<Anchor>({
{3, 0, 201},
{5, 0, 101},
{7, 0, 1},
{9, 7, 1},
{11, 3, 1},
-}};
+});
} // namespace
Config::Config()
@@ -201,9 +201,9 @@ StringRef Request::get_real_host() const {
uint16_t Request::get_real_port() const {
auto scheme = get_real_scheme();
return config.host_override.empty() ? util::has_uri_field(u, UF_PORT) ? u.port
- : scheme == "https" ? 443
+ : scheme == "https"_sr ? 443
: 80
- : config.port_override == 0 ? scheme == "https" ? 443 : 80
+ : config.port_override == 0 ? scheme == "https"_sr ? 443 : 80
: config.port_override;
}
@@ -215,7 +215,7 @@ void Request::init_html_parser() {
auto ipv6_lit =
std::find(std::begin(host), std::end(host), ':') != std::end(host);
- auto base_uri = scheme.str();
+ auto base_uri = std::string{scheme};
base_uri += "://";
if (ipv6_lit) {
base_uri += '[';
@@ -224,8 +224,8 @@ void Request::init_html_parser() {
if (ipv6_lit) {
base_uri += ']';
}
- if (!((scheme == "https" && port == 443) ||
- (scheme == "http" && port == 80))) {
+ if (!((scheme == "https"_sr && port == 443) ||
+ (scheme == "http"_sr && port == 80))) {
base_uri += ':';
base_uri += util::utos(port);
}
@@ -247,9 +247,9 @@ int Request::update_html_parser(const uint8_t *data, size_t len, int fin) {
}
std::string Request::make_reqpath() const {
- std::string path = util::has_uri_field(u, UF_PATH)
- ? util::get_uri_field(uri.c_str(), u, UF_PATH).str()
- : "/";
+ auto path = util::has_uri_field(u, UF_PATH)
+ ? std::string{util::get_uri_field(uri.c_str(), u, UF_PATH)}
+ : "/"s;
if (util::has_uri_field(u, UF_QUERY)) {
path += '?';
path.append(uri.c_str() + u.field_data[UF_QUERY].off,
@@ -266,15 +266,15 @@ std::string decode_host(const StringRef &host) {
if (zone_start == std::end(host) ||
!util::ipv6_numeric_addr(
std::string(std::begin(host), zone_start).c_str())) {
- return host.str();
+ return std::string{host};
}
// case: ::1%
if (zone_start + 1 == std::end(host)) {
- return StringRef{host.c_str(), host.size() - 1}.str();
+ return {host.data(), host.size() - 1};
}
// case: ::1%12 or ::1%1
if (zone_start + 3 >= std::end(host)) {
- return host.str();
+ return std::string{host};
}
// If we see "%25", followed by more characters, then decode %25 as
// '%'.
@@ -454,7 +454,7 @@ int submit_request(HttpClient *client, const Headers &headers, Request *req) {
auto scheme = util::get_uri_field(req->uri.c_str(), req->u, UF_SCHEMA);
auto build_headers = Headers{{":method", req->data_prd ? "POST" : "GET"},
{":path", req->make_reqpath()},
- {":scheme", scheme.str()},
+ {":scheme", std::string{scheme}},
{":authority", client->hostport},
{"accept", "*/*"},
{"accept-encoding", "gzip, deflate"},
@@ -500,7 +500,8 @@ int submit_request(HttpClient *client, const Headers &headers, Request *req) {
nva.reserve(build_headers.size());
for (auto &kv : build_headers) {
- nva.push_back(http2::make_nv(kv.name, kv.value, kv.no_index));
+ nva.push_back(
+ http2::make_field_nv(kv.name, kv.value, http2::no_index(kv.no_index)));
}
auto method = http2::get_header(build_headers, ":method");
@@ -515,7 +516,7 @@ int submit_request(HttpClient *client, const Headers &headers, Request *req) {
trailer_names += ", ";
trailer_names += config.trailer[i].name;
}
- nva.push_back(http2::make_nv_ls("trailer", trailer_names));
+ nva.push_back(http2::make_field_v("trailer"_sr, trailer_names));
}
int32_t stream_id;
@@ -975,9 +976,9 @@ int HttpClient::on_upgrade_connect() {
// If the request contains upload data, use OPTIONS * to upgrade
req = "OPTIONS *";
} else {
- auto meth = std::find_if(
- std::begin(config.headers), std::end(config.headers),
- [](const Header &kv) { return util::streq_l(":method", kv.name); });
+ auto meth =
+ std::find_if(std::begin(config.headers), std::end(config.headers),
+ [](const auto &kv) { return ":method"_sr == kv.name; });
if (meth == std::end(config.headers)) {
req = "GET ";
@@ -1424,8 +1425,7 @@ void HttpClient::update_hostport() {
if (reqvec.empty()) {
return;
}
- scheme = util::get_uri_field(reqvec[0]->uri.c_str(), reqvec[0]->u, UF_SCHEMA)
- .str();
+ scheme = util::get_uri_field(reqvec[0]->uri.c_str(), reqvec[0]->u, UF_SCHEMA);
std::stringstream ss;
if (reqvec[0]->is_ipv6_literal_addr()) {
// we may have zone ID, which must start with "%25", or "%". RFC
@@ -1435,7 +1435,7 @@ void HttpClient::update_hostport() {
util::get_uri_field(reqvec[0]->uri.c_str(), reqvec[0]->u, UF_HOST);
auto end = std::find(std::begin(host), std::end(host), '%');
ss << "[";
- ss.write(host.c_str(), end - std::begin(host));
+ ss.write(host.data(), end - std::begin(host));
ss << "]";
} else {
util::write_uri_field(ss, reqvec[0]->uri.c_str(), reqvec[0]->u, UF_HOST);
@@ -1688,7 +1688,7 @@ void update_html_parser(HttpClient *client, Request *req, const uint8_t *data,
}
auto link_port = util::has_uri_field(u, UF_PORT) ? u.port
- : scheme == "https" ? 443
+ : scheme == "https"_sr ? 443
: 80;
if (port != link_port) {
@@ -1800,8 +1800,8 @@ void check_response_header(nghttp2_session *session, Request *req) {
for (auto &nv : req->res_nva) {
if ("content-encoding" == nv.name) {
- gzip = util::strieq_l("gzip", nv.value) ||
- util::strieq_l("deflate", nv.value);
+ gzip = util::strieq("gzip"_sr, nv.value) ||
+ util::strieq("deflate"_sr, nv.value);
continue;
}
}
@@ -1915,10 +1915,12 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame,
req->header_buffer_size += namelen + valuelen;
- auto token = http2::lookup_token(name, namelen);
+ auto nameref = StringRef{name, namelen};
+ auto valueref = StringRef{value, valuelen};
+ auto token = http2::lookup_token(nameref);
http2::index_header(req->res_hdidx, token, req->res_nva.size());
- http2::add_header(req->res_nva, name, namelen, value, valuelen,
+ http2::add_header(req->res_nva, nameref, valueref,
flags & NGHTTP2_NV_FLAG_NO_INDEX, token);
break;
}
@@ -1939,10 +1941,12 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame,
req->header_buffer_size += namelen + valuelen;
- auto token = http2::lookup_token(name, namelen);
+ auto nameref = StringRef{name, namelen};
+ auto valueref = StringRef{value, valuelen};
+ auto token = http2::lookup_token(nameref);
http2::index_header(req->req_hdidx, token, req->req_nva.size());
- http2::add_header(req->req_nva, name, namelen, value, valuelen,
+ http2::add_header(req->req_nva, nameref, valueref,
flags & NGHTTP2_NV_FLAG_NO_INDEX, token);
break;
}
@@ -2283,7 +2287,8 @@ int communicate(
goto fin;
}
- if (SSL_CTX_set_cipher_list(ssl_ctx, tls::DEFAULT_CIPHER_LIST) == 0) {
+ if (SSL_CTX_set_cipher_list(ssl_ctx, tls::DEFAULT_CIPHER_LIST.data()) ==
+ 0) {
std::cerr << "[ERROR] " << ERR_error_string(ERR_get_error(), nullptr)
<< std::endl;
result = -1;
@@ -2437,7 +2442,8 @@ nghttp2_ssize file_read_callback(nghttp2_session *session, int32_t stream_id,
std::vector<nghttp2_nv> nva;
nva.reserve(config.trailer.size());
for (auto &kv : config.trailer) {
- nva.push_back(http2::make_nv(kv.name, kv.value, kv.no_index));
+ nva.push_back(http2::make_field_nv(kv.name, kv.value,
+ http2::no_index(kv.no_index)));
}
rv = nghttp2_submit_trailer(session, stream_id, nva.data(), nva.size());
if (rv != 0) {
@@ -2609,7 +2615,7 @@ int run(char **uris, int n) {
}
requests.clear();
}
- prev_scheme = util::get_uri_field(uri.c_str(), u, UF_SCHEMA).str();
+ prev_scheme = util::get_uri_field(uri.c_str(), u, UF_SCHEMA);
prev_host = std::move(host);
prev_port = port;
}
@@ -2818,11 +2824,11 @@ int main(int argc, char **argv) {
case 'M': {
// peer-max-concurrent-streams option
auto n = util::parse_uint(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "-M: Bad option value: " << optarg << std::endl;
exit(EXIT_FAILURE);
}
- config.peer_max_concurrent_streams = n;
+ config.peer_max_concurrent_streams = *n;
break;
}
case 'O':
@@ -2833,11 +2839,11 @@ int main(int argc, char **argv) {
exit(EXIT_SUCCESS);
case 'b': {
auto n = util::parse_uint(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "-b: Bad option value: " << optarg << std::endl;
exit(EXIT_FAILURE);
}
- config.padding = n;
+ config.padding = *n;
break;
}
case 'n':
@@ -2845,13 +2851,13 @@ int main(int argc, char **argv) {
break;
case 'p': {
auto n = util::parse_uint(optarg);
- if (n == -1 || NGHTTP2_MIN_WEIGHT > n || n > NGHTTP2_MAX_WEIGHT) {
+ if (!n || NGHTTP2_MIN_WEIGHT > n || n > NGHTTP2_MAX_WEIGHT) {
std::cerr << "-p: specify the integer in the range ["
<< NGHTTP2_MIN_WEIGHT << ", " << NGHTTP2_MAX_WEIGHT
<< "], inclusive" << std::endl;
exit(EXIT_FAILURE);
}
- config.weight.push_back(n);
+ config.weight.push_back(*n);
break;
}
case 'r':
@@ -2865,29 +2871,31 @@ int main(int argc, char **argv) {
case 'v':
++config.verbose;
break;
- case 't':
- config.timeout = util::parse_duration_with_unit(optarg);
- if (config.timeout == std::numeric_limits<double>::infinity()) {
+ case 't': {
+ auto d = util::parse_duration_with_unit(optarg);
+ if (!d) {
std::cerr << "-t: bad timeout value: " << optarg << std::endl;
exit(EXIT_FAILURE);
}
+ config.timeout = *d;
break;
+ }
case 'u':
config.upgrade = true;
break;
case 'w':
case 'W': {
auto n = util::parse_uint(optarg);
- if (n == -1 || n > 30) {
+ if (!n || n > 30) {
std::cerr << "-" << static_cast<char>(c)
<< ": specify the integer in the range [0, 30], inclusive"
<< std::endl;
exit(EXIT_FAILURE);
}
if (c == 'w') {
- config.window_bits = n;
+ config.window_bits = *n;
} else {
- config.connection_window_bits = n;
+ config.connection_window_bits = *n;
}
break;
}
@@ -2931,16 +2939,16 @@ int main(int argc, char **argv) {
break;
case 'm': {
auto n = util::parse_uint(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "-m: Bad option value: " << optarg << std::endl;
exit(EXIT_FAILURE);
}
- config.multiply = n;
+ config.multiply = *n;
break;
}
case 'c': {
auto n = util::parse_uint_with_unit(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "-c: Bad option value: " << optarg << std::endl;
exit(EXIT_FAILURE);
}
@@ -2949,8 +2957,8 @@ int main(int argc, char **argv) {
<< std::numeric_limits<uint32_t>::max() << std::endl;
exit(EXIT_FAILURE);
}
- config.header_table_size = n;
- config.min_header_table_size = std::min(config.min_header_table_size, n);
+ config.header_table_size = *n;
+ config.min_header_table_size = std::min(config.min_header_table_size, *n);
break;
}
case 'y':
@@ -3024,12 +3032,12 @@ int main(int argc, char **argv) {
case 12: {
// max-concurrent-streams option
auto n = util::parse_uint(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "--max-concurrent-streams: Bad option value: " << optarg
<< std::endl;
exit(EXIT_FAILURE);
}
- config.max_concurrent_streams = n;
+ config.max_concurrent_streams = *n;
break;
}
case 13:
@@ -3039,7 +3047,7 @@ int main(int argc, char **argv) {
case 14: {
// encoder-header-table-size option
auto n = util::parse_uint_with_unit(optarg);
- if (n == -1) {
+ if (!n) {
std::cerr << "--encoder-header-table-size: Bad option value: "
<< optarg << std::endl;
exit(EXIT_FAILURE);
@@ -3050,7 +3058,7 @@ int main(int argc, char **argv) {
<< std::numeric_limits<uint32_t>::max() << std::endl;
exit(EXIT_FAILURE);
}
- config.encoder_header_table_size = n;
+ config.encoder_header_table_size = *n;
break;
}
case 15:
@@ -3105,7 +3113,7 @@ int main(int argc, char **argv) {
exit(EXIT_FAILURE);
}
- config.host_override = util::get_uri_field(uri.c_str(), u, UF_HOST).str();
+ config.host_override = util::get_uri_field(uri.c_str(), u, UF_HOST);
if (util::has_uri_field(u, UF_PORT)) {
config.port_override = u.port;
}