Merge pull request #2159 from nghttp2/stringref-literal

Add StringRef literal operator and remove StringRef::from_lit
This commit is contained in:
Tatsuhiro Tsujikawa
2024-04-21 23:35:52 +09:00
committed by GitHub
36 changed files with 1244 additions and 1636 deletions

View File

@@ -94,8 +94,8 @@ void start_element_func(void *user_data, const xmlChar *src_name,
++parser_data->inside_head;
}
if (util::strieq_l("link", name)) {
auto rel_attr = get_attr(attrs, StringRef::from_lit("rel"));
auto href_attr = get_attr(attrs, StringRef::from_lit("href"));
auto rel_attr = get_attr(attrs, "rel"_sr);
auto href_attr = get_attr(attrs, "href"_sr);
if (rel_attr.empty() || href_attr.empty()) {
return;
}
@@ -104,7 +104,7 @@ void start_element_func(void *user_data, const xmlChar *src_name,
} else if (util::strieq_l("stylesheet", rel_attr)) {
add_link(parser_data, href_attr, REQ_CSS);
} else if (util::strieq_l("preload", rel_attr)) {
auto as_attr = get_attr(attrs, StringRef::from_lit("as"));
auto as_attr = get_attr(attrs, "as"_sr);
if (as_attr.empty()) {
return;
}
@@ -112,13 +112,13 @@ void start_element_func(void *user_data, const xmlChar *src_name,
get_resource_type_for_preload_as(as_attr));
}
} else if (util::strieq_l("img", name)) {
auto src_attr = get_attr(attrs, StringRef::from_lit("src"));
auto src_attr = get_attr(attrs, "src"_sr);
if (src_attr.empty()) {
return;
}
add_link(parser_data, src_attr, REQ_IMG);
} else if (util::strieq_l("script", name)) {
auto src_attr = get_attr(attrs, StringRef::from_lit("src"));
auto src_attr = get_attr(attrs, "src"_sr);
if (src_attr.empty()) {
return;
}

View File

@@ -78,9 +78,8 @@ namespace nghttp2 {
namespace {
// TODO could be constexpr
constexpr auto DEFAULT_HTML = StringRef::from_lit("index.html");
constexpr auto NGHTTPD_SERVER =
StringRef::from_lit("nghttpd nghttp2/" NGHTTP2_VERSION);
constexpr auto DEFAULT_HTML = "index.html"_sr;
constexpr auto NGHTTPD_SERVER = "nghttpd nghttp2/" NGHTTP2_VERSION ""_sr;
} // namespace
namespace {
@@ -1012,8 +1011,7 @@ int Http2Handler::submit_push_promise(Stream *stream,
authority = stream->header.host;
}
auto scheme = get_config()->no_tls ? StringRef::from_lit("http")
: StringRef::from_lit("https");
auto scheme = get_config()->no_tls ? "http"_sr : "https"_sr;
auto nva = std::to_array({http2::make_nv_ll(":method", "GET"),
http2::make_nv_ls_nocopy(":path", push_path),
@@ -1031,7 +1029,7 @@ int Http2Handler::submit_push_promise(Stream *stream,
auto promised_stream = std::make_unique<Stream>(this, promised_stream_id);
auto &promised_header = promised_stream->header;
promised_header.method = StringRef::from_lit("GET");
promised_header.method = "GET"_sr;
promised_header.path = push_path;
promised_header.scheme = scheme;
promised_header.authority =
@@ -1142,10 +1140,9 @@ void prepare_status_response(Stream *stream, Http2Handler *hd, int status) {
HeaderRefs headers;
headers.reserve(2);
headers.emplace_back(StringRef::from_lit("content-type"),
StringRef::from_lit("text/html; charset=UTF-8"));
headers.emplace_back("content-type"_sr, "text/html; charset=UTF-8"_sr);
headers.emplace_back(
StringRef::from_lit("content-length"),
"content-length"_sr,
util::make_string_ref_uint(stream->balloc, file_ent->length));
hd->submit_response(StringRef{status_page->status}, stream->stream_id,
headers, &data_prd);
@@ -1169,15 +1166,13 @@ void prepare_echo_response(Stream *stream, Http2Handler *hd) {
data_prd.read_callback = file_read_callback;
HeaderRefs headers;
headers.emplace_back(StringRef::from_lit("nghttpd-response"),
StringRef::from_lit("echo"));
headers.emplace_back("nghttpd-response"_sr, "echo"_sr);
if (!hd->get_config()->no_content_length) {
headers.emplace_back(StringRef::from_lit("content-length"),
headers.emplace_back("content-length"_sr,
util::make_string_ref_uint(stream->balloc, length));
}
hd->submit_response(StringRef::from_lit("200"), stream->stream_id, headers,
&data_prd);
hd->submit_response("200"_sr, stream->stream_id, headers, &data_prd);
}
} // namespace
@@ -1211,10 +1206,10 @@ void prepare_redirect_response(Stream *stream, Http2Handler *hd,
authority = stream->header.host;
}
auto location = concat_string_ref(
stream->balloc, scheme, StringRef::from_lit("://"), authority, path);
auto location =
concat_string_ref(stream->balloc, scheme, "://"_sr, authority, path);
auto headers = HeaderRefs{{StringRef::from_lit("location"), location}};
auto headers = HeaderRefs{{"location"_sr, location}};
auto sessions = hd->get_sessions();
auto status_page = sessions->get_server()->get_status_page(status);
@@ -1341,8 +1336,8 @@ void prepare_response(Stream *stream, Http2Handler *hd,
if (buf.st_mode & S_IFDIR) {
close(file);
auto reqpath = concat_string_ref(stream->balloc, raw_path,
StringRef::from_lit("/"), raw_query);
auto reqpath =
concat_string_ref(stream->balloc, raw_path, "/"_sr, raw_query);
prepare_redirect_response(stream, hd, reqpath, 301);
@@ -1372,16 +1367,15 @@ void prepare_response(Stream *stream, Http2Handler *hd,
stream->file_ent = file_ent;
if (last_mod_found && file_ent->mtime <= last_mod) {
hd->submit_response(StringRef::from_lit("304"), stream->stream_id, nullptr);
hd->submit_response("304"_sr, stream->stream_id, nullptr);
return;
}
auto method = stream->header.method;
if (method == StringRef::from_lit("HEAD")) {
hd->submit_file_response(StringRef::from_lit("200"), stream,
file_ent->mtime, file_ent->length,
file_ent->content_type, nullptr);
if (method == "HEAD"_sr) {
hd->submit_file_response("200"_sr, stream, file_ent->mtime,
file_ent->length, file_ent->content_type, nullptr);
return;
}
@@ -1392,8 +1386,8 @@ void prepare_response(Stream *stream, Http2Handler *hd,
data_prd.source.fd = file_ent->fd;
data_prd.read_callback = file_read_callback;
hd->submit_file_response(StringRef::from_lit("200"), stream, file_ent->mtime,
file_ent->length, file_ent->content_type, &data_prd);
hd->submit_file_response("200"_sr, stream, file_ent->mtime, file_ent->length,
file_ent->content_type, &data_prd);
}
} // namespace
@@ -1536,8 +1530,7 @@ int hd_on_frame_recv_callback(nghttp2_session *session,
auto method = stream->header.method;
if (hd->get_config()->echo_upload &&
(method == StringRef::from_lit("POST") ||
method == StringRef::from_lit("PUT"))) {
(method == "POST"_sr || method == "PUT"_sr)) {
if (!prepare_upload_temp_store(stream, hd)) {
hd->submit_rst_stream(stream, NGHTTP2_INTERNAL_ERROR);
return 0;
@@ -2131,7 +2124,8 @@ int HttpServer::run() {
return -1;
}
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 << ERR_error_string(ERR_get_error(), nullptr) << std::endl;
return -1;
}

View File

@@ -2087,7 +2087,7 @@ benchmarking tool for HTTP/2 server)"
} // namespace
namespace {
constexpr char DEFAULT_ALPN_LIST[] = "h2,h2-16,h2-14,http/1.1";
constexpr auto DEFAULT_ALPN_LIST = "h2,h2-16,h2-14,http/1.1"_sr;
} // namespace
namespace {
@@ -2482,8 +2482,7 @@ int main(int argc, char **argv) {
break;
case 'p': {
auto proto = StringRef{optarg};
if (util::strieq(StringRef::from_lit(NGHTTP2_CLEARTEXT_PROTO_VERSION_ID),
proto)) {
if (util::strieq(NGHTTP2_CLEARTEXT_PROTO_VERSION_ID ""_sr, proto)) {
config.no_tls_proto = Config::PROTO_HTTP2;
} else if (util::strieq(NGHTTP2_H1_1, proto)) {
config.no_tls_proto = Config::PROTO_HTTP1_1;
@@ -2608,8 +2607,7 @@ int main(int argc, char **argv) {
}
case 6:
// --h1
config.alpn_list =
util::parse_config_str_list(StringRef::from_lit("http/1.1"));
config.alpn_list = util::parse_config_str_list("http/1.1"_sr);
config.no_tls_proto = Config::PROTO_HTTP1_1;
break;
case 7:
@@ -2735,8 +2733,7 @@ int main(int argc, char **argv) {
}
if (config.alpn_list.empty()) {
config.alpn_list =
util::parse_config_str_list(StringRef::from_lit(DEFAULT_ALPN_LIST));
config.alpn_list = util::parse_config_str_list(DEFAULT_ALPN_LIST);
}
// serialize the APLN tokens
@@ -3078,8 +3075,8 @@ int main(int argc, char **argv) {
}
if (!content_length_str.empty()) {
nva.push_back(http2::make_nv(StringRef::from_lit("content-length"),
StringRef{content_length_str}));
nva.push_back(
http2::make_nv("content-length"_sr, StringRef{content_length_str}));
}
config.nva.push_back(std::move(nva));

View File

@@ -35,107 +35,107 @@ namespace http2 {
StringRef get_reason_phrase(unsigned int status_code) {
switch (status_code) {
case 100:
return StringRef::from_lit("Continue");
return "Continue"_sr;
case 101:
return StringRef::from_lit("Switching Protocols");
return "Switching Protocols"_sr;
case 103:
return StringRef::from_lit("Early Hints");
return "Early Hints"_sr;
case 200:
return StringRef::from_lit("OK");
return "OK"_sr;
case 201:
return StringRef::from_lit("Created");
return "Created"_sr;
case 202:
return StringRef::from_lit("Accepted");
return "Accepted"_sr;
case 203:
return StringRef::from_lit("Non-Authoritative Information");
return "Non-Authoritative Information"_sr;
case 204:
return StringRef::from_lit("No Content");
return "No Content"_sr;
case 205:
return StringRef::from_lit("Reset Content");
return "Reset Content"_sr;
case 206:
return StringRef::from_lit("Partial Content");
return "Partial Content"_sr;
case 300:
return StringRef::from_lit("Multiple Choices");
return "Multiple Choices"_sr;
case 301:
return StringRef::from_lit("Moved Permanently");
return "Moved Permanently"_sr;
case 302:
return StringRef::from_lit("Found");
return "Found"_sr;
case 303:
return StringRef::from_lit("See Other");
return "See Other"_sr;
case 304:
return StringRef::from_lit("Not Modified");
return "Not Modified"_sr;
case 305:
return StringRef::from_lit("Use Proxy");
// case 306: return StringRef::from_lit("(Unused)");
return "Use Proxy"_sr;
// case 306: return "(Unused)"_sr;
case 307:
return StringRef::from_lit("Temporary Redirect");
return "Temporary Redirect"_sr;
case 308:
return StringRef::from_lit("Permanent Redirect");
return "Permanent Redirect"_sr;
case 400:
return StringRef::from_lit("Bad Request");
return "Bad Request"_sr;
case 401:
return StringRef::from_lit("Unauthorized");
return "Unauthorized"_sr;
case 402:
return StringRef::from_lit("Payment Required");
return "Payment Required"_sr;
case 403:
return StringRef::from_lit("Forbidden");
return "Forbidden"_sr;
case 404:
return StringRef::from_lit("Not Found");
return "Not Found"_sr;
case 405:
return StringRef::from_lit("Method Not Allowed");
return "Method Not Allowed"_sr;
case 406:
return StringRef::from_lit("Not Acceptable");
return "Not Acceptable"_sr;
case 407:
return StringRef::from_lit("Proxy Authentication Required");
return "Proxy Authentication Required"_sr;
case 408:
return StringRef::from_lit("Request Timeout");
return "Request Timeout"_sr;
case 409:
return StringRef::from_lit("Conflict");
return "Conflict"_sr;
case 410:
return StringRef::from_lit("Gone");
return "Gone"_sr;
case 411:
return StringRef::from_lit("Length Required");
return "Length Required"_sr;
case 412:
return StringRef::from_lit("Precondition Failed");
return "Precondition Failed"_sr;
case 413:
return StringRef::from_lit("Payload Too Large");
return "Payload Too Large"_sr;
case 414:
return StringRef::from_lit("URI Too Long");
return "URI Too Long"_sr;
case 415:
return StringRef::from_lit("Unsupported Media Type");
return "Unsupported Media Type"_sr;
case 416:
return StringRef::from_lit("Requested Range Not Satisfiable");
return "Requested Range Not Satisfiable"_sr;
case 417:
return StringRef::from_lit("Expectation Failed");
return "Expectation Failed"_sr;
case 421:
return StringRef::from_lit("Misdirected Request");
return "Misdirected Request"_sr;
case 425:
// https://tools.ietf.org/html/rfc8470
return StringRef::from_lit("Too Early");
return "Too Early"_sr;
case 426:
return StringRef::from_lit("Upgrade Required");
return "Upgrade Required"_sr;
case 428:
return StringRef::from_lit("Precondition Required");
return "Precondition Required"_sr;
case 429:
return StringRef::from_lit("Too Many Requests");
return "Too Many Requests"_sr;
case 431:
return StringRef::from_lit("Request Header Fields Too Large");
return "Request Header Fields Too Large"_sr;
case 451:
return StringRef::from_lit("Unavailable For Legal Reasons");
return "Unavailable For Legal Reasons"_sr;
case 500:
return StringRef::from_lit("Internal Server Error");
return "Internal Server Error"_sr;
case 501:
return StringRef::from_lit("Not Implemented");
return "Not Implemented"_sr;
case 502:
return StringRef::from_lit("Bad Gateway");
return "Bad Gateway"_sr;
case 503:
return StringRef::from_lit("Service Unavailable");
return "Service Unavailable"_sr;
case 504:
return StringRef::from_lit("Gateway Timeout");
return "Gateway Timeout"_sr;
case 505:
return StringRef::from_lit("HTTP Version Not Supported");
return "HTTP Version Not Supported"_sr;
case 511:
return StringRef::from_lit("Network Authentication Required");
return "Network Authentication Required"_sr;
default:
return StringRef{};
}
@@ -144,104 +144,104 @@ StringRef get_reason_phrase(unsigned int status_code) {
StringRef stringify_status(BlockAllocator &balloc, unsigned int status_code) {
switch (status_code) {
case 100:
return StringRef::from_lit("100");
return "100"_sr;
case 101:
return StringRef::from_lit("101");
return "101"_sr;
case 103:
return StringRef::from_lit("103");
return "103"_sr;
case 200:
return StringRef::from_lit("200");
return "200"_sr;
case 201:
return StringRef::from_lit("201");
return "201"_sr;
case 202:
return StringRef::from_lit("202");
return "202"_sr;
case 203:
return StringRef::from_lit("203");
return "203"_sr;
case 204:
return StringRef::from_lit("204");
return "204"_sr;
case 205:
return StringRef::from_lit("205");
return "205"_sr;
case 206:
return StringRef::from_lit("206");
return "206"_sr;
case 300:
return StringRef::from_lit("300");
return "300"_sr;
case 301:
return StringRef::from_lit("301");
return "301"_sr;
case 302:
return StringRef::from_lit("302");
return "302"_sr;
case 303:
return StringRef::from_lit("303");
return "303"_sr;
case 304:
return StringRef::from_lit("304");
return "304"_sr;
case 305:
return StringRef::from_lit("305");
// case 306: return StringRef::from_lit("306");
return "305"_sr;
// case 306: return "306"_sr;
case 307:
return StringRef::from_lit("307");
return "307"_sr;
case 308:
return StringRef::from_lit("308");
return "308"_sr;
case 400:
return StringRef::from_lit("400");
return "400"_sr;
case 401:
return StringRef::from_lit("401");
return "401"_sr;
case 402:
return StringRef::from_lit("402");
return "402"_sr;
case 403:
return StringRef::from_lit("403");
return "403"_sr;
case 404:
return StringRef::from_lit("404");
return "404"_sr;
case 405:
return StringRef::from_lit("405");
return "405"_sr;
case 406:
return StringRef::from_lit("406");
return "406"_sr;
case 407:
return StringRef::from_lit("407");
return "407"_sr;
case 408:
return StringRef::from_lit("408");
return "408"_sr;
case 409:
return StringRef::from_lit("409");
return "409"_sr;
case 410:
return StringRef::from_lit("410");
return "410"_sr;
case 411:
return StringRef::from_lit("411");
return "411"_sr;
case 412:
return StringRef::from_lit("412");
return "412"_sr;
case 413:
return StringRef::from_lit("413");
return "413"_sr;
case 414:
return StringRef::from_lit("414");
return "414"_sr;
case 415:
return StringRef::from_lit("415");
return "415"_sr;
case 416:
return StringRef::from_lit("416");
return "416"_sr;
case 417:
return StringRef::from_lit("417");
return "417"_sr;
case 421:
return StringRef::from_lit("421");
return "421"_sr;
case 426:
return StringRef::from_lit("426");
return "426"_sr;
case 428:
return StringRef::from_lit("428");
return "428"_sr;
case 429:
return StringRef::from_lit("429");
return "429"_sr;
case 431:
return StringRef::from_lit("431");
return "431"_sr;
case 451:
return StringRef::from_lit("451");
return "451"_sr;
case 500:
return StringRef::from_lit("500");
return "500"_sr;
case 501:
return StringRef::from_lit("501");
return "501"_sr;
case 502:
return StringRef::from_lit("502");
return "502"_sr;
case 503:
return StringRef::from_lit("503");
return "503"_sr;
case 504:
return StringRef::from_lit("504");
return "504"_sr;
case 505:
return StringRef::from_lit("505");
return "505"_sr;
case 511:
return StringRef::from_lit("511");
return "511"_sr;
default:
return util::make_string_ref_uint(balloc, status_code);
}
@@ -1621,7 +1621,7 @@ StringRef get_pure_path_component(const StringRef &uri) {
return StringRef{uri.data() + f.off, f.len};
}
return StringRef::from_lit("/");
return "/"_sr;
}
int construct_push_component(BlockAllocator &balloc, StringRef &scheme,
@@ -1679,7 +1679,7 @@ int construct_push_component(BlockAllocator &balloc, StringRef &scheme,
auto &f = u.field_data[UF_PATH];
rel = StringRef{uri.data() + f.off, f.len};
} else {
rel = StringRef::from_lit("/");
rel = "/"_sr;
}
if (u.field_set & (1 << UF_QUERY)) {
@@ -1946,7 +1946,7 @@ StringRef copy_lower(BlockAllocator &balloc, const StringRef &src) {
}
bool contains_trailers(const StringRef &s) {
constexpr auto trailers = StringRef::from_lit("trailers");
constexpr auto trailers = "trailers"_sr;
for (auto p = std::begin(s), end = std::end(s);; ++p) {
p = std::find_if(p, end, [](char c) { return c != ' ' && c != '\t'; });

File diff suppressed because it is too large Load Diff

View File

@@ -2282,7 +2282,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;

View File

@@ -113,19 +113,19 @@ namespace shrpx {
// Deprecated: Environment variables to tell new binary the listening
// socket's file descriptors. They are not close-on-exec.
constexpr auto ENV_LISTENER4_FD = StringRef::from_lit("NGHTTPX_LISTENER4_FD");
constexpr auto ENV_LISTENER6_FD = StringRef::from_lit("NGHTTPX_LISTENER6_FD");
constexpr auto ENV_LISTENER4_FD = "NGHTTPX_LISTENER4_FD"_sr;
constexpr auto ENV_LISTENER6_FD = "NGHTTPX_LISTENER6_FD"_sr;
// Deprecated: Environment variable to tell new binary the port number
// the current binary is listening to.
constexpr auto ENV_PORT = StringRef::from_lit("NGHTTPX_PORT");
constexpr auto ENV_PORT = "NGHTTPX_PORT"_sr;
// Deprecated: Environment variable to tell new binary the listening
// socket's file descriptor if frontend listens UNIX domain socket.
constexpr auto ENV_UNIX_FD = StringRef::from_lit("NGHTTP2_UNIX_FD");
constexpr auto ENV_UNIX_FD = "NGHTTP2_UNIX_FD"_sr;
// Deprecated: Environment variable to tell new binary the UNIX domain
// socket path.
constexpr auto ENV_UNIX_PATH = StringRef::from_lit("NGHTTP2_UNIX_PATH");
constexpr auto ENV_UNIX_PATH = "NGHTTP2_UNIX_PATH"_sr;
// Prefix of environment variables to tell new binary the listening
// socket's file descriptor. They are not close-on-exec. For TCP
@@ -133,13 +133,13 @@ constexpr auto ENV_UNIX_PATH = StringRef::from_lit("NGHTTP2_UNIX_PATH");
// <FD> is file descriptor. For UNIX domain socket, the value must be
// comma separated 3 parameters: unix,<FD>,<PATH>. <FD> is file
// descriptor. <PATH> is a path to UNIX domain socket.
constexpr auto ENV_ACCEPT_PREFIX = StringRef::from_lit("NGHTTPX_ACCEPT_");
constexpr auto ENV_ACCEPT_PREFIX = "NGHTTPX_ACCEPT_"_sr;
// This environment variable contains PID of the original main
// process, assuming that it created this main process as a result of
// SIGUSR2. The new main process is expected to send QUIT signal to
// the original main process to shut it down gracefully.
constexpr auto ENV_ORIG_PID = StringRef::from_lit("NGHTTPX_ORIG_PID");
constexpr auto ENV_ORIG_PID = "NGHTTPX_ORIG_PID"_sr;
// Prefix of environment variables to tell new binary the QUIC IPC
// file descriptor and Worker ID of the lingering worker process. The
@@ -150,7 +150,7 @@ constexpr auto ENV_ORIG_PID = StringRef::from_lit("NGHTTPX_ORIG_PID");
// <FD> is the file descriptor. <WORKER_ID_I> is the I-th Worker ID
// in hex encoded string.
constexpr auto ENV_QUIC_WORKER_PROCESS_PREFIX =
StringRef::from_lit("NGHTTPX_QUIC_WORKER_PROCESS_");
"NGHTTPX_QUIC_WORKER_PROCESS_"_sr;
#ifndef _KERNEL_FASTOPEN
# define _KERNEL_FASTOPEN
@@ -399,7 +399,7 @@ int save_pid() {
std::array<char, STRERROR_BUFSIZE> errbuf;
auto config = get_config();
constexpr auto SUFFIX = StringRef::from_lit(".XXXXXX");
constexpr auto SUFFIX = ".XXXXXX"_sr;
auto &pid_file = config->pid_file;
auto len = config->pid_file.size() + SUFFIX.size();
@@ -741,7 +741,7 @@ int create_unix_domain_server_socket(UpstreamAddr &faddr,
<< (faddr.tls ? ", tls" : "");
(*found).used = true;
faddr.fd = (*found).fd;
faddr.hostport = StringRef::from_lit("localhost");
faddr.hostport = "localhost"_sr;
return 0;
}
@@ -810,7 +810,7 @@ int create_unix_domain_server_socket(UpstreamAddr &faddr,
<< (faddr.tls ? ", tls" : "");
faddr.fd = fd;
faddr.hostport = StringRef::from_lit("localhost");
faddr.hostport = "localhost"_sr;
return 0;
}
@@ -834,8 +834,7 @@ int create_tcp_server_socket(UpstreamAddr &faddr,
hints.ai_flags |= AI_ADDRCONFIG;
#endif // AI_ADDRCONFIG
auto node =
faddr.host == StringRef::from_lit("*") ? nullptr : faddr.host.data();
auto node = faddr.host == "*"_sr ? nullptr : faddr.host.data();
addrinfo *res, *rp;
rv = getaddrinfo(node, service.c_str(), &hints, &res);
@@ -1104,7 +1103,7 @@ std::vector<InheritedAddr> get_inherited_addr_from_env(Config *config) {
auto type = StringRef(env, end_type);
auto value = end_type + 1;
if (type == StringRef::from_lit("unix")) {
if (type == "unix"_sr) {
auto endfd = strchr(value, ',');
if (!endfd) {
continue;
@@ -1135,7 +1134,7 @@ std::vector<InheritedAddr> get_inherited_addr_from_env(Config *config) {
iaddrs.push_back(std::move(addr));
}
if (type == StringRef::from_lit("tcp")) {
if (type == "tcp"_sr) {
auto fd = util::parse_uint(value);
if (!fd) {
LOG(WARN) << "Could not parse file descriptor from " << value;
@@ -1926,30 +1925,29 @@ bool conf_exists(const char *path) {
} // namespace
namespace {
constexpr auto DEFAULT_ALPN_LIST =
StringRef::from_lit("h2,h2-16,h2-14,http/1.1");
constexpr auto DEFAULT_ALPN_LIST = "h2,h2-16,h2-14,http/1.1"_sr;
} // namespace
namespace {
constexpr auto DEFAULT_TLS_MIN_PROTO_VERSION = StringRef::from_lit("TLSv1.2");
constexpr auto DEFAULT_TLS_MIN_PROTO_VERSION = "TLSv1.2"_sr;
#ifdef TLS1_3_VERSION
constexpr auto DEFAULT_TLS_MAX_PROTO_VERSION = StringRef::from_lit("TLSv1.3");
constexpr auto DEFAULT_TLS_MAX_PROTO_VERSION = "TLSv1.3"_sr;
#else // !TLS1_3_VERSION
constexpr auto DEFAULT_TLS_MAX_PROTO_VERSION = StringRef::from_lit("TLSv1.2");
constexpr auto DEFAULT_TLS_MAX_PROTO_VERSION = "TLSv1.2"_sr;
#endif // !TLS1_3_VERSION
} // namespace
namespace {
constexpr auto DEFAULT_ACCESSLOG_FORMAT =
StringRef::from_lit(R"($remote_addr - - [$time_local] )"
R"("$request" $status $body_bytes_sent )"
R"("$http_referer" "$http_user_agent")");
R"($remote_addr - - [$time_local] )"
R"("$request" $status $body_bytes_sent )"
R"("$http_referer" "$http_user_agent")"_sr;
} // namespace
namespace {
void fill_default_config(Config *config) {
config->num_worker = 1;
config->conf_path = StringRef::from_lit("/etc/nghttpx/nghttpx.conf");
config->conf_path = "/etc/nghttpx/nghttpx.conf"_sr;
config->pid = getpid();
#ifdef NOTHREADS
@@ -1984,8 +1982,7 @@ void fill_default_config(Config *config) {
auto &ocspconf = tlsconf.ocsp;
// ocsp update interval = 14400 secs = 4 hours, borrowed from h2o
ocspconf.update_interval = 4_h;
ocspconf.fetch_ocsp_response_file =
StringRef::from_lit(PKGDATADIR "/fetch-ocsp-response");
ocspconf.fetch_ocsp_response_file = PKGDATADIR "/fetch-ocsp-response"_sr;
}
{
@@ -1995,28 +1992,26 @@ void fill_default_config(Config *config) {
}
tlsconf.session_timeout = std::chrono::hours(12);
tlsconf.ciphers = StringRef::from_lit(nghttp2::tls::DEFAULT_CIPHER_LIST);
tlsconf.tls13_ciphers =
StringRef::from_lit(nghttp2::tls::DEFAULT_TLS13_CIPHER_LIST);
tlsconf.client.ciphers =
StringRef::from_lit(nghttp2::tls::DEFAULT_CIPHER_LIST);
tlsconf.ciphers = StringRef{nghttp2::tls::DEFAULT_CIPHER_LIST};
tlsconf.tls13_ciphers = StringRef{nghttp2::tls::DEFAULT_TLS13_CIPHER_LIST};
tlsconf.client.ciphers = StringRef{nghttp2::tls::DEFAULT_CIPHER_LIST};
tlsconf.client.tls13_ciphers =
StringRef::from_lit(nghttp2::tls::DEFAULT_TLS13_CIPHER_LIST);
StringRef{nghttp2::tls::DEFAULT_TLS13_CIPHER_LIST};
tlsconf.min_proto_version =
tls::proto_version_from_string(DEFAULT_TLS_MIN_PROTO_VERSION);
tlsconf.max_proto_version =
tls::proto_version_from_string(DEFAULT_TLS_MAX_PROTO_VERSION);
tlsconf.max_early_data = 16_k;
tlsconf.ecdh_curves = StringRef::from_lit("X25519:P-256:P-384:P-521");
tlsconf.ecdh_curves = "X25519:P-256:P-384:P-521"_sr;
auto &httpconf = config->http;
httpconf.server_name = StringRef::from_lit("nghttpx");
httpconf.server_name = "nghttpx"_sr;
httpconf.no_host_rewrite = true;
httpconf.request_header_field_buffer = 64_k;
httpconf.max_request_header_fields = 100;
httpconf.response_header_field_buffer = 64_k;
httpconf.max_response_header_fields = 500;
httpconf.redirect_https_port = StringRef::from_lit("443");
httpconf.redirect_https_port = "443"_sr;
httpconf.max_requests = std::numeric_limits<size_t>::max();
httpconf.xfp.add = true;
httpconf.xfp.strip_incoming = true;
@@ -2096,7 +2091,7 @@ void fill_default_config(Config *config) {
}
auto &bpfconf = quicconf.bpf;
bpfconf.prog_file = StringRef::from_lit(PKGLIBDIR "/reuseport_kern.o");
bpfconf.prog_file = PKGLIBDIR "/reuseport_kern.o"_sr;
upstreamconf.congestion_controller = NGTCP2_CC_ALGO_CUBIC;
@@ -2129,7 +2124,7 @@ void fill_default_config(Config *config) {
parse_log_format(config->balloc, DEFAULT_ACCESSLOG_FORMAT);
auto &errorconf = loggingconf.error;
errorconf.file = StringRef::from_lit("/dev/stderr");
errorconf.file = "/dev/stderr"_sr;
}
loggingconf.syslog_facility = LOG_DAEMON;
@@ -3798,7 +3793,7 @@ int process_options(Config *config,
if (listenerconf.addrs.empty()) {
UpstreamAddr addr{};
addr.host = StringRef::from_lit("*");
addr.host = "*"_sr;
addr.port = 3000;
addr.tls = true;
addr.family = AF_INET;
@@ -4410,7 +4405,7 @@ int main(int argc, char **argv) {
}
switch (c) {
case 'D':
cmdcfgs.emplace_back(SHRPX_OPT_DAEMON, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_DAEMON, "yes"_sr);
break;
case 'L':
cmdcfgs.emplace_back(SHRPX_OPT_LOG_LEVEL, StringRef{optarg});
@@ -4429,20 +4424,19 @@ int main(int argc, char **argv) {
print_help(std::cout);
exit(EXIT_SUCCESS);
case 'k':
cmdcfgs.emplace_back(SHRPX_OPT_INSECURE, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_INSECURE, "yes"_sr);
break;
case 'n':
cmdcfgs.emplace_back(SHRPX_OPT_WORKERS, StringRef{optarg});
break;
case 'o':
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_FRAME_DEBUG,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_FRAME_DEBUG, "yes"_sr);
break;
case 'p':
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT_PROXY, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT_PROXY, "yes"_sr);
break;
case 's':
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_PROXY, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_PROXY, "yes"_sr);
break;
case 'v':
print_version(std::cout);
@@ -4454,8 +4448,7 @@ int main(int argc, char **argv) {
switch (flag) {
case 1:
// --add-x-forwarded-for
cmdcfgs.emplace_back(SHRPX_OPT_ADD_X_FORWARDED_FOR,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_ADD_X_FORWARDED_FOR, "yes"_sr);
break;
case 2:
// --frontend-http2-read-timeout
@@ -4519,7 +4512,7 @@ int main(int argc, char **argv) {
break;
case 17:
// --client
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT, "yes"_sr);
break;
case 18:
// --backend-http2-window-bits
@@ -4532,13 +4525,11 @@ int main(int argc, char **argv) {
break;
case 20:
// --backend-ipv4
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_IPV4,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_IPV4, "yes"_sr);
break;
case 21:
// --backend-ipv6
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_IPV6,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_IPV6, "yes"_sr);
break;
case 22:
// --private-key-passwd-file
@@ -4547,7 +4538,7 @@ int main(int argc, char **argv) {
break;
case 23:
// --no-via
cmdcfgs.emplace_back(SHRPX_OPT_NO_VIA, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_VIA, "yes"_sr);
break;
case 24:
// --subcert
@@ -4555,8 +4546,7 @@ int main(int argc, char **argv) {
break;
case 25:
// --http2-bridge
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_BRIDGE,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_BRIDGE, "yes"_sr);
break;
case 26:
// --backend-http-proxy-uri
@@ -4565,23 +4555,19 @@ int main(int argc, char **argv) {
break;
case 27:
// --backend-no-tls
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_NO_TLS,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_NO_TLS, "yes"_sr);
break;
case 28:
// --ocsp-startup
cmdcfgs.emplace_back(SHRPX_OPT_OCSP_STARTUP,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_OCSP_STARTUP, "yes"_sr);
break;
case 29:
// --frontend-no-tls
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_NO_TLS,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_NO_TLS, "yes"_sr);
break;
case 30:
// --no-verify-ocsp
cmdcfgs.emplace_back(SHRPX_OPT_NO_VERIFY_OCSP,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_VERIFY_OCSP, "yes"_sr);
break;
case 31:
// --backend-tls-sni-field
@@ -4614,8 +4600,7 @@ int main(int argc, char **argv) {
break;
case 39:
// --verify-client
cmdcfgs.emplace_back(SHRPX_OPT_VERIFY_CLIENT,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_VERIFY_CLIENT, "yes"_sr);
break;
case 40:
// --verify-client-cacert
@@ -4642,8 +4627,7 @@ int main(int argc, char **argv) {
break;
case 45:
// --http2-no-cookie-crumbling
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING, "yes"_sr);
break;
case 46:
// --frontend-http2-connection-window-bits
@@ -4694,8 +4678,7 @@ int main(int argc, char **argv) {
break;
case 57:
// --accesslog-syslog
cmdcfgs.emplace_back(SHRPX_OPT_ACCESSLOG_SYSLOG,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_ACCESSLOG_SYSLOG, "yes"_sr);
break;
case 58:
// --errorlog-file
@@ -4703,8 +4686,7 @@ int main(int argc, char **argv) {
break;
case 59:
// --errorlog-syslog
cmdcfgs.emplace_back(SHRPX_OPT_ERRORLOG_SYSLOG,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_ERRORLOG_SYSLOG, "yes"_sr);
break;
case 60:
// --stream-read-timeout
@@ -4716,8 +4698,7 @@ int main(int argc, char **argv) {
break;
case 62:
// --no-location-rewrite
cmdcfgs.emplace_back(SHRPX_OPT_NO_LOCATION_REWRITE,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_LOCATION_REWRITE, "yes"_sr);
break;
case 63:
// --backend-http1-connections-per-host
@@ -4732,7 +4713,7 @@ int main(int argc, char **argv) {
case 65:
// --strip-incoming-x-forwarded-for
cmdcfgs.emplace_back(SHRPX_OPT_STRIP_INCOMING_X_FORWARDED_FOR,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 66:
// --accesslog-format
@@ -4763,13 +4744,11 @@ int main(int argc, char **argv) {
break;
case 73:
// --no-host-rewrite
cmdcfgs.emplace_back(SHRPX_OPT_NO_HOST_REWRITE,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_HOST_REWRITE, "yes"_sr);
break;
case 74:
// --no-server-push
cmdcfgs.emplace_back(SHRPX_OPT_NO_SERVER_PUSH,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_SERVER_PUSH, "yes"_sr);
break;
case 76:
// --backend-http2-connections-per-worker
@@ -4787,7 +4766,7 @@ int main(int argc, char **argv) {
break;
case 79:
// --no-ocsp
cmdcfgs.emplace_back(SHRPX_OPT_NO_OCSP, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_OCSP, "yes"_sr);
break;
case 80:
// --header-field-buffer
@@ -4812,8 +4791,7 @@ int main(int argc, char **argv) {
break;
case 85:
// --host-rewrite
cmdcfgs.emplace_back(SHRPX_OPT_HOST_REWRITE,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_HOST_REWRITE, "yes"_sr);
break;
case 86:
// --tls-session-cache-memcached
@@ -4846,8 +4824,7 @@ int main(int argc, char **argv) {
break;
case 93:
// --accept-proxy-protocol
cmdcfgs.emplace_back(SHRPX_OPT_ACCEPT_PROXY_PROTOCOL,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_ACCEPT_PROXY_PROTOCOL, "yes"_sr);
break;
case 94:
// --fastopen
@@ -4869,8 +4846,7 @@ int main(int argc, char **argv) {
break;
case 98:
// --strip-incoming-forwarded
cmdcfgs.emplace_back(SHRPX_OPT_STRIP_INCOMING_FORWARDED,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_STRIP_INCOMING_FORWARDED, "yes"_sr);
break;
case 99:
// --forwarded-by
@@ -4892,8 +4868,7 @@ int main(int argc, char **argv) {
break;
case 103:
// --no-http2-cipher-black-list
cmdcfgs.emplace_back(SHRPX_OPT_NO_HTTP2_CIPHER_BLACK_LIST,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_HTTP2_CIPHER_BLACK_LIST, "yes"_sr);
break;
case 104:
// --request-header-field-buffer
@@ -4907,13 +4882,12 @@ int main(int argc, char **argv) {
break;
case 106:
// --backend-http1-tls
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_HTTP1_TLS,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_HTTP1_TLS, "yes"_sr);
break;
case 108:
// --tls-session-cache-memcached-tls
cmdcfgs.emplace_back(SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_TLS,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 109:
// --tls-session-cache-memcached-cert-file
@@ -4928,8 +4902,7 @@ int main(int argc, char **argv) {
break;
case 111:
// --tls-ticket-key-memcached-tls
cmdcfgs.emplace_back(SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_TLS,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_TLS, "yes"_sr);
break;
case 112:
// --tls-ticket-key-memcached-cert-file
@@ -4975,7 +4948,7 @@ int main(int argc, char **argv) {
break;
case 120:
// --backend-tls
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_TLS, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_BACKEND_TLS, "yes"_sr);
break;
case 121:
// --backend-connections-per-host
@@ -4988,7 +4961,7 @@ int main(int argc, char **argv) {
break;
case 123:
// --no-kqueue
cmdcfgs.emplace_back(SHRPX_OPT_NO_KQUEUE, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_KQUEUE, "yes"_sr);
break;
case 124:
// --frontend-http2-settings-timeout
@@ -5014,19 +4987,17 @@ int main(int argc, char **argv) {
break;
case 129:
// --no-server-rewrite
cmdcfgs.emplace_back(SHRPX_OPT_NO_SERVER_REWRITE,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_SERVER_REWRITE, "yes"_sr);
break;
case 130:
// --frontend-http2-optimize-write-buffer-size
cmdcfgs.emplace_back(
SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WRITE_BUFFER_SIZE,
StringRef::from_lit("yes"));
SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WRITE_BUFFER_SIZE, "yes"_sr);
break;
case 131:
// --frontend-http2-optimize-window-size
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WINDOW_SIZE,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 132:
// --frontend-http2-window-size
@@ -5111,7 +5082,7 @@ int main(int argc, char **argv) {
case 149:
// --client-no-http2-cipher-black-list
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT_NO_HTTP2_CIPHER_BLACK_LIST,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 150:
// --client-ciphers
@@ -5119,8 +5090,7 @@ int main(int argc, char **argv) {
break;
case 151:
// --accesslog-write-early
cmdcfgs.emplace_back(SHRPX_OPT_ACCESSLOG_WRITE_EARLY,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_ACCESSLOG_WRITE_EARLY, "yes"_sr);
break;
case 152:
// --tls-min-proto-version
@@ -5143,38 +5113,34 @@ int main(int argc, char **argv) {
break;
case 156:
// --single-thread
cmdcfgs.emplace_back(SHRPX_OPT_SINGLE_THREAD,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_SINGLE_THREAD, "yes"_sr);
break;
case 157:
// --no-add-x-forwarded-proto
cmdcfgs.emplace_back(SHRPX_OPT_NO_ADD_X_FORWARDED_PROTO,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_ADD_X_FORWARDED_PROTO, "yes"_sr);
break;
case 158:
// --no-strip-incoming-x-forwarded-proto
cmdcfgs.emplace_back(SHRPX_OPT_NO_STRIP_INCOMING_X_FORWARDED_PROTO,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 159:
// --single-process
cmdcfgs.emplace_back(SHRPX_OPT_SINGLE_PROCESS,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_SINGLE_PROCESS, "yes"_sr);
break;
case 160:
// --verify-client-tolerate-expired
cmdcfgs.emplace_back(SHRPX_OPT_VERIFY_CLIENT_TOLERATE_EXPIRED,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 161:
// --ignore-per-pattern-mruby-error
cmdcfgs.emplace_back(SHRPX_OPT_IGNORE_PER_PATTERN_MRUBY_ERROR,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 162:
// --tls-no-postpone-early-data
cmdcfgs.emplace_back(SHRPX_OPT_TLS_NO_POSTPONE_EARLY_DATA,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_TLS_NO_POSTPONE_EARLY_DATA, "yes"_sr);
break;
case 163:
// --tls-max-early-data
@@ -5190,18 +5156,16 @@ int main(int argc, char **argv) {
break;
case 166:
// --no-strip-incoming-early-data
cmdcfgs.emplace_back(SHRPX_OPT_NO_STRIP_INCOMING_EARLY_DATA,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_STRIP_INCOMING_EARLY_DATA, "yes"_sr);
break;
case 167:
// --no-http2-cipher-block-list
cmdcfgs.emplace_back(SHRPX_OPT_NO_HTTP2_CIPHER_BLOCK_LIST,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_HTTP2_CIPHER_BLOCK_LIST, "yes"_sr);
break;
case 168:
// --client-no-http2-cipher-block-list
cmdcfgs.emplace_back(SHRPX_OPT_CLIENT_NO_HTTP2_CIPHER_BLOCK_LIST,
StringRef::from_lit("yes"));
"yes"_sr);
break;
case 169:
// --quic-bpf-program-file
@@ -5210,7 +5174,7 @@ int main(int argc, char **argv) {
break;
case 170:
// --no-quic-bpf
cmdcfgs.emplace_back(SHRPX_OPT_NO_QUIC_BPF, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_NO_QUIC_BPF, "yes"_sr);
break;
case 171:
// --http2-altsvc
@@ -5228,8 +5192,7 @@ int main(int argc, char **argv) {
break;
case 174:
// --frontend-quic-debug-log
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_DEBUG_LOG,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_DEBUG_LOG, "yes"_sr);
break;
case 175:
// --frontend-http3-window-size
@@ -5259,8 +5222,7 @@ int main(int argc, char **argv) {
break;
case 180:
// --frontend-quic-early-data
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_EARLY_DATA,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_EARLY_DATA, "yes"_sr);
break;
case 181:
// --frontend-quic-qlog-dir
@@ -5269,8 +5231,7 @@ int main(int argc, char **argv) {
break;
case 182:
// --frontend-quic-require-token
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_REQUIRE_TOKEN,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_FRONTEND_QUIC_REQUIRE_TOKEN, "yes"_sr);
break;
case 183:
// --frontend-quic-congestion-controller
@@ -5306,12 +5267,11 @@ int main(int argc, char **argv) {
break;
case 191:
// --require-http-scheme
cmdcfgs.emplace_back(SHRPX_OPT_REQUIRE_HTTP_SCHEME,
StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_REQUIRE_HTTP_SCHEME, "yes"_sr);
break;
case 192:
// --tls-ktls
cmdcfgs.emplace_back(SHRPX_OPT_TLS_KTLS, StringRef::from_lit("yes"));
cmdcfgs.emplace_back(SHRPX_OPT_TLS_KTLS, "yes"_sr);
break;
case 193:
// --alpn-list

View File

@@ -40,14 +40,14 @@ namespace shrpx {
namespace {
const auto backendconfig_endpoint = APIEndpoint{
StringRef::from_lit("/api/v1beta1/backendconfig"),
"/api/v1beta1/backendconfig"_sr,
true,
(1 << API_METHOD_POST) | (1 << API_METHOD_PUT),
&APIDownstreamConnection::handle_backendconfig,
};
const auto configrevision_endpoint = APIEndpoint{
StringRef::from_lit("/api/v1beta1/configrevision"),
"/api/v1beta1/configrevision"_sr,
true,
(1 << API_METHOD_GET),
&APIDownstreamConnection::handle_configrevision,
@@ -57,9 +57,9 @@ const auto configrevision_endpoint = APIEndpoint{
namespace {
// The method string. This must be same order of APIMethod.
constexpr StringRef API_METHOD_STRING[] = {
StringRef::from_lit("GET"),
StringRef::from_lit("POST"),
StringRef::from_lit("PUT"),
"GET"_sr,
"POST"_sr,
"PUT"_sr,
};
} // namespace
@@ -106,18 +106,18 @@ int APIDownstreamConnection::send_reply(unsigned int http_status,
switch (api_status) {
case APIStatusCode::SUCCESS:
api_status_str = StringRef::from_lit("Success");
api_status_str = "Success"_sr;
break;
case APIStatusCode::FAILURE:
api_status_str = StringRef::from_lit("Failure");
api_status_str = "Failure"_sr;
break;
default:
assert(0);
}
constexpr auto M1 = StringRef::from_lit("{\"status\":\"");
constexpr auto M2 = StringRef::from_lit("\",\"code\":");
constexpr auto M3 = StringRef::from_lit("}");
constexpr auto M1 = "{\"status\":\""_sr;
constexpr auto M2 = "\",\"code\":"_sr;
constexpr auto M3 = "}"_sr;
// 3 is the number of digits in http_status, assuming it is 3 digits
// number.
@@ -138,15 +138,14 @@ int APIDownstreamConnection::send_reply(unsigned int http_status,
auto content_length = util::make_string_ref_uint(balloc, buf.size());
resp.fs.add_header_token(StringRef::from_lit("content-length"),
content_length, false, http2::HD_CONTENT_LENGTH);
resp.fs.add_header_token("content-length"_sr, content_length, false,
http2::HD_CONTENT_LENGTH);
switch (http_status) {
case 400:
case 405:
case 413:
resp.fs.add_header_token(StringRef::from_lit("connection"),
StringRef::from_lit("close"), false,
resp.fs.add_header_token("connection"_sr, "close"_sr, false,
http2::HD_CONNECTION);
break;
}
@@ -289,8 +288,8 @@ int APIDownstreamConnection::error_method_not_allowed() {
p -= 2;
*p = '\0';
resp.fs.add_header_token(StringRef::from_lit("allow"),
StringRef{std::span{std::begin(iov), p}}, false, -1);
resp.fs.add_header_token("allow"_sr, StringRef{std::span{std::begin(iov), p}},
false, -1);
return send_reply(405, APIStatusCode::FAILURE);
}
@@ -436,9 +435,8 @@ int APIDownstreamConnection::handle_configrevision() {
// "configRevision": N
// }
auto data = concat_string_ref(
balloc, StringRef::from_lit(R"(,"data":{"configRevision":)"),
util::make_string_ref_uint(balloc, config->config_revision),
StringRef::from_lit("}"));
balloc, R"(,"data":{"configRevision":)"_sr,
util::make_string_ref_uint(balloc, config->config_revision), "}"_sr);
send_reply(200, APIStatusCode::SUCCESS, data);

View File

@@ -535,7 +535,7 @@ void ClientHandler::setup_upstream_io_callback() {
// upgraded to HTTP/2 through HTTP Upgrade or direct HTTP/2
// connection.
upstream_ = std::make_unique<HttpsUpstream>(this);
alpn_ = StringRef::from_lit("http/1.1");
alpn_ = "http/1.1"_sr;
read_ = &ClientHandler::read_clear;
write_ = &ClientHandler::write_clear;
on_read_ = &ClientHandler::upstream_http1_connhd_read;
@@ -629,7 +629,7 @@ int ClientHandler::validate_next_proto() {
CLOG(INFO, this) << "No protocol negotiated. Fallback to HTTP/1.1";
}
proto = StringRef::from_lit("http/1.1");
proto = "http/1.1"_sr;
}
if (!tls::in_proto_list(get_config()->tls.alpn_list, proto)) {
@@ -657,9 +657,9 @@ int ClientHandler::validate_next_proto() {
return 0;
}
if (proto == StringRef::from_lit("http/1.1")) {
if (proto == "http/1.1"_sr) {
upstream_ = std::make_unique<HttpsUpstream>(this);
alpn_ = StringRef::from_lit("http/1.1");
alpn_ = "http/1.1"_sr;
// At this point, input buffer is already filled with some bytes.
// The read callback is not called until new data come. So consume
@@ -1146,7 +1146,7 @@ SSL *ClientHandler::get_ssl() const { return conn_.tls.ssl; }
void ClientHandler::direct_http2_upgrade() {
upstream_ = std::make_unique<Http2Upstream>(this);
alpn_ = StringRef::from_lit(NGHTTP2_CLEARTEXT_PROTO_VERSION_ID);
alpn_ = NGHTTP2_CLEARTEXT_PROTO_VERSION_ID ""_sr;
on_read_ = &ClientHandler::upstream_read;
write_ = &ClientHandler::write_clear;
}
@@ -1171,17 +1171,16 @@ int ClientHandler::perform_http2_upgrade(HttpsUpstream *http) {
upstream_.release();
// TODO We might get other version id in HTTP2-settings, if we
// support aliasing for h2, but we just use library default for now.
alpn_ = StringRef::from_lit(NGHTTP2_CLEARTEXT_PROTO_VERSION_ID);
alpn_ = NGHTTP2_CLEARTEXT_PROTO_VERSION_ID ""_sr;
on_read_ = &ClientHandler::upstream_http2_connhd_read;
write_ = &ClientHandler::write_clear;
input->remove(*output, input->rleft());
constexpr auto res =
StringRef::from_lit("HTTP/1.1 101 Switching Protocols\r\n"
"Connection: Upgrade\r\n"
"Upgrade: " NGHTTP2_CLEARTEXT_PROTO_VERSION_ID "\r\n"
"\r\n");
constexpr auto res = "HTTP/1.1 101 Switching Protocols\r\n"
"Connection: Upgrade\r\n"
"Upgrade: " NGHTTP2_CLEARTEXT_PROTO_VERSION_ID "\r\n"
"\r\n"_sr;
output->append(res);
upstream_ = std::move(upstream);
@@ -1194,9 +1193,9 @@ bool ClientHandler::get_http2_upgrade_allowed() const { return !conn_.tls.ssl; }
StringRef ClientHandler::get_upstream_scheme() const {
if (conn_.tls.ssl) {
return StringRef::from_lit("https");
return "https"_sr;
} else {
return StringRef::from_lit("http");
return "http"_sr;
}
}
@@ -1340,7 +1339,7 @@ int ClientHandler::proxy_protocol_read() {
--end;
constexpr auto HEADER = StringRef::from_lit("PROXY ");
constexpr auto HEADER = "PROXY "_sr;
if (static_cast<size_t>(end - rb_.pos()) < HEADER.size()) {
if (LOG_ENABLED(INFO)) {

View File

@@ -76,7 +76,7 @@ namespace {
Config *config;
} // namespace
constexpr auto SHRPX_UNIX_PATH_PREFIX = StringRef::from_lit("unix:");
constexpr auto SHRPX_UNIX_PATH_PREFIX = "unix:"_sr;
const Config *get_config() { return config; }
@@ -1103,13 +1103,13 @@ int parse_downstream_params(DownstreamParams &out,
out.mruby = valstr;
} else if (util::istarts_with_l(param, "read-timeout=")) {
if (parse_downstream_param_duration(
out.read_timeout, StringRef::from_lit("read-timeout"),
out.read_timeout, "read-timeout"_sr,
StringRef{first + str_size("read-timeout="), end}) == -1) {
return -1;
}
} else if (util::istarts_with_l(param, "write-timeout=")) {
if (parse_downstream_param_duration(
out.write_timeout, StringRef::from_lit("write-timeout"),
out.write_timeout, "write-timeout"_sr,
StringRef{first + str_size("write-timeout="), end}) == -1) {
return -1;
}
@@ -1444,7 +1444,7 @@ int parse_error_page(std::vector<ErrorPage> &error_pages, const StringRef &opt,
auto codestr = StringRef{std::begin(optarg), eq};
unsigned int code;
if (codestr == StringRef::from_lit("*")) {
if (codestr == "*"_sr) {
code = 0;
} else {
auto n = util::parse_uint(codestr);
@@ -3738,7 +3738,7 @@ int parse_config(Config *config, int optid, const StringRef &opt,
if (optarg[0] == '_') {
fwdconf.by_obfuscated = make_string_ref(config->balloc, optarg);
} else {
fwdconf.by_obfuscated = StringRef::from_lit("");
fwdconf.by_obfuscated = ""_sr;
}
break;
case SHRPX_OPTID_FORWARDED_FOR:
@@ -4262,49 +4262,49 @@ int load_config(Config *config, const char *filename,
StringRef str_syslog_facility(int facility) {
switch (facility) {
case (LOG_AUTH):
return StringRef::from_lit("auth");
return "auth"_sr;
#ifdef LOG_AUTHPRIV
case (LOG_AUTHPRIV):
return StringRef::from_lit("authpriv");
return "authpriv"_sr;
#endif // LOG_AUTHPRIV
case (LOG_CRON):
return StringRef::from_lit("cron");
return "cron"_sr;
case (LOG_DAEMON):
return StringRef::from_lit("daemon");
return "daemon"_sr;
#ifdef LOG_FTP
case (LOG_FTP):
return StringRef::from_lit("ftp");
return "ftp"_sr;
#endif // LOG_FTP
case (LOG_KERN):
return StringRef::from_lit("kern");
return "kern"_sr;
case (LOG_LOCAL0):
return StringRef::from_lit("local0");
return "local0"_sr;
case (LOG_LOCAL1):
return StringRef::from_lit("local1");
return "local1"_sr;
case (LOG_LOCAL2):
return StringRef::from_lit("local2");
return "local2"_sr;
case (LOG_LOCAL3):
return StringRef::from_lit("local3");
return "local3"_sr;
case (LOG_LOCAL4):
return StringRef::from_lit("local4");
return "local4"_sr;
case (LOG_LOCAL5):
return StringRef::from_lit("local5");
return "local5"_sr;
case (LOG_LOCAL6):
return StringRef::from_lit("local6");
return "local6"_sr;
case (LOG_LOCAL7):
return StringRef::from_lit("local7");
return "local7"_sr;
case (LOG_LPR):
return StringRef::from_lit("lpr");
return "lpr"_sr;
case (LOG_MAIL):
return StringRef::from_lit("mail");
return "mail"_sr;
case (LOG_SYSLOG):
return StringRef::from_lit("syslog");
return "syslog"_sr;
case (LOG_USER):
return StringRef::from_lit("user");
return "user"_sr;
case (LOG_UUCP):
return StringRef::from_lit("uucp");
return "uucp"_sr;
default:
return StringRef::from_lit("(unknown)");
return "(unknown)"_sr;
}
}
@@ -4399,15 +4399,15 @@ int int_syslog_facility(const StringRef &strfacility) {
StringRef strproto(Proto proto) {
switch (proto) {
case Proto::NONE:
return StringRef::from_lit("none");
return "none"_sr;
case Proto::HTTP1:
return StringRef::from_lit("http/1.1");
return "http/1.1"_sr;
case Proto::HTTP2:
return StringRef::from_lit("h2");
return "h2"_sr;
case Proto::HTTP3:
return StringRef::from_lit("h3");
return "h3"_sr;
case Proto::MEMCACHED:
return StringRef::from_lit("memcached");
return "memcached"_sr;
}
// gcc needs this.
@@ -4467,13 +4467,13 @@ int configure_downstream_group(Config *config, bool http2_proxy,
if (addr_groups.empty()) {
DownstreamAddrConfig addr{};
addr.host = StringRef::from_lit(DEFAULT_DOWNSTREAM_HOST);
addr.host = DEFAULT_DOWNSTREAM_HOST;
addr.port = DEFAULT_DOWNSTREAM_PORT;
addr.proto = Proto::HTTP1;
addr.weight = 1;
addr.group_weight = 1;
DownstreamAddrGroupConfig g(StringRef::from_lit("/"));
DownstreamAddrGroupConfig g("/"_sr);
g.addrs.push_back(std::move(addr));
router.add_route(g.pattern, addr_groups.size());
addr_groups.push_back(std::move(g));
@@ -4497,7 +4497,7 @@ int configure_downstream_group(Config *config, bool http2_proxy,
ssize_t catch_all_group = -1;
for (size_t i = 0; i < addr_groups.size(); ++i) {
auto &g = addr_groups[i];
if (g.pattern == StringRef::from_lit("/")) {
if (g.pattern == "/"_sr) {
catch_all_group = i;
}
if (LOG_ENABLED(INFO)) {
@@ -4569,7 +4569,7 @@ int configure_downstream_group(Config *config, bool http2_proxy,
// for AF_UNIX socket, we use "localhost" as host for backend
// hostport. This is used as Host header field to backend and
// not going to be passed to any syscalls.
addr.hostport = StringRef::from_lit("localhost");
addr.hostport = "localhost"_sr;
auto path = addr.host.data();
auto pathlen = addr.host.size();

View File

@@ -75,348 +75,289 @@ class CertLookupTree;
} // namespace tls
constexpr auto SHRPX_OPT_PRIVATE_KEY_FILE =
StringRef::from_lit("private-key-file");
constexpr auto SHRPX_OPT_PRIVATE_KEY_PASSWD_FILE =
StringRef::from_lit("private-key-passwd-file");
constexpr auto SHRPX_OPT_CERTIFICATE_FILE =
StringRef::from_lit("certificate-file");
constexpr auto SHRPX_OPT_DH_PARAM_FILE = StringRef::from_lit("dh-param-file");
constexpr auto SHRPX_OPT_SUBCERT = StringRef::from_lit("subcert");
constexpr auto SHRPX_OPT_BACKEND = StringRef::from_lit("backend");
constexpr auto SHRPX_OPT_FRONTEND = StringRef::from_lit("frontend");
constexpr auto SHRPX_OPT_WORKERS = StringRef::from_lit("workers");
constexpr auto SHRPX_OPT_PRIVATE_KEY_FILE = "private-key-file"_sr;
constexpr auto SHRPX_OPT_PRIVATE_KEY_PASSWD_FILE = "private-key-passwd-file"_sr;
constexpr auto SHRPX_OPT_CERTIFICATE_FILE = "certificate-file"_sr;
constexpr auto SHRPX_OPT_DH_PARAM_FILE = "dh-param-file"_sr;
constexpr auto SHRPX_OPT_SUBCERT = "subcert"_sr;
constexpr auto SHRPX_OPT_BACKEND = "backend"_sr;
constexpr auto SHRPX_OPT_FRONTEND = "frontend"_sr;
constexpr auto SHRPX_OPT_WORKERS = "workers"_sr;
constexpr auto SHRPX_OPT_HTTP2_MAX_CONCURRENT_STREAMS =
StringRef::from_lit("http2-max-concurrent-streams");
constexpr auto SHRPX_OPT_LOG_LEVEL = StringRef::from_lit("log-level");
constexpr auto SHRPX_OPT_DAEMON = StringRef::from_lit("daemon");
constexpr auto SHRPX_OPT_HTTP2_PROXY = StringRef::from_lit("http2-proxy");
constexpr auto SHRPX_OPT_HTTP2_BRIDGE = StringRef::from_lit("http2-bridge");
constexpr auto SHRPX_OPT_CLIENT_PROXY = StringRef::from_lit("client-proxy");
constexpr auto SHRPX_OPT_ADD_X_FORWARDED_FOR =
StringRef::from_lit("add-x-forwarded-for");
"http2-max-concurrent-streams"_sr;
constexpr auto SHRPX_OPT_LOG_LEVEL = "log-level"_sr;
constexpr auto SHRPX_OPT_DAEMON = "daemon"_sr;
constexpr auto SHRPX_OPT_HTTP2_PROXY = "http2-proxy"_sr;
constexpr auto SHRPX_OPT_HTTP2_BRIDGE = "http2-bridge"_sr;
constexpr auto SHRPX_OPT_CLIENT_PROXY = "client-proxy"_sr;
constexpr auto SHRPX_OPT_ADD_X_FORWARDED_FOR = "add-x-forwarded-for"_sr;
constexpr auto SHRPX_OPT_STRIP_INCOMING_X_FORWARDED_FOR =
StringRef::from_lit("strip-incoming-x-forwarded-for");
constexpr auto SHRPX_OPT_NO_VIA = StringRef::from_lit("no-via");
"strip-incoming-x-forwarded-for"_sr;
constexpr auto SHRPX_OPT_NO_VIA = "no-via"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_READ_TIMEOUT =
StringRef::from_lit("frontend-http2-read-timeout");
constexpr auto SHRPX_OPT_FRONTEND_READ_TIMEOUT =
StringRef::from_lit("frontend-read-timeout");
constexpr auto SHRPX_OPT_FRONTEND_WRITE_TIMEOUT =
StringRef::from_lit("frontend-write-timeout");
constexpr auto SHRPX_OPT_BACKEND_READ_TIMEOUT =
StringRef::from_lit("backend-read-timeout");
constexpr auto SHRPX_OPT_BACKEND_WRITE_TIMEOUT =
StringRef::from_lit("backend-write-timeout");
constexpr auto SHRPX_OPT_STREAM_READ_TIMEOUT =
StringRef::from_lit("stream-read-timeout");
constexpr auto SHRPX_OPT_STREAM_WRITE_TIMEOUT =
StringRef::from_lit("stream-write-timeout");
constexpr auto SHRPX_OPT_ACCESSLOG_FILE = StringRef::from_lit("accesslog-file");
constexpr auto SHRPX_OPT_ACCESSLOG_SYSLOG =
StringRef::from_lit("accesslog-syslog");
constexpr auto SHRPX_OPT_ACCESSLOG_FORMAT =
StringRef::from_lit("accesslog-format");
constexpr auto SHRPX_OPT_ERRORLOG_FILE = StringRef::from_lit("errorlog-file");
constexpr auto SHRPX_OPT_ERRORLOG_SYSLOG =
StringRef::from_lit("errorlog-syslog");
"frontend-http2-read-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_READ_TIMEOUT = "frontend-read-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_WRITE_TIMEOUT = "frontend-write-timeout"_sr;
constexpr auto SHRPX_OPT_BACKEND_READ_TIMEOUT = "backend-read-timeout"_sr;
constexpr auto SHRPX_OPT_BACKEND_WRITE_TIMEOUT = "backend-write-timeout"_sr;
constexpr auto SHRPX_OPT_STREAM_READ_TIMEOUT = "stream-read-timeout"_sr;
constexpr auto SHRPX_OPT_STREAM_WRITE_TIMEOUT = "stream-write-timeout"_sr;
constexpr auto SHRPX_OPT_ACCESSLOG_FILE = "accesslog-file"_sr;
constexpr auto SHRPX_OPT_ACCESSLOG_SYSLOG = "accesslog-syslog"_sr;
constexpr auto SHRPX_OPT_ACCESSLOG_FORMAT = "accesslog-format"_sr;
constexpr auto SHRPX_OPT_ERRORLOG_FILE = "errorlog-file"_sr;
constexpr auto SHRPX_OPT_ERRORLOG_SYSLOG = "errorlog-syslog"_sr;
constexpr auto SHRPX_OPT_BACKEND_KEEP_ALIVE_TIMEOUT =
StringRef::from_lit("backend-keep-alive-timeout");
"backend-keep-alive-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_WINDOW_BITS =
StringRef::from_lit("frontend-http2-window-bits");
"frontend-http2-window-bits"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_WINDOW_BITS =
StringRef::from_lit("backend-http2-window-bits");
"backend-http2-window-bits"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_CONNECTION_WINDOW_BITS =
StringRef::from_lit("frontend-http2-connection-window-bits");
"frontend-http2-connection-window-bits"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTION_WINDOW_BITS =
StringRef::from_lit("backend-http2-connection-window-bits");
constexpr auto SHRPX_OPT_FRONTEND_NO_TLS =
StringRef::from_lit("frontend-no-tls");
constexpr auto SHRPX_OPT_BACKEND_NO_TLS = StringRef::from_lit("backend-no-tls");
constexpr auto SHRPX_OPT_BACKEND_TLS_SNI_FIELD =
StringRef::from_lit("backend-tls-sni-field");
constexpr auto SHRPX_OPT_PID_FILE = StringRef::from_lit("pid-file");
constexpr auto SHRPX_OPT_USER = StringRef::from_lit("user");
constexpr auto SHRPX_OPT_SYSLOG_FACILITY =
StringRef::from_lit("syslog-facility");
constexpr auto SHRPX_OPT_BACKLOG = StringRef::from_lit("backlog");
constexpr auto SHRPX_OPT_CIPHERS = StringRef::from_lit("ciphers");
constexpr auto SHRPX_OPT_CLIENT = StringRef::from_lit("client");
constexpr auto SHRPX_OPT_INSECURE = StringRef::from_lit("insecure");
constexpr auto SHRPX_OPT_CACERT = StringRef::from_lit("cacert");
constexpr auto SHRPX_OPT_BACKEND_IPV4 = StringRef::from_lit("backend-ipv4");
constexpr auto SHRPX_OPT_BACKEND_IPV6 = StringRef::from_lit("backend-ipv6");
constexpr auto SHRPX_OPT_BACKEND_HTTP_PROXY_URI =
StringRef::from_lit("backend-http-proxy-uri");
constexpr auto SHRPX_OPT_READ_RATE = StringRef::from_lit("read-rate");
constexpr auto SHRPX_OPT_READ_BURST = StringRef::from_lit("read-burst");
constexpr auto SHRPX_OPT_WRITE_RATE = StringRef::from_lit("write-rate");
constexpr auto SHRPX_OPT_WRITE_BURST = StringRef::from_lit("write-burst");
constexpr auto SHRPX_OPT_WORKER_READ_RATE =
StringRef::from_lit("worker-read-rate");
constexpr auto SHRPX_OPT_WORKER_READ_BURST =
StringRef::from_lit("worker-read-burst");
constexpr auto SHRPX_OPT_WORKER_WRITE_RATE =
StringRef::from_lit("worker-write-rate");
constexpr auto SHRPX_OPT_WORKER_WRITE_BURST =
StringRef::from_lit("worker-write-burst");
constexpr auto SHRPX_OPT_NPN_LIST = StringRef::from_lit("npn-list");
constexpr auto SHRPX_OPT_TLS_PROTO_LIST = StringRef::from_lit("tls-proto-list");
constexpr auto SHRPX_OPT_VERIFY_CLIENT = StringRef::from_lit("verify-client");
constexpr auto SHRPX_OPT_VERIFY_CLIENT_CACERT =
StringRef::from_lit("verify-client-cacert");
constexpr auto SHRPX_OPT_CLIENT_PRIVATE_KEY_FILE =
StringRef::from_lit("client-private-key-file");
constexpr auto SHRPX_OPT_CLIENT_CERT_FILE =
StringRef::from_lit("client-cert-file");
"backend-http2-connection-window-bits"_sr;
constexpr auto SHRPX_OPT_FRONTEND_NO_TLS = "frontend-no-tls"_sr;
constexpr auto SHRPX_OPT_BACKEND_NO_TLS = "backend-no-tls"_sr;
constexpr auto SHRPX_OPT_BACKEND_TLS_SNI_FIELD = "backend-tls-sni-field"_sr;
constexpr auto SHRPX_OPT_PID_FILE = "pid-file"_sr;
constexpr auto SHRPX_OPT_USER = "user"_sr;
constexpr auto SHRPX_OPT_SYSLOG_FACILITY = "syslog-facility"_sr;
constexpr auto SHRPX_OPT_BACKLOG = "backlog"_sr;
constexpr auto SHRPX_OPT_CIPHERS = "ciphers"_sr;
constexpr auto SHRPX_OPT_CLIENT = "client"_sr;
constexpr auto SHRPX_OPT_INSECURE = "insecure"_sr;
constexpr auto SHRPX_OPT_CACERT = "cacert"_sr;
constexpr auto SHRPX_OPT_BACKEND_IPV4 = "backend-ipv4"_sr;
constexpr auto SHRPX_OPT_BACKEND_IPV6 = "backend-ipv6"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP_PROXY_URI = "backend-http-proxy-uri"_sr;
constexpr auto SHRPX_OPT_READ_RATE = "read-rate"_sr;
constexpr auto SHRPX_OPT_READ_BURST = "read-burst"_sr;
constexpr auto SHRPX_OPT_WRITE_RATE = "write-rate"_sr;
constexpr auto SHRPX_OPT_WRITE_BURST = "write-burst"_sr;
constexpr auto SHRPX_OPT_WORKER_READ_RATE = "worker-read-rate"_sr;
constexpr auto SHRPX_OPT_WORKER_READ_BURST = "worker-read-burst"_sr;
constexpr auto SHRPX_OPT_WORKER_WRITE_RATE = "worker-write-rate"_sr;
constexpr auto SHRPX_OPT_WORKER_WRITE_BURST = "worker-write-burst"_sr;
constexpr auto SHRPX_OPT_NPN_LIST = "npn-list"_sr;
constexpr auto SHRPX_OPT_TLS_PROTO_LIST = "tls-proto-list"_sr;
constexpr auto SHRPX_OPT_VERIFY_CLIENT = "verify-client"_sr;
constexpr auto SHRPX_OPT_VERIFY_CLIENT_CACERT = "verify-client-cacert"_sr;
constexpr auto SHRPX_OPT_CLIENT_PRIVATE_KEY_FILE = "client-private-key-file"_sr;
constexpr auto SHRPX_OPT_CLIENT_CERT_FILE = "client-cert-file"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DUMP_REQUEST_HEADER =
StringRef::from_lit("frontend-http2-dump-request-header");
"frontend-http2-dump-request-header"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DUMP_RESPONSE_HEADER =
StringRef::from_lit("frontend-http2-dump-response-header");
"frontend-http2-dump-response-header"_sr;
constexpr auto SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING =
StringRef::from_lit("http2-no-cookie-crumbling");
constexpr auto SHRPX_OPT_FRONTEND_FRAME_DEBUG =
StringRef::from_lit("frontend-frame-debug");
constexpr auto SHRPX_OPT_PADDING = StringRef::from_lit("padding");
constexpr auto SHRPX_OPT_ALTSVC = StringRef::from_lit("altsvc");
constexpr auto SHRPX_OPT_ADD_REQUEST_HEADER =
StringRef::from_lit("add-request-header");
constexpr auto SHRPX_OPT_ADD_RESPONSE_HEADER =
StringRef::from_lit("add-response-header");
"http2-no-cookie-crumbling"_sr;
constexpr auto SHRPX_OPT_FRONTEND_FRAME_DEBUG = "frontend-frame-debug"_sr;
constexpr auto SHRPX_OPT_PADDING = "padding"_sr;
constexpr auto SHRPX_OPT_ALTSVC = "altsvc"_sr;
constexpr auto SHRPX_OPT_ADD_REQUEST_HEADER = "add-request-header"_sr;
constexpr auto SHRPX_OPT_ADD_RESPONSE_HEADER = "add-response-header"_sr;
constexpr auto SHRPX_OPT_WORKER_FRONTEND_CONNECTIONS =
StringRef::from_lit("worker-frontend-connections");
constexpr auto SHRPX_OPT_NO_LOCATION_REWRITE =
StringRef::from_lit("no-location-rewrite");
constexpr auto SHRPX_OPT_NO_HOST_REWRITE =
StringRef::from_lit("no-host-rewrite");
"worker-frontend-connections"_sr;
constexpr auto SHRPX_OPT_NO_LOCATION_REWRITE = "no-location-rewrite"_sr;
constexpr auto SHRPX_OPT_NO_HOST_REWRITE = "no-host-rewrite"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP1_CONNECTIONS_PER_HOST =
StringRef::from_lit("backend-http1-connections-per-host");
"backend-http1-connections-per-host"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP1_CONNECTIONS_PER_FRONTEND =
StringRef::from_lit("backend-http1-connections-per-frontend");
"backend-http1-connections-per-frontend"_sr;
constexpr auto SHRPX_OPT_LISTENER_DISABLE_TIMEOUT =
StringRef::from_lit("listener-disable-timeout");
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_FILE =
StringRef::from_lit("tls-ticket-key-file");
constexpr auto SHRPX_OPT_RLIMIT_NOFILE = StringRef::from_lit("rlimit-nofile");
constexpr auto SHRPX_OPT_BACKEND_REQUEST_BUFFER =
StringRef::from_lit("backend-request-buffer");
constexpr auto SHRPX_OPT_BACKEND_RESPONSE_BUFFER =
StringRef::from_lit("backend-response-buffer");
constexpr auto SHRPX_OPT_NO_SERVER_PUSH = StringRef::from_lit("no-server-push");
"listener-disable-timeout"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_FILE = "tls-ticket-key-file"_sr;
constexpr auto SHRPX_OPT_RLIMIT_NOFILE = "rlimit-nofile"_sr;
constexpr auto SHRPX_OPT_BACKEND_REQUEST_BUFFER = "backend-request-buffer"_sr;
constexpr auto SHRPX_OPT_BACKEND_RESPONSE_BUFFER = "backend-response-buffer"_sr;
constexpr auto SHRPX_OPT_NO_SERVER_PUSH = "no-server-push"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTIONS_PER_WORKER =
StringRef::from_lit("backend-http2-connections-per-worker");
"backend-http2-connections-per-worker"_sr;
constexpr auto SHRPX_OPT_FETCH_OCSP_RESPONSE_FILE =
StringRef::from_lit("fetch-ocsp-response-file");
constexpr auto SHRPX_OPT_OCSP_UPDATE_INTERVAL =
StringRef::from_lit("ocsp-update-interval");
constexpr auto SHRPX_OPT_NO_OCSP = StringRef::from_lit("no-ocsp");
constexpr auto SHRPX_OPT_HEADER_FIELD_BUFFER =
StringRef::from_lit("header-field-buffer");
constexpr auto SHRPX_OPT_MAX_HEADER_FIELDS =
StringRef::from_lit("max-header-fields");
constexpr auto SHRPX_OPT_INCLUDE = StringRef::from_lit("include");
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_CIPHER =
StringRef::from_lit("tls-ticket-key-cipher");
constexpr auto SHRPX_OPT_HOST_REWRITE = StringRef::from_lit("host-rewrite");
"fetch-ocsp-response-file"_sr;
constexpr auto SHRPX_OPT_OCSP_UPDATE_INTERVAL = "ocsp-update-interval"_sr;
constexpr auto SHRPX_OPT_NO_OCSP = "no-ocsp"_sr;
constexpr auto SHRPX_OPT_HEADER_FIELD_BUFFER = "header-field-buffer"_sr;
constexpr auto SHRPX_OPT_MAX_HEADER_FIELDS = "max-header-fields"_sr;
constexpr auto SHRPX_OPT_INCLUDE = "include"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_CIPHER = "tls-ticket-key-cipher"_sr;
constexpr auto SHRPX_OPT_HOST_REWRITE = "host-rewrite"_sr;
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED =
StringRef::from_lit("tls-session-cache-memcached");
"tls-session-cache-memcached"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED =
StringRef::from_lit("tls-ticket-key-memcached");
"tls-ticket-key-memcached"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_INTERVAL =
StringRef::from_lit("tls-ticket-key-memcached-interval");
"tls-ticket-key-memcached-interval"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_MAX_RETRY =
StringRef::from_lit("tls-ticket-key-memcached-max-retry");
"tls-ticket-key-memcached-max-retry"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_MAX_FAIL =
StringRef::from_lit("tls-ticket-key-memcached-max-fail");
constexpr auto SHRPX_OPT_MRUBY_FILE = StringRef::from_lit("mruby-file");
constexpr auto SHRPX_OPT_ACCEPT_PROXY_PROTOCOL =
StringRef::from_lit("accept-proxy-protocol");
constexpr auto SHRPX_OPT_FASTOPEN = StringRef::from_lit("fastopen");
"tls-ticket-key-memcached-max-fail"_sr;
constexpr auto SHRPX_OPT_MRUBY_FILE = "mruby-file"_sr;
constexpr auto SHRPX_OPT_ACCEPT_PROXY_PROTOCOL = "accept-proxy-protocol"_sr;
constexpr auto SHRPX_OPT_FASTOPEN = "fastopen"_sr;
constexpr auto SHRPX_OPT_TLS_DYN_REC_WARMUP_THRESHOLD =
StringRef::from_lit("tls-dyn-rec-warmup-threshold");
"tls-dyn-rec-warmup-threshold"_sr;
constexpr auto SHRPX_OPT_TLS_DYN_REC_IDLE_TIMEOUT =
StringRef::from_lit("tls-dyn-rec-idle-timeout");
constexpr auto SHRPX_OPT_ADD_FORWARDED = StringRef::from_lit("add-forwarded");
"tls-dyn-rec-idle-timeout"_sr;
constexpr auto SHRPX_OPT_ADD_FORWARDED = "add-forwarded"_sr;
constexpr auto SHRPX_OPT_STRIP_INCOMING_FORWARDED =
StringRef::from_lit("strip-incoming-forwarded");
constexpr auto SHRPX_OPT_FORWARDED_BY = StringRef::from_lit("forwarded-by");
constexpr auto SHRPX_OPT_FORWARDED_FOR = StringRef::from_lit("forwarded-for");
"strip-incoming-forwarded"_sr;
constexpr auto SHRPX_OPT_FORWARDED_BY = "forwarded-by"_sr;
constexpr auto SHRPX_OPT_FORWARDED_FOR = "forwarded-for"_sr;
constexpr auto SHRPX_OPT_REQUEST_HEADER_FIELD_BUFFER =
StringRef::from_lit("request-header-field-buffer");
"request-header-field-buffer"_sr;
constexpr auto SHRPX_OPT_MAX_REQUEST_HEADER_FIELDS =
StringRef::from_lit("max-request-header-fields");
"max-request-header-fields"_sr;
constexpr auto SHRPX_OPT_RESPONSE_HEADER_FIELD_BUFFER =
StringRef::from_lit("response-header-field-buffer");
"response-header-field-buffer"_sr;
constexpr auto SHRPX_OPT_MAX_RESPONSE_HEADER_FIELDS =
StringRef::from_lit("max-response-header-fields");
"max-response-header-fields"_sr;
constexpr auto SHRPX_OPT_NO_HTTP2_CIPHER_BLOCK_LIST =
StringRef::from_lit("no-http2-cipher-block-list");
"no-http2-cipher-block-list"_sr;
constexpr auto SHRPX_OPT_NO_HTTP2_CIPHER_BLACK_LIST =
StringRef::from_lit("no-http2-cipher-black-list");
constexpr auto SHRPX_OPT_BACKEND_HTTP1_TLS =
StringRef::from_lit("backend-http1-tls");
"no-http2-cipher-black-list"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP1_TLS = "backend-http1-tls"_sr;
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_TLS =
StringRef::from_lit("tls-session-cache-memcached-tls");
"tls-session-cache-memcached-tls"_sr;
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_CERT_FILE =
StringRef::from_lit("tls-session-cache-memcached-cert-file");
"tls-session-cache-memcached-cert-file"_sr;
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_PRIVATE_KEY_FILE =
StringRef::from_lit("tls-session-cache-memcached-private-key-file");
"tls-session-cache-memcached-private-key-file"_sr;
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_ADDRESS_FAMILY =
StringRef::from_lit("tls-session-cache-memcached-address-family");
"tls-session-cache-memcached-address-family"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_TLS =
StringRef::from_lit("tls-ticket-key-memcached-tls");
"tls-ticket-key-memcached-tls"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_CERT_FILE =
StringRef::from_lit("tls-ticket-key-memcached-cert-file");
"tls-ticket-key-memcached-cert-file"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_PRIVATE_KEY_FILE =
StringRef::from_lit("tls-ticket-key-memcached-private-key-file");
"tls-ticket-key-memcached-private-key-file"_sr;
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_ADDRESS_FAMILY =
StringRef::from_lit("tls-ticket-key-memcached-address-family");
constexpr auto SHRPX_OPT_BACKEND_ADDRESS_FAMILY =
StringRef::from_lit("backend-address-family");
"tls-ticket-key-memcached-address-family"_sr;
constexpr auto SHRPX_OPT_BACKEND_ADDRESS_FAMILY = "backend-address-family"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_MAX_CONCURRENT_STREAMS =
StringRef::from_lit("frontend-http2-max-concurrent-streams");
"frontend-http2-max-concurrent-streams"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_MAX_CONCURRENT_STREAMS =
StringRef::from_lit("backend-http2-max-concurrent-streams");
"backend-http2-max-concurrent-streams"_sr;
constexpr auto SHRPX_OPT_BACKEND_CONNECTIONS_PER_FRONTEND =
StringRef::from_lit("backend-connections-per-frontend");
constexpr auto SHRPX_OPT_BACKEND_TLS = StringRef::from_lit("backend-tls");
"backend-connections-per-frontend"_sr;
constexpr auto SHRPX_OPT_BACKEND_TLS = "backend-tls"_sr;
constexpr auto SHRPX_OPT_BACKEND_CONNECTIONS_PER_HOST =
StringRef::from_lit("backend-connections-per-host");
constexpr auto SHRPX_OPT_ERROR_PAGE = StringRef::from_lit("error-page");
constexpr auto SHRPX_OPT_NO_KQUEUE = StringRef::from_lit("no-kqueue");
"backend-connections-per-host"_sr;
constexpr auto SHRPX_OPT_ERROR_PAGE = "error-page"_sr;
constexpr auto SHRPX_OPT_NO_KQUEUE = "no-kqueue"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_SETTINGS_TIMEOUT =
StringRef::from_lit("frontend-http2-settings-timeout");
"frontend-http2-settings-timeout"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_SETTINGS_TIMEOUT =
StringRef::from_lit("backend-http2-settings-timeout");
constexpr auto SHRPX_OPT_API_MAX_REQUEST_BODY =
StringRef::from_lit("api-max-request-body");
constexpr auto SHRPX_OPT_BACKEND_MAX_BACKOFF =
StringRef::from_lit("backend-max-backoff");
constexpr auto SHRPX_OPT_SERVER_NAME = StringRef::from_lit("server-name");
constexpr auto SHRPX_OPT_NO_SERVER_REWRITE =
StringRef::from_lit("no-server-rewrite");
"backend-http2-settings-timeout"_sr;
constexpr auto SHRPX_OPT_API_MAX_REQUEST_BODY = "api-max-request-body"_sr;
constexpr auto SHRPX_OPT_BACKEND_MAX_BACKOFF = "backend-max-backoff"_sr;
constexpr auto SHRPX_OPT_SERVER_NAME = "server-name"_sr;
constexpr auto SHRPX_OPT_NO_SERVER_REWRITE = "no-server-rewrite"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WRITE_BUFFER_SIZE =
StringRef::from_lit("frontend-http2-optimize-write-buffer-size");
"frontend-http2-optimize-write-buffer-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WINDOW_SIZE =
StringRef::from_lit("frontend-http2-optimize-window-size");
"frontend-http2-optimize-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_WINDOW_SIZE =
StringRef::from_lit("frontend-http2-window-size");
"frontend-http2-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_CONNECTION_WINDOW_SIZE =
StringRef::from_lit("frontend-http2-connection-window-size");
"frontend-http2-connection-window-size"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_WINDOW_SIZE =
StringRef::from_lit("backend-http2-window-size");
"backend-http2-window-size"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTION_WINDOW_SIZE =
StringRef::from_lit("backend-http2-connection-window-size");
"backend-http2-connection-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE =
StringRef::from_lit("frontend-http2-encoder-dynamic-table-size");
"frontend-http2-encoder-dynamic-table-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE =
StringRef::from_lit("frontend-http2-decoder-dynamic-table-size");
"frontend-http2-decoder-dynamic-table-size"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE =
StringRef::from_lit("backend-http2-encoder-dynamic-table-size");
"backend-http2-encoder-dynamic-table-size"_sr;
constexpr auto SHRPX_OPT_BACKEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE =
StringRef::from_lit("backend-http2-decoder-dynamic-table-size");
constexpr auto SHRPX_OPT_ECDH_CURVES = StringRef::from_lit("ecdh-curves");
constexpr auto SHRPX_OPT_TLS_SCT_DIR = StringRef::from_lit("tls-sct-dir");
constexpr auto SHRPX_OPT_BACKEND_CONNECT_TIMEOUT =
StringRef::from_lit("backend-connect-timeout");
constexpr auto SHRPX_OPT_DNS_CACHE_TIMEOUT =
StringRef::from_lit("dns-cache-timeout");
constexpr auto SHRPX_OPT_DNS_LOOKUP_TIMEOUT =
StringRef::from_lit("dns-lookup-timeout");
constexpr auto SHRPX_OPT_DNS_MAX_TRY = StringRef::from_lit("dns-max-try");
"backend-http2-decoder-dynamic-table-size"_sr;
constexpr auto SHRPX_OPT_ECDH_CURVES = "ecdh-curves"_sr;
constexpr auto SHRPX_OPT_TLS_SCT_DIR = "tls-sct-dir"_sr;
constexpr auto SHRPX_OPT_BACKEND_CONNECT_TIMEOUT = "backend-connect-timeout"_sr;
constexpr auto SHRPX_OPT_DNS_CACHE_TIMEOUT = "dns-cache-timeout"_sr;
constexpr auto SHRPX_OPT_DNS_LOOKUP_TIMEOUT = "dns-lookup-timeout"_sr;
constexpr auto SHRPX_OPT_DNS_MAX_TRY = "dns-max-try"_sr;
constexpr auto SHRPX_OPT_FRONTEND_KEEP_ALIVE_TIMEOUT =
StringRef::from_lit("frontend-keep-alive-timeout");
constexpr auto SHRPX_OPT_PSK_SECRETS = StringRef::from_lit("psk-secrets");
constexpr auto SHRPX_OPT_CLIENT_PSK_SECRETS =
StringRef::from_lit("client-psk-secrets");
"frontend-keep-alive-timeout"_sr;
constexpr auto SHRPX_OPT_PSK_SECRETS = "psk-secrets"_sr;
constexpr auto SHRPX_OPT_CLIENT_PSK_SECRETS = "client-psk-secrets"_sr;
constexpr auto SHRPX_OPT_CLIENT_NO_HTTP2_CIPHER_BLOCK_LIST =
StringRef::from_lit("client-no-http2-cipher-block-list");
"client-no-http2-cipher-block-list"_sr;
constexpr auto SHRPX_OPT_CLIENT_NO_HTTP2_CIPHER_BLACK_LIST =
StringRef::from_lit("client-no-http2-cipher-black-list");
constexpr auto SHRPX_OPT_CLIENT_CIPHERS = StringRef::from_lit("client-ciphers");
constexpr auto SHRPX_OPT_ACCESSLOG_WRITE_EARLY =
StringRef::from_lit("accesslog-write-early");
constexpr auto SHRPX_OPT_TLS_MIN_PROTO_VERSION =
StringRef::from_lit("tls-min-proto-version");
constexpr auto SHRPX_OPT_TLS_MAX_PROTO_VERSION =
StringRef::from_lit("tls-max-proto-version");
constexpr auto SHRPX_OPT_REDIRECT_HTTPS_PORT =
StringRef::from_lit("redirect-https-port");
constexpr auto SHRPX_OPT_FRONTEND_MAX_REQUESTS =
StringRef::from_lit("frontend-max-requests");
constexpr auto SHRPX_OPT_SINGLE_THREAD = StringRef::from_lit("single-thread");
constexpr auto SHRPX_OPT_SINGLE_PROCESS = StringRef::from_lit("single-process");
"client-no-http2-cipher-black-list"_sr;
constexpr auto SHRPX_OPT_CLIENT_CIPHERS = "client-ciphers"_sr;
constexpr auto SHRPX_OPT_ACCESSLOG_WRITE_EARLY = "accesslog-write-early"_sr;
constexpr auto SHRPX_OPT_TLS_MIN_PROTO_VERSION = "tls-min-proto-version"_sr;
constexpr auto SHRPX_OPT_TLS_MAX_PROTO_VERSION = "tls-max-proto-version"_sr;
constexpr auto SHRPX_OPT_REDIRECT_HTTPS_PORT = "redirect-https-port"_sr;
constexpr auto SHRPX_OPT_FRONTEND_MAX_REQUESTS = "frontend-max-requests"_sr;
constexpr auto SHRPX_OPT_SINGLE_THREAD = "single-thread"_sr;
constexpr auto SHRPX_OPT_SINGLE_PROCESS = "single-process"_sr;
constexpr auto SHRPX_OPT_NO_ADD_X_FORWARDED_PROTO =
StringRef::from_lit("no-add-x-forwarded-proto");
"no-add-x-forwarded-proto"_sr;
constexpr auto SHRPX_OPT_NO_STRIP_INCOMING_X_FORWARDED_PROTO =
StringRef::from_lit("no-strip-incoming-x-forwarded-proto");
constexpr auto SHRPX_OPT_OCSP_STARTUP = StringRef::from_lit("ocsp-startup");
constexpr auto SHRPX_OPT_NO_VERIFY_OCSP = StringRef::from_lit("no-verify-ocsp");
"no-strip-incoming-x-forwarded-proto"_sr;
constexpr auto SHRPX_OPT_OCSP_STARTUP = "ocsp-startup"_sr;
constexpr auto SHRPX_OPT_NO_VERIFY_OCSP = "no-verify-ocsp"_sr;
constexpr auto SHRPX_OPT_VERIFY_CLIENT_TOLERATE_EXPIRED =
StringRef::from_lit("verify-client-tolerate-expired");
"verify-client-tolerate-expired"_sr;
constexpr auto SHRPX_OPT_IGNORE_PER_PATTERN_MRUBY_ERROR =
StringRef::from_lit("ignore-per-pattern-mruby-error");
"ignore-per-pattern-mruby-error"_sr;
constexpr auto SHRPX_OPT_TLS_NO_POSTPONE_EARLY_DATA =
StringRef::from_lit("tls-no-postpone-early-data");
constexpr auto SHRPX_OPT_TLS_MAX_EARLY_DATA =
StringRef::from_lit("tls-max-early-data");
constexpr auto SHRPX_OPT_TLS13_CIPHERS = StringRef::from_lit("tls13-ciphers");
constexpr auto SHRPX_OPT_TLS13_CLIENT_CIPHERS =
StringRef::from_lit("tls13-client-ciphers");
"tls-no-postpone-early-data"_sr;
constexpr auto SHRPX_OPT_TLS_MAX_EARLY_DATA = "tls-max-early-data"_sr;
constexpr auto SHRPX_OPT_TLS13_CIPHERS = "tls13-ciphers"_sr;
constexpr auto SHRPX_OPT_TLS13_CLIENT_CIPHERS = "tls13-client-ciphers"_sr;
constexpr auto SHRPX_OPT_NO_STRIP_INCOMING_EARLY_DATA =
StringRef::from_lit("no-strip-incoming-early-data");
constexpr auto SHRPX_OPT_QUIC_BPF_PROGRAM_FILE =
StringRef::from_lit("quic-bpf-program-file");
constexpr auto SHRPX_OPT_NO_QUIC_BPF = StringRef::from_lit("no-quic-bpf");
constexpr auto SHRPX_OPT_HTTP2_ALTSVC = StringRef::from_lit("http2-altsvc");
"no-strip-incoming-early-data"_sr;
constexpr auto SHRPX_OPT_QUIC_BPF_PROGRAM_FILE = "quic-bpf-program-file"_sr;
constexpr auto SHRPX_OPT_NO_QUIC_BPF = "no-quic-bpf"_sr;
constexpr auto SHRPX_OPT_HTTP2_ALTSVC = "http2-altsvc"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_READ_TIMEOUT =
StringRef::from_lit("frontend-http3-read-timeout");
"frontend-http3-read-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_IDLE_TIMEOUT =
StringRef::from_lit("frontend-quic-idle-timeout");
constexpr auto SHRPX_OPT_FRONTEND_QUIC_DEBUG_LOG =
StringRef::from_lit("frontend-quic-debug-log");
"frontend-quic-idle-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_DEBUG_LOG = "frontend-quic-debug-log"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_WINDOW_SIZE =
StringRef::from_lit("frontend-http3-window-size");
"frontend-http3-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_CONNECTION_WINDOW_SIZE =
StringRef::from_lit("frontend-http3-connection-window-size");
"frontend-http3-connection-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_MAX_WINDOW_SIZE =
StringRef::from_lit("frontend-http3-max-window-size");
"frontend-http3-max-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_MAX_CONNECTION_WINDOW_SIZE =
StringRef::from_lit("frontend-http3-max-connection-window-size");
"frontend-http3-max-connection-window-size"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_MAX_CONCURRENT_STREAMS =
StringRef::from_lit("frontend-http3-max-concurrent-streams");
"frontend-http3-max-concurrent-streams"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_EARLY_DATA =
StringRef::from_lit("frontend-quic-early-data");
constexpr auto SHRPX_OPT_FRONTEND_QUIC_QLOG_DIR =
StringRef::from_lit("frontend-quic-qlog-dir");
"frontend-quic-early-data"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_QLOG_DIR = "frontend-quic-qlog-dir"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_REQUIRE_TOKEN =
StringRef::from_lit("frontend-quic-require-token");
"frontend-quic-require-token"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_CONGESTION_CONTROLLER =
StringRef::from_lit("frontend-quic-congestion-controller");
constexpr auto SHRPX_OPT_QUIC_SERVER_ID = StringRef::from_lit("quic-server-id");
"frontend-quic-congestion-controller"_sr;
constexpr auto SHRPX_OPT_QUIC_SERVER_ID = "quic-server-id"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_SECRET_FILE =
StringRef::from_lit("frontend-quic-secret-file");
constexpr auto SHRPX_OPT_RLIMIT_MEMLOCK = StringRef::from_lit("rlimit-memlock");
constexpr auto SHRPX_OPT_MAX_WORKER_PROCESSES =
StringRef::from_lit("max-worker-processes");
"frontend-quic-secret-file"_sr;
constexpr auto SHRPX_OPT_RLIMIT_MEMLOCK = "rlimit-memlock"_sr;
constexpr auto SHRPX_OPT_MAX_WORKER_PROCESSES = "max-worker-processes"_sr;
constexpr auto SHRPX_OPT_WORKER_PROCESS_GRACE_SHUTDOWN_PERIOD =
StringRef::from_lit("worker-process-grace-shutdown-period");
"worker-process-grace-shutdown-period"_sr;
constexpr auto SHRPX_OPT_FRONTEND_QUIC_INITIAL_RTT =
StringRef::from_lit("frontend-quic-initial-rtt");
constexpr auto SHRPX_OPT_REQUIRE_HTTP_SCHEME =
StringRef::from_lit("require-http-scheme");
constexpr auto SHRPX_OPT_TLS_KTLS = StringRef::from_lit("tls-ktls");
constexpr auto SHRPX_OPT_ALPN_LIST = StringRef::from_lit("alpn-list");
constexpr auto SHRPX_OPT_FRONTEND_HEADER_TIMEOUT =
StringRef::from_lit("frontend-header-timeout");
"frontend-quic-initial-rtt"_sr;
constexpr auto SHRPX_OPT_REQUIRE_HTTP_SCHEME = "require-http-scheme"_sr;
constexpr auto SHRPX_OPT_TLS_KTLS = "tls-ktls"_sr;
constexpr auto SHRPX_OPT_ALPN_LIST = "alpn-list"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HEADER_TIMEOUT = "frontend-header-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_IDLE_TIMEOUT =
StringRef::from_lit("frontend-http2-idle-timeout");
"frontend-http2-idle-timeout"_sr;
constexpr auto SHRPX_OPT_FRONTEND_HTTP3_IDLE_TIMEOUT =
StringRef::from_lit("frontend-http3-idle-timeout");
"frontend-http3-idle-timeout"_sr;
constexpr size_t SHRPX_OBFUSCATED_NODE_LENGTH = 8;
constexpr char DEFAULT_DOWNSTREAM_HOST[] = "127.0.0.1";
constexpr auto DEFAULT_DOWNSTREAM_HOST = "127.0.0.1"_sr;
constexpr int16_t DEFAULT_DOWNSTREAM_PORT = 80;
enum class Proto {

View File

@@ -56,32 +56,32 @@ const MunitSuite config_suite{
void test_shrpx_config_parse_header(void) {
BlockAllocator balloc(4096, 4096);
auto p = parse_header(balloc, StringRef::from_lit("a: b"));
auto p = parse_header(balloc, "a: b"_sr);
assert_stdsv_equal("a"sv, p.name);
assert_stdsv_equal("b"sv, p.value);
p = parse_header(balloc, StringRef::from_lit("a: b"));
p = parse_header(balloc, "a: b"_sr);
assert_stdsv_equal("a"sv, p.name);
assert_stdsv_equal("b"sv, p.value);
p = parse_header(balloc, StringRef::from_lit(":a: b"));
p = parse_header(balloc, ":a: b"_sr);
assert_true(p.name.empty());
p = parse_header(balloc, StringRef::from_lit("a: :b"));
p = parse_header(balloc, "a: :b"_sr);
assert_stdsv_equal("a"sv, p.name);
assert_stdsv_equal(":b"sv, p.value);
p = parse_header(balloc, StringRef::from_lit(": b"));
p = parse_header(balloc, ": b"_sr);
assert_true(p.name.empty());
p = parse_header(balloc, StringRef::from_lit("alpha: bravo charlie"));
p = parse_header(balloc, "alpha: bravo charlie"_sr);
assert_stdsv_equal("alpha", p.name);
assert_stdsv_equal("bravo charlie", p.value);
p = parse_header(balloc, StringRef::from_lit("a,: b"));
p = parse_header(balloc, "a,: b"_sr);
assert_true(p.name.empty());
p = parse_header(balloc, StringRef::from_lit("a: b\x0a"));
p = parse_header(balloc, "a: b\x0a"_sr);
assert_true(p.name.empty());
}
@@ -89,10 +89,9 @@ void test_shrpx_config_parse_log_format(void) {
BlockAllocator balloc(4096, 4096);
auto res = parse_log_format(
balloc, StringRef::from_lit(
R"($remote_addr - $remote_user [$time_local] )"
R"("$request" $status $body_bytes_sent )"
R"("${http_referer}" $http_host "$http_user_agent")"));
balloc, R"($remote_addr - $remote_user [$time_local] )"
R"("$request" $status $body_bytes_sent )"
R"("${http_referer}" $http_host "$http_user_agent")"_sr);
assert_size(16, ==, res.size());
assert_enum_class(LogFragmentType::REMOTE_ADDR, ==, res[0].type);
@@ -137,35 +136,35 @@ void test_shrpx_config_parse_log_format(void) {
assert_enum_class(LogFragmentType::LITERAL, ==, res[15].type);
assert_stdsv_equal("\""sv, res[15].value);
res = parse_log_format(balloc, StringRef::from_lit("$"));
res = parse_log_format(balloc, "$"_sr);
assert_size(1, ==, res.size());
assert_enum_class(LogFragmentType::LITERAL, ==, res[0].type);
assert_stdsv_equal("$"sv, res[0].value);
res = parse_log_format(balloc, StringRef::from_lit("${"));
res = parse_log_format(balloc, "${"_sr);
assert_size(1, ==, res.size());
assert_enum_class(LogFragmentType::LITERAL, ==, res[0].type);
assert_stdsv_equal("${"sv, res[0].value);
res = parse_log_format(balloc, StringRef::from_lit("${a"));
res = parse_log_format(balloc, "${a"_sr);
assert_size(1, ==, res.size());
assert_enum_class(LogFragmentType::LITERAL, ==, res[0].type);
assert_stdsv_equal("${a"sv, res[0].value);
res = parse_log_format(balloc, StringRef::from_lit("${a "));
res = parse_log_format(balloc, "${a "_sr);
assert_size(1, ==, res.size());
assert_enum_class(LogFragmentType::LITERAL, ==, res[0].type);
assert_stdsv_equal("${a "sv, res[0].value);
res = parse_log_format(balloc, StringRef::from_lit("$$remote_addr"));
res = parse_log_format(balloc, "$$remote_addr"_sr);
assert_size(2, ==, res.size());

View File

@@ -891,8 +891,7 @@ void Downstream::inspect_http1_request() {
auto expect = req_.fs.header(http2::HD_EXPECT);
expect_100_continue_ =
expect &&
util::strieq(expect->value, StringRef::from_lit("100-continue"));
expect && util::strieq(expect->value, "100-continue"_sr);
}
void Downstream::inspect_http1_response() {

View File

@@ -54,40 +54,35 @@ const MunitSuite downstream_suite{
void test_downstream_field_store_append_last_header(void) {
BlockAllocator balloc(16, 16);
FieldStore fs(balloc, 0);
fs.alloc_add_header_name(StringRef::from_lit("alpha"));
auto bravo = StringRef::from_lit("BRAVO");
fs.alloc_add_header_name("alpha"_sr);
auto bravo = "BRAVO"_sr;
fs.append_last_header_key(bravo.data(), bravo.size());
// Add more characters so that relloc occurs
auto golf = StringRef::from_lit("golF0123456789");
auto golf = "golF0123456789"_sr;
fs.append_last_header_key(golf.data(), golf.size());
auto charlie = StringRef::from_lit("Charlie");
auto charlie = "Charlie"_sr;
fs.append_last_header_value(charlie.data(), charlie.size());
auto delta = StringRef::from_lit("deltA");
auto delta = "deltA"_sr;
fs.append_last_header_value(delta.data(), delta.size());
// Add more characters so that relloc occurs
auto echo = StringRef::from_lit("echo0123456789");
auto echo = "echo0123456789"_sr;
fs.append_last_header_value(echo.data(), echo.size());
fs.add_header_token(StringRef::from_lit("echo"),
StringRef::from_lit("foxtrot"), false, -1);
fs.add_header_token("echo"_sr, "foxtrot"_sr, false, -1);
auto ans =
HeaderRefs{{StringRef::from_lit("alphabravogolf0123456789"),
StringRef::from_lit("CharliedeltAecho0123456789")},
{StringRef::from_lit("echo"), StringRef::from_lit("foxtrot")}};
auto ans = HeaderRefs{
{"alphabravogolf0123456789"_sr, "CharliedeltAecho0123456789"_sr},
{"echo"_sr, "foxtrot"_sr}};
assert_true(ans == fs.headers());
}
void test_downstream_field_store_header(void) {
BlockAllocator balloc(16, 16);
FieldStore fs(balloc, 0);
fs.add_header_token(StringRef::from_lit("alpha"), StringRef::from_lit("0"),
false, -1);
fs.add_header_token(StringRef::from_lit(":authority"),
StringRef::from_lit("1"), false, http2::HD__AUTHORITY);
fs.add_header_token(StringRef::from_lit("content-length"),
StringRef::from_lit("2"), false,
fs.add_header_token("alpha"_sr, "0"_sr, false, -1);
fs.add_header_token(":authority"_sr, "1"_sr, false, http2::HD__AUTHORITY);
fs.add_header_token("content-length"_sr, "2"_sr, false,
http2::HD_CONTENT_LENGTH);
// By token
@@ -97,25 +92,19 @@ void test_downstream_field_store_header(void) {
// By name
assert_true(HeaderRef(StringRef{"alpha"}, StringRef{"0"}) ==
*fs.header(StringRef::from_lit("alpha")));
assert_null(fs.header(StringRef::from_lit("bravo")));
*fs.header("alpha"_sr));
assert_null(fs.header("bravo"_sr));
}
void test_downstream_crumble_request_cookie(void) {
Downstream d(nullptr, nullptr, 0);
auto &req = d.request();
req.fs.add_header_token(StringRef::from_lit(":method"),
StringRef::from_lit("get"), false, -1);
req.fs.add_header_token(StringRef::from_lit(":path"),
StringRef::from_lit("/"), false, -1);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("alpha; bravo; ; ;; charlie;;"),
true, http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit(";delta"), false,
req.fs.add_header_token(":method"_sr, "get"_sr, false, -1);
req.fs.add_header_token(":path"_sr, "/"_sr, false, -1);
req.fs.add_header_token("cookie"_sr, "alpha; bravo; ; ;; charlie;;"_sr, true,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("echo"), false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, ";delta"_sr, false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, "echo"_sr, false, http2::HD_COOKIE);
std::vector<nghttp2_nv> nva;
d.crumble_request_cookie(nva);
@@ -133,12 +122,11 @@ void test_downstream_crumble_request_cookie(void) {
nv.flags & NGHTTP2_NV_FLAG_NO_INDEX);
});
HeaderRefs ans = {
{StringRef::from_lit("cookie"), StringRef::from_lit("alpha")},
{StringRef::from_lit("cookie"), StringRef::from_lit("bravo")},
{StringRef::from_lit("cookie"), StringRef::from_lit("charlie")},
{StringRef::from_lit("cookie"), StringRef::from_lit("delta")},
{StringRef::from_lit("cookie"), StringRef::from_lit("echo")}};
HeaderRefs ans = {{"cookie"_sr, "alpha"_sr},
{"cookie"_sr, "bravo"_sr},
{"cookie"_sr, "charlie"_sr},
{"cookie"_sr, "delta"_sr},
{"cookie"_sr, "echo"_sr}};
assert_true(ans == cookies);
assert_true(cookies[0].no_index);
@@ -150,22 +138,12 @@ void test_downstream_assemble_request_cookie(void) {
Downstream d(nullptr, nullptr, 0);
auto &req = d.request();
req.fs.add_header_token(StringRef::from_lit(":method"),
StringRef::from_lit("get"), false, -1);
req.fs.add_header_token(StringRef::from_lit(":path"),
StringRef::from_lit("/"), false, -1);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("alpha"), false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("bravo;"), false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("charlie; "), false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("delta;;"), false,
http2::HD_COOKIE);
req.fs.add_header_token(":method"_sr, "get"_sr, false, -1);
req.fs.add_header_token(":path"_sr, "/"_sr, false, -1);
req.fs.add_header_token("cookie"_sr, "alpha"_sr, false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, "bravo;"_sr, false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, "charlie; "_sr, false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, "delta;;"_sr, false, http2::HD_COOKIE);
assert_stdsv_equal("alpha; bravo; charlie; delta"sv,
d.assemble_request_cookie());
}
@@ -174,12 +152,11 @@ void test_downstream_rewrite_location_response_header(void) {
Downstream d(nullptr, nullptr, 0);
auto &req = d.request();
auto &resp = d.response();
d.set_request_downstream_host(StringRef::from_lit("localhost2"));
req.authority = StringRef::from_lit("localhost:8443");
resp.fs.add_header_token(StringRef::from_lit("location"),
StringRef::from_lit("http://localhost2:3000/"),
false, http2::HD_LOCATION);
d.rewrite_location_response_header(StringRef::from_lit("https"));
d.set_request_downstream_host("localhost2"_sr);
req.authority = "localhost:8443"_sr;
resp.fs.add_header_token("location"_sr, "http://localhost2:3000/"_sr, false,
http2::HD_LOCATION);
d.rewrite_location_response_header("https"_sr);
auto location = resp.fs.header(http2::HD_LOCATION);
assert_stdsv_equal("https://localhost:8443/"sv, (*location).value);
}
@@ -218,32 +195,26 @@ void test_downstream_find_affinity_cookie(void) {
Downstream d(nullptr, nullptr, 0);
auto &req = d.request();
req.fs.add_header_token(StringRef::from_lit("cookie"), StringRef{}, false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("a=b;;c=d"), false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("content-length"),
StringRef::from_lit("599"), false,
req.fs.add_header_token("cookie"_sr, StringRef{}, false, http2::HD_COOKIE);
req.fs.add_header_token("cookie"_sr, "a=b;;c=d"_sr, false, http2::HD_COOKIE);
req.fs.add_header_token("content-length"_sr, "599"_sr, false,
http2::HD_CONTENT_LENGTH);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("lb=deadbeef;LB=f1f2f3f4"), false,
req.fs.add_header_token("cookie"_sr, "lb=deadbeef;LB=f1f2f3f4"_sr, false,
http2::HD_COOKIE);
req.fs.add_header_token(StringRef::from_lit("cookie"),
StringRef::from_lit("short=e1e2e3e"), false,
req.fs.add_header_token("cookie"_sr, "short=e1e2e3e"_sr, false,
http2::HD_COOKIE);
uint32_t aff;
aff = d.find_affinity_cookie(StringRef::from_lit("lb"));
aff = d.find_affinity_cookie("lb"_sr);
assert_uint32(0xdeadbeef, ==, aff);
aff = d.find_affinity_cookie(StringRef::from_lit("LB"));
aff = d.find_affinity_cookie("LB"_sr);
assert_uint32(0xf1f2f3f4, ==, aff);
aff = d.find_affinity_cookie(StringRef::from_lit("short"));
aff = d.find_affinity_cookie("short"_sr);
assert_uint32(0, ==, aff);
}

View File

@@ -74,8 +74,7 @@ int HealthMonitorDownstreamConnection::end_upload_data() {
resp.http_status = 200;
resp.fs.add_header_token(StringRef::from_lit("content-length"),
StringRef::from_lit("0"), false,
resp.fs.add_header_token("content-length"_sr, "0"_sr, false,
http2::HD_CONTENT_LENGTH);
if (upstream->send_reply(downstream_, nullptr, 0) != 0) {

View File

@@ -49,12 +49,10 @@ StringRef create_error_html(BlockAllocator &balloc, unsigned int http_status) {
auto reason_phrase = http2::get_reason_phrase(http_status);
return concat_string_ref(
balloc, StringRef::from_lit(R"(<!DOCTYPE html><html lang="en"><title>)"),
status_string, StringRef::from_lit(" "), reason_phrase,
StringRef::from_lit("</title><body><h1>"), status_string,
StringRef::from_lit(" "), reason_phrase,
StringRef::from_lit("</h1><footer>"), httpconf.server_name,
StringRef::from_lit("</footer></body></html>"));
balloc, R"(<!DOCTYPE html><html lang="en"><title>)"_sr, status_string,
" "_sr, reason_phrase, "</title><body><h1>"_sr, status_string, " "_sr,
reason_phrase, "</h1><footer>"_sr, httpconf.server_name,
"</footer></body></html>"_sr);
}
StringRef create_forwarded(BlockAllocator &balloc, int params,
@@ -176,8 +174,8 @@ nghttp2_ssize select_padding_callback(nghttp2_session *session,
StringRef create_affinity_cookie(BlockAllocator &balloc, const StringRef &name,
uint32_t affinity_cookie,
const StringRef &path, bool secure) {
static constexpr auto PATH_PREFIX = StringRef::from_lit("; Path=");
static constexpr auto SECURE = StringRef::from_lit("; Secure");
static constexpr auto PATH_PREFIX = "; Path="_sr;
static constexpr auto SECURE = "; Secure"_sr;
// <name>=<value>[; Path=<path>][; Secure]
size_t len = name.size() + 1 + 8;

View File

@@ -377,8 +377,7 @@ int Http2DownstreamConnection::push_request_headers() {
if (value.empty()) {
value = fwd->value;
} else {
value = concat_string_ref(balloc, fwd->value,
StringRef::from_lit(", "), value);
value = concat_string_ref(balloc, fwd->value, ", "_sr, value);
}
}
@@ -395,8 +394,7 @@ int Http2DownstreamConnection::push_request_headers() {
StringRef xff_value;
const auto &addr = upstream->get_client_handler()->get_ipaddr();
if (xff) {
xff_value = concat_string_ref(balloc, xff->value,
StringRef::from_lit(", "), addr);
xff_value = concat_string_ref(balloc, xff->value, ", "_sr, addr);
} else {
xff_value = addr;
}
@@ -414,8 +412,7 @@ int Http2DownstreamConnection::push_request_headers() {
StringRef xfp_value;
// We use same protocol with :scheme header field
if (xfp) {
xfp_value = concat_string_ref(balloc, xfp->value,
StringRef::from_lit(", "), req.scheme);
xfp_value = concat_string_ref(balloc, xfp->value, ", "_sr, req.scheme);
} else {
xfp_value = req.scheme;
}

View File

@@ -1185,8 +1185,7 @@ int on_response_headers(Http2Session *http2session, Downstream *downstream,
// Otherwise, use chunked encoding to keep upstream connection
// open. In HTTP2, we are supposed not to receive
// transfer-encoding.
resp.fs.add_header_token(StringRef::from_lit("transfer-encoding"),
StringRef::from_lit("chunked"), false,
resp.fs.add_header_token("transfer-encoding"_sr, "chunked"_sr, false,
http2::HD_TRANSFER_ENCODING);
downstream->set_chunked_response(true);
}

View File

@@ -386,8 +386,7 @@ int Http2Upstream::on_request_headers(Downstream *downstream,
}
if (path) {
if (method_token == HTTP_OPTIONS &&
path->value == StringRef::from_lit("*")) {
if (method_token == HTTP_OPTIONS && path->value == "*"_sr) {
// Server-wide OPTIONS request. Path is empty.
} else if (config->http2_proxy &&
faddr->alt_mode == UpstreamAltMode::NONE) {
@@ -2020,19 +2019,16 @@ int Http2Upstream::redirect_to_https(Downstream *downstream) {
auto &httpconf = config->http;
StringRef loc;
if (httpconf.redirect_https_port == StringRef::from_lit("443")) {
loc = concat_string_ref(balloc, StringRef::from_lit("https://"), authority,
req.path);
if (httpconf.redirect_https_port == "443"_sr) {
loc = concat_string_ref(balloc, "https://"_sr, authority, req.path);
} else {
loc = concat_string_ref(balloc, StringRef::from_lit("https://"), authority,
StringRef::from_lit(":"),
loc = concat_string_ref(balloc, "https://"_sr, authority, ":"_sr,
httpconf.redirect_https_port, req.path);
}
auto &resp = downstream->response();
resp.http_status = 308;
resp.fs.add_header_token(StringRef::from_lit("location"), loc, false,
http2::HD_LOCATION);
resp.fs.add_header_token("location"_sr, loc, false, http2::HD_LOCATION);
return send_reply(downstream, nullptr, 0);
}

View File

@@ -2302,8 +2302,7 @@ int Http3Upstream::http_end_request_headers(Downstream *downstream, int fin) {
}
if (path) {
if (method_token == HTTP_OPTIONS &&
path->value == StringRef::from_lit("*")) {
if (method_token == HTTP_OPTIONS && path->value == "*"_sr) {
// Server-wide OPTIONS request. Path is empty.
} else if (config->http2_proxy &&
faddr->alt_mode == UpstreamAltMode::NONE) {

View File

@@ -64,37 +64,28 @@ void test_shrpx_http_create_forwarded(void) {
http::create_forwarded(
balloc,
FORWARDED_BY | FORWARDED_FOR | FORWARDED_HOST | FORWARDED_PROTO,
StringRef::from_lit("example.com:3000"), StringRef::from_lit("[::1]"),
StringRef::from_lit("www.example.com"),
StringRef::from_lit("https")));
"example.com:3000"_sr, "[::1]"_sr, "www.example.com"_sr, "https"_sr));
assert_stdsv_equal("for=192.168.0.1"sv,
http::create_forwarded(balloc, FORWARDED_FOR,
StringRef::from_lit("alpha"),
StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("bravo"),
StringRef::from_lit("charlie")));
http::create_forwarded(balloc, FORWARDED_FOR, "alpha"_sr,
"192.168.0.1"_sr, "bravo"_sr,
"charlie"_sr));
assert_stdsv_equal(
"by=_hidden;for=\"[::1]\""sv,
http::create_forwarded(balloc, FORWARDED_BY | FORWARDED_FOR,
StringRef::from_lit("_hidden"),
StringRef::from_lit("[::1]"),
StringRef::from_lit(""), StringRef::from_lit("")));
http::create_forwarded(balloc, FORWARDED_BY | FORWARDED_FOR, "_hidden"_sr,
"[::1]"_sr, ""_sr, ""_sr));
assert_stdsv_equal(
"by=\"[::1]\";for=_hidden"sv,
http::create_forwarded(balloc, FORWARDED_BY | FORWARDED_FOR,
StringRef::from_lit("[::1]"),
StringRef::from_lit("_hidden"),
StringRef::from_lit(""), StringRef::from_lit("")));
http::create_forwarded(balloc, FORWARDED_BY | FORWARDED_FOR, "[::1]"_sr,
"_hidden"_sr, ""_sr, ""_sr));
assert_stdsv_equal(
""sv, http::create_forwarded(
balloc,
FORWARDED_BY | FORWARDED_FOR | FORWARDED_HOST | FORWARDED_PROTO,
StringRef::from_lit(""), StringRef::from_lit(""),
StringRef::from_lit(""), StringRef::from_lit("")));
assert_stdsv_equal(""sv, http::create_forwarded(balloc,
FORWARDED_BY | FORWARDED_FOR |
FORWARDED_HOST |
FORWARDED_PROTO,
""_sr, ""_sr, ""_sr, ""_sr));
}
void test_shrpx_http_create_via_header_value(void) {
@@ -115,24 +106,22 @@ void test_shrpx_http_create_affinity_cookie(void) {
BlockAllocator balloc(1024, 1024);
StringRef c;
c = http::create_affinity_cookie(balloc, StringRef::from_lit("cookie-val"),
0xf1e2d3c4u, StringRef{}, false);
c = http::create_affinity_cookie(balloc, "cookie-val"_sr, 0xf1e2d3c4u,
StringRef{}, false);
assert_stdsv_equal("cookie-val=f1e2d3c4"sv, c);
c = http::create_affinity_cookie(balloc, StringRef::from_lit("alpha"),
0x00000000u, StringRef{}, true);
c = http::create_affinity_cookie(balloc, "alpha"_sr, 0x00000000u, StringRef{},
true);
assert_stdsv_equal("alpha=00000000; Secure"sv, c);
c = http::create_affinity_cookie(balloc, StringRef::from_lit("bravo"),
0x01111111u, StringRef::from_lit("bar"),
c = http::create_affinity_cookie(balloc, "bravo"_sr, 0x01111111u, "bar"_sr,
false);
assert_stdsv_equal("bravo=01111111; Path=bar"sv, c);
c = http::create_affinity_cookie(balloc, StringRef::from_lit("charlie"),
0x01111111u, StringRef::from_lit("bar"),
c = http::create_affinity_cookie(balloc, "charlie"_sr, 0x01111111u, "bar"_sr,
true);
assert_stdsv_equal("charlie=01111111; Path=bar; Secure"sv, c);
@@ -143,10 +132,10 @@ void test_shrpx_http_create_altsvc_header_value(void) {
BlockAllocator balloc(1024, 1024);
std::vector<AltSvc> altsvcs{
AltSvc{
.protocol_id = StringRef::from_lit("h3"),
.host = StringRef::from_lit("127.0.0.1"),
.service = StringRef::from_lit("443"),
.params = StringRef::from_lit("ma=3600"),
.protocol_id = "h3"_sr,
.host = "127.0.0.1"_sr,
.service = "443"_sr,
.params = "ma=3600"_sr,
},
};
@@ -158,14 +147,14 @@ void test_shrpx_http_create_altsvc_header_value(void) {
BlockAllocator balloc(1024, 1024);
std::vector<AltSvc> altsvcs{
AltSvc{
.protocol_id = StringRef::from_lit("h3"),
.service = StringRef::from_lit("443"),
.params = StringRef::from_lit("ma=3600"),
.protocol_id = "h3"_sr,
.service = "443"_sr,
.params = "ma=3600"_sr,
},
AltSvc{
.protocol_id = StringRef::from_lit("h3%"),
.host = StringRef::from_lit("\"foo\""),
.service = StringRef::from_lit("4433"),
.protocol_id = "h3%"_sr,
.host = "\"foo\""_sr,
.service = "4433"_sr,
},
};
@@ -175,12 +164,12 @@ void test_shrpx_http_create_altsvc_header_value(void) {
}
void test_shrpx_http_check_http_scheme(void) {
assert_true(http::check_http_scheme(StringRef::from_lit("https"), true));
assert_false(http::check_http_scheme(StringRef::from_lit("https"), false));
assert_false(http::check_http_scheme(StringRef::from_lit("http"), true));
assert_true(http::check_http_scheme(StringRef::from_lit("http"), false));
assert_false(http::check_http_scheme(StringRef::from_lit("foo"), true));
assert_false(http::check_http_scheme(StringRef::from_lit("foo"), false));
assert_true(http::check_http_scheme("https"_sr, true));
assert_false(http::check_http_scheme("https"_sr, false));
assert_false(http::check_http_scheme("http"_sr, true));
assert_true(http::check_http_scheme("http"_sr, false));
assert_false(http::check_http_scheme("foo"_sr, true));
assert_false(http::check_http_scheme("foo"_sr, false));
assert_false(http::check_http_scheme(StringRef{}, true));
assert_false(http::check_http_scheme(StringRef{}, false));
}

View File

@@ -303,11 +303,11 @@ void rewrite_request_host_path_from_uri(BlockAllocator &balloc, Request &req,
//
// Notice that no slash after authority. See
// http://tools.ietf.org/html/rfc7230#section-5.3.4
req.path = StringRef::from_lit("");
req.path = ""_sr;
// we ignore query component here
return;
} else {
path = StringRef::from_lit("/");
path = "/"_sr;
}
if (u.field_set & (1 << UF_QUERY)) {
@@ -317,7 +317,7 @@ void rewrite_request_host_path_from_uri(BlockAllocator &balloc, Request &req,
auto q = util::get_uri_field(uri.data(), u, UF_QUERY);
path = StringRef{std::begin(path), std::end(q)};
} else {
path = concat_string_ref(balloc, path, StringRef::from_lit("?"),
path = concat_string_ref(balloc, path, "?"_sr,
StringRef{&uri[fdata.off], fdata.len});
}
}
@@ -440,7 +440,7 @@ int htp_hdrs_completecb(llhttp_t *htp) {
if (!(u.field_set & (1 << UF_SCHEMA)) || !(u.field_set & (1 << UF_HOST))) {
req.no_authority = true;
if (method == HTTP_OPTIONS && req.path == StringRef::from_lit("*")) {
if (method == HTTP_OPTIONS && req.path == "*"_sr) {
req.path = StringRef{};
} else {
req.path = http2::rewrite_clean_path(balloc, req.path);
@@ -451,9 +451,9 @@ int htp_hdrs_completecb(llhttp_t *htp) {
}
if (handler->get_ssl()) {
req.scheme = StringRef::from_lit("https");
req.scheme = "https"_sr;
} else {
req.scheme = StringRef::from_lit("http");
req.scheme = "http"_sr;
}
} else {
rewrite_request_host_path_from_uri(balloc, req, req.path, u);
@@ -544,7 +544,7 @@ int htp_hdrs_completecb(llhttp_t *htp) {
// Continue here to make the client happy.
if (downstream->get_expect_100_continue()) {
auto output = downstream->get_response_buf();
constexpr auto res = StringRef::from_lit("HTTP/1.1 100 Continue\r\n\r\n");
constexpr auto res = "HTTP/1.1 100 Continue\r\n\r\n"_sr;
output->append(res);
handler->signal_write();
}
@@ -982,8 +982,7 @@ int HttpsUpstream::send_reply(Downstream *downstream, const uint8_t *body,
if (httpconf.max_requests <= num_requests_ ||
worker->get_graceful_shutdown()) {
resp.fs.add_header_token(StringRef::from_lit("connection"),
StringRef::from_lit("close"), false,
resp.fs.add_header_token("connection"_sr, "close"_sr, false,
http2::HD_CONNECTION);
connection_close = true;
} else if (req.http_major <= 0 ||
@@ -1429,21 +1428,17 @@ int HttpsUpstream::redirect_to_https(Downstream *downstream) {
auto &httpconf = config->http;
StringRef loc;
if (httpconf.redirect_https_port == StringRef::from_lit("443")) {
loc = concat_string_ref(balloc, StringRef::from_lit("https://"), authority,
req.path);
if (httpconf.redirect_https_port == "443"_sr) {
loc = concat_string_ref(balloc, "https://"_sr, authority, req.path);
} else {
loc = concat_string_ref(balloc, StringRef::from_lit("https://"), authority,
StringRef::from_lit(":"),
loc = concat_string_ref(balloc, "https://"_sr, authority, ":"_sr,
httpconf.redirect_https_port, req.path);
}
auto &resp = downstream->response();
resp.http_status = 308;
resp.fs.add_header_token(StringRef::from_lit("location"), loc, false,
http2::HD_LOCATION);
resp.fs.add_header_token(StringRef::from_lit("connection"),
StringRef::from_lit("close"), false,
resp.fs.add_header_token("location"_sr, loc, false, http2::HD_LOCATION);
resp.fs.add_header_token("connection"_sr, "close"_sr, false,
http2::HD_CONNECTION);
return send_reply(downstream, nullptr, 0);

View File

@@ -411,7 +411,7 @@ int LiveCheck::tls_handshake() {
switch (addr_->proto) {
case Proto::HTTP1:
if (proto.empty() || proto == StringRef::from_lit("http/1.1")) {
if (proto.empty() || proto == "http/1.1"_sr) {
break;
}
return -1;

View File

@@ -58,10 +58,8 @@ using namespace nghttp2;
namespace shrpx {
namespace {
constexpr StringRef SEVERITY_STR[] = {
StringRef::from_lit("INFO"), StringRef::from_lit("NOTICE"),
StringRef::from_lit("WARN"), StringRef::from_lit("ERROR"),
StringRef::from_lit("FATAL")};
constexpr StringRef SEVERITY_STR[] = {"INFO"_sr, "NOTICE"_sr, "WARN"_sr,
"ERROR"_sr, "FATAL"_sr};
} // namespace
namespace {
@@ -592,14 +590,13 @@ void upstream_accesslog(const std::vector<LogFragment> &lfv,
auto &balloc = downstream->get_block_allocator();
auto downstream_addr = downstream->get_addr();
auto method = req.method == -1 ? StringRef::from_lit("<unknown>")
: http2::to_method_string(req.method);
auto path =
req.method == HTTP_CONNECT ? req.authority
: config->http2_proxy ? construct_absolute_request_uri(balloc, req)
: req.path.empty() ? req.method == HTTP_OPTIONS ? StringRef::from_lit("*")
: StringRef::from_lit("-")
: req.path;
auto method =
req.method == -1 ? "<unknown>"_sr : http2::to_method_string(req.method);
auto path = req.method == HTTP_CONNECT ? req.authority
: config->http2_proxy
? construct_absolute_request_uri(balloc, req)
: req.path.empty() ? req.method == HTTP_OPTIONS ? "*"_sr : "-"_sr
: req.path;
auto path_without_query =
req.method == HTTP_CONNECT
? path

View File

@@ -266,7 +266,7 @@ enum class LogFragmentType {
};
struct LogFragment {
LogFragment(LogFragmentType type, StringRef value = StringRef::from_lit(""))
LogFragment(LogFragmentType type, StringRef value = ""_sr)
: type(type), value(std::move(value)) {}
LogFragmentType type;
StringRef value;

View File

@@ -245,8 +245,8 @@ mrb_value response_return(mrb_state *mrb, mrb_value self) {
if (cl) {
cl->value = content_length;
} else {
resp.fs.add_header_token(StringRef::from_lit("content-length"),
content_length, false, http2::HD_CONTENT_LENGTH);
resp.fs.add_header_token("content-length"_sr, content_length, false,
http2::HD_CONTENT_LENGTH);
}
resp.fs.content_length = vallen;
@@ -256,7 +256,7 @@ mrb_value response_return(mrb_state *mrb, mrb_value self) {
if (!date) {
auto lgconf = log_config();
lgconf->update_tstamp(std::chrono::system_clock::now());
resp.fs.add_header_token(StringRef::from_lit("date"),
resp.fs.add_header_token("date"_sr,
make_string_ref(balloc, lgconf->tstamp->time_http),
false, http2::HD_DATE);
}

View File

@@ -51,16 +51,16 @@ struct Pattern {
void test_shrpx_router_match(void) {
auto patterns = std::vector<Pattern>{
{StringRef::from_lit("nghttp2.org/"), 0},
{StringRef::from_lit("nghttp2.org/alpha"), 1},
{StringRef::from_lit("nghttp2.org/alpha/"), 2},
{StringRef::from_lit("nghttp2.org/alpha/bravo/"), 3},
{StringRef::from_lit("www.nghttp2.org/alpha/"), 4},
{StringRef::from_lit("/alpha"), 5},
{StringRef::from_lit("example.com/alpha/"), 6},
{StringRef::from_lit("nghttp2.org/alpha/bravo2/"), 7},
{StringRef::from_lit("www2.nghttp2.org/alpha/"), 8},
{StringRef::from_lit("www2.nghttp2.org/alpha2/"), 9},
{"nghttp2.org/"_sr, 0},
{"nghttp2.org/alpha"_sr, 1},
{"nghttp2.org/alpha/"_sr, 2},
{"nghttp2.org/alpha/bravo/"_sr, 3},
{"www.nghttp2.org/alpha/"_sr, 4},
{"/alpha"_sr, 5},
{"example.com/alpha/"_sr, 6},
{"nghttp2.org/alpha/bravo2/"_sr, 7},
{"www2.nghttp2.org/alpha/"_sr, 8},
{"www2.nghttp2.org/alpha2/"_sr, 9},
};
Router router;
@@ -71,55 +71,48 @@ void test_shrpx_router_match(void) {
ssize_t idx;
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/"));
idx = router.match("nghttp2.org"_sr, "/"_sr);
assert_ssize(0, ==, idx);
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha"));
idx = router.match("nghttp2.org"_sr, "/alpha"_sr);
assert_ssize(1, ==, idx);
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/"));
idx = router.match("nghttp2.org"_sr, "/alpha/"_sr);
assert_ssize(2, ==, idx);
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/charlie"));
idx = router.match("nghttp2.org"_sr, "/alpha/charlie"_sr);
assert_ssize(2, ==, idx);
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo/"));
idx = router.match("nghttp2.org"_sr, "/alpha/bravo/"_sr);
assert_ssize(3, ==, idx);
// matches pattern when last '/' is missing in path
idx = router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo"));
idx = router.match("nghttp2.org"_sr, "/alpha/bravo"_sr);
assert_ssize(3, ==, idx);
idx = router.match(StringRef::from_lit("www2.nghttp2.org"),
StringRef::from_lit("/alpha"));
idx = router.match("www2.nghttp2.org"_sr, "/alpha"_sr);
assert_ssize(8, ==, idx);
idx = router.match(StringRef{}, StringRef::from_lit("/alpha"));
idx = router.match(StringRef{}, "/alpha"_sr);
assert_ssize(5, ==, idx);
}
void test_shrpx_router_match_wildcard(void) {
constexpr auto patterns = std::to_array<Pattern>({
{StringRef::from_lit("nghttp2.org/"), 0},
{StringRef::from_lit("nghttp2.org/"), 1, true},
{StringRef::from_lit("nghttp2.org/alpha/"), 2},
{StringRef::from_lit("nghttp2.org/alpha/"), 3, true},
{StringRef::from_lit("nghttp2.org/bravo"), 4},
{StringRef::from_lit("nghttp2.org/bravo"), 5, true},
{"nghttp2.org/"_sr, 0},
{"nghttp2.org/"_sr, 1, true},
{"nghttp2.org/alpha/"_sr, 2},
{"nghttp2.org/alpha/"_sr, 3, true},
{"nghttp2.org/bravo"_sr, 4},
{"nghttp2.org/bravo"_sr, 5, true},
});
Router router;
@@ -128,49 +121,31 @@ void test_shrpx_router_match_wildcard(void) {
router.add_route(p.pattern, p.idx, p.wildcard);
}
assert_ssize(0, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/")));
assert_ssize(0, ==, router.match("nghttp2.org"_sr, "/"_sr));
assert_ssize(1, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/a")));
assert_ssize(1, ==, router.match("nghttp2.org"_sr, "/a"_sr));
assert_ssize(1, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/charlie")));
assert_ssize(1, ==, router.match("nghttp2.org"_sr, "/charlie"_sr));
assert_ssize(2, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha")));
assert_ssize(2, ==, router.match("nghttp2.org"_sr, "/alpha"_sr));
assert_ssize(2, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/")));
assert_ssize(2, ==, router.match("nghttp2.org"_sr, "/alpha/"_sr));
assert_ssize(3, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/b")));
assert_ssize(3, ==, router.match("nghttp2.org"_sr, "/alpha/b"_sr));
assert_ssize(4, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/bravo")));
assert_ssize(4, ==, router.match("nghttp2.org"_sr, "/bravo"_sr));
assert_ssize(5, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/bravocharlie")));
assert_ssize(5, ==, router.match("nghttp2.org"_sr, "/bravocharlie"_sr));
assert_ssize(5, ==,
router.match(StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/bravo/")));
assert_ssize(5, ==, router.match("nghttp2.org"_sr, "/bravo/"_sr));
}
void test_shrpx_router_match_prefix(void) {
auto patterns = std::vector<Pattern>{
{StringRef::from_lit("gro.2ptthgn."), 0},
{StringRef::from_lit("gro.2ptthgn.www."), 1},
{StringRef::from_lit("gro.2ptthgn.gmi."), 2},
{StringRef::from_lit("gro.2ptthgn.gmi.ahpla."), 3},
{"gro.2ptthgn."_sr, 0},
{"gro.2ptthgn.www."_sr, 1},
{"gro.2ptthgn.gmi."_sr, 2},
{"gro.2ptthgn.gmi.ahpla."_sr, 3},
};
Router router;
@@ -185,19 +160,17 @@ void test_shrpx_router_match_prefix(void) {
node = nullptr;
idx = router.match_prefix(&nread, &node,
StringRef::from_lit("gro.2ptthgn.gmi.ahpla.ovarb"));
idx = router.match_prefix(&nread, &node, "gro.2ptthgn.gmi.ahpla.ovarb"_sr);
assert_ssize(0, ==, idx);
assert_size(12, ==, nread);
idx = router.match_prefix(&nread, &node,
StringRef::from_lit("gmi.ahpla.ovarb"));
idx = router.match_prefix(&nread, &node, "gmi.ahpla.ovarb"_sr);
assert_ssize(2, ==, idx);
assert_size(4, ==, nread);
idx = router.match_prefix(&nread, &node, StringRef::from_lit("ahpla.ovarb"));
idx = router.match_prefix(&nread, &node, "ahpla.ovarb"_sr);
assert_ssize(3, ==, idx);
assert_ssize(6, ==, nread);

View File

@@ -365,7 +365,7 @@ int ocsp_resp_cb(SSL *ssl, void *arg) {
#endif // NGHTTP2_OPENSSL_IS_BORINGSSL
constexpr auto MEMCACHED_SESSION_CACHE_KEY_PREFIX =
StringRef::from_lit("nghttpx:tls-session-cache:");
"nghttpx:tls-session-cache:"_sr;
namespace {
int tls_session_client_new_cb(SSL *ssl, SSL_SESSION *session) {
@@ -699,8 +699,8 @@ int quic_alpn_select_proto_cb(SSL *ssl, const unsigned char **out,
unsigned char *outlen, const unsigned char *in,
unsigned int inlen, void *arg) {
constexpr StringRef alpnlist[] = {
StringRef::from_lit("h3"),
StringRef::from_lit("h3-29"),
"h3"_sr,
"h3-29"_sr,
};
for (auto &alpn : alpnlist) {
@@ -930,9 +930,9 @@ struct TLSProtocol {
};
constexpr TLSProtocol TLS_PROTOS[] = {
TLSProtocol{StringRef::from_lit("TLSv1.2"), SSL_OP_NO_TLSv1_2},
TLSProtocol{StringRef::from_lit("TLSv1.1"), SSL_OP_NO_TLSv1_1},
TLSProtocol{StringRef::from_lit("TLSv1.0"), SSL_OP_NO_TLSv1}};
TLSProtocol{"TLSv1.2"_sr, SSL_OP_NO_TLSv1_2},
TLSProtocol{"TLSv1.1"_sr, SSL_OP_NO_TLSv1_1},
TLSProtocol{"TLSv1.0"_sr, SSL_OP_NO_TLSv1}};
long int create_tls_proto_mask(const std::vector<StringRef> &tls_proto_list) {
long int res = 0;

View File

@@ -54,16 +54,16 @@ void test_shrpx_tls_create_lookup_tree(void) {
auto tree = std::make_unique<tls::CertLookupTree>();
constexpr StringRef hostnames[] = {
StringRef::from_lit("example.com"), // 0
StringRef::from_lit("www.example.org"), // 1
StringRef::from_lit("*www.example.org"), // 2
StringRef::from_lit("xy*.host.domain"), // 3
StringRef::from_lit("*yy.host.domain"), // 4
StringRef::from_lit("nghttp2.sourceforge.net"), // 5
StringRef::from_lit("sourceforge.net"), // 6
StringRef::from_lit("sourceforge.net"), // 7, duplicate
StringRef::from_lit("*.foo.bar"), // 8, oo.bar is suffix of *.foo.bar
StringRef::from_lit("oo.bar") // 9
"example.com"_sr, // 0
"www.example.org"_sr, // 1
"*www.example.org"_sr, // 2
"xy*.host.domain"_sr, // 3
"*yy.host.domain"_sr, // 4
"nghttp2.sourceforge.net"_sr, // 5
"sourceforge.net"_sr, // 6
"sourceforge.net"_sr, // 7, duplicate
"*.foo.bar"_sr, // 8, oo.bar is suffix of *.foo.bar
"oo.bar"_sr // 9
};
auto num = array_size(hostnames);
@@ -75,13 +75,13 @@ void test_shrpx_tls_create_lookup_tree(void) {
assert_ssize(0, ==, tree->lookup(hostnames[0]));
assert_ssize(1, ==, tree->lookup(hostnames[1]));
assert_ssize(2, ==, tree->lookup(StringRef::from_lit("2www.example.org")));
assert_ssize(-1, ==, tree->lookup(StringRef::from_lit("www2.example.org")));
assert_ssize(3, ==, tree->lookup(StringRef::from_lit("xy1.host.domain")));
assert_ssize(2, ==, tree->lookup("2www.example.org"_sr));
assert_ssize(-1, ==, tree->lookup("www2.example.org"_sr));
assert_ssize(3, ==, tree->lookup("xy1.host.domain"_sr));
// Does not match *yy.host.domain, because * must match at least 1
// character.
assert_ssize(-1, ==, tree->lookup(StringRef::from_lit("yy.host.domain")));
assert_ssize(4, ==, tree->lookup(StringRef::from_lit("xyy.host.domain")));
assert_ssize(-1, ==, tree->lookup("yy.host.domain"_sr));
assert_ssize(4, ==, tree->lookup("xyy.host.domain"_sr));
assert_ssize(-1, ==, tree->lookup(StringRef{}));
assert_ssize(5, ==, tree->lookup(hostnames[5]));
assert_ssize(6, ==, tree->lookup(hostnames[6]));
@@ -89,14 +89,14 @@ void test_shrpx_tls_create_lookup_tree(void) {
for (int i = 0; i < 7; ++i) {
assert_ssize(-1, ==, tree->lookup(StringRef{h6 + i, str_size(h6) - i}));
}
assert_ssize(8, ==, tree->lookup(StringRef::from_lit("x.foo.bar")));
assert_ssize(8, ==, tree->lookup("x.foo.bar"_sr));
assert_ssize(9, ==, tree->lookup(hostnames[9]));
constexpr StringRef names[] = {
StringRef::from_lit("rab"), // 1
StringRef::from_lit("zab"), // 2
StringRef::from_lit("zzub"), // 3
StringRef::from_lit("ab") // 4
"rab"_sr, // 1
"zab"_sr, // 2
"zzub"_sr, // 3
"ab"_sr // 4
};
num = array_size(names);
@@ -169,12 +169,11 @@ void test_shrpx_tls_cert_lookup_tree_add_ssl_ctx(void) {
assert_int(0, ==, rv);
assert_ssize(-1, ==,
tree.lookup(StringRef::from_lit("not-used.nghttp2.org")));
assert_ssize(0, ==, tree.lookup(StringRef::from_lit("test.nghttp2.org")));
assert_ssize(1, ==, tree.lookup(StringRef::from_lit("w.test.nghttp2.org")));
assert_ssize(2, ==, tree.lookup(StringRef::from_lit("www.test.nghttp2.org")));
assert_ssize(3, ==, tree.lookup(StringRef::from_lit("test.example.com")));
assert_ssize(-1, ==, tree.lookup("not-used.nghttp2.org"_sr));
assert_ssize(0, ==, tree.lookup("test.nghttp2.org"_sr));
assert_ssize(1, ==, tree.lookup("w.test.nghttp2.org"_sr));
assert_ssize(2, ==, tree.lookup("www.test.nghttp2.org"_sr));
assert_ssize(3, ==, tree.lookup("test.example.com"_sr));
}
template <size_t N, size_t M>
@@ -249,11 +248,10 @@ static Address parse_addr(const char *ipaddr) {
void test_shrpx_tls_verify_numeric_hostname(void) {
{
// Successful IPv4 address match in SAN
static constexpr char ipaddr[] = "127.0.0.1";
static constexpr auto ipaddr = "127.0.0.1"_sr;
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto addr = parse_addr(ipaddr);
auto rv =
tls::verify_numeric_hostname(cert, StringRef::from_lit(ipaddr), &addr);
auto addr = parse_addr(ipaddr.data());
auto rv = tls::verify_numeric_hostname(cert, ipaddr, &addr);
assert_int(0, ==, rv);
@@ -262,11 +260,10 @@ void test_shrpx_tls_verify_numeric_hostname(void) {
{
// Successful IPv6 address match in SAN
static constexpr char ipaddr[] = "::1";
static constexpr auto ipaddr = "::1"_sr;
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto addr = parse_addr(ipaddr);
auto rv =
tls::verify_numeric_hostname(cert, StringRef::from_lit(ipaddr), &addr);
auto addr = parse_addr(ipaddr.data());
auto rv = tls::verify_numeric_hostname(cert, ipaddr, &addr);
assert_int(0, ==, rv);
@@ -275,11 +272,10 @@ void test_shrpx_tls_verify_numeric_hostname(void) {
{
// Unsuccessful IPv4 address match in SAN
static constexpr char ipaddr[] = "192.168.0.127";
static constexpr auto ipaddr = "192.168.0.127"_sr;
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto addr = parse_addr(ipaddr);
auto rv =
tls::verify_numeric_hostname(cert, StringRef::from_lit(ipaddr), &addr);
auto addr = parse_addr(ipaddr.data());
auto rv = tls::verify_numeric_hostname(cert, ipaddr, &addr);
assert_int(-1, ==, rv);
@@ -288,11 +284,10 @@ void test_shrpx_tls_verify_numeric_hostname(void) {
{
// CommonName is not used if SAN is available
static constexpr char ipaddr[] = "192.168.0.1";
static constexpr auto ipaddr = "192.168.0.1"_sr;
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/ipaddr.crt");
auto addr = parse_addr(ipaddr);
auto rv =
tls::verify_numeric_hostname(cert, StringRef::from_lit(ipaddr), &addr);
auto addr = parse_addr(ipaddr.data());
auto rv = tls::verify_numeric_hostname(cert, ipaddr, &addr);
assert_int(-1, ==, rv);
@@ -301,11 +296,10 @@ void test_shrpx_tls_verify_numeric_hostname(void) {
{
// Successful IPv4 address match in CommonName
static constexpr char ipaddr[] = "127.0.0.1";
static constexpr auto ipaddr = "127.0.0.1"_sr;
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/nosan_ip.crt");
auto addr = parse_addr(ipaddr);
auto rv =
tls::verify_numeric_hostname(cert, StringRef::from_lit(ipaddr), &addr);
auto addr = parse_addr(ipaddr.data());
auto rv = tls::verify_numeric_hostname(cert, ipaddr, &addr);
assert_int(0, ==, rv);
@@ -317,8 +311,7 @@ void test_shrpx_tls_verify_dns_hostname(void) {
{
// Successful exact DNS name match in SAN
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto rv = tls::verify_dns_hostname(
cert, StringRef::from_lit("nghttp2.example.com"));
auto rv = tls::verify_dns_hostname(cert, "nghttp2.example.com"_sr);
assert_int(0, ==, rv);
@@ -328,8 +321,7 @@ void test_shrpx_tls_verify_dns_hostname(void) {
{
// Successful wildcard DNS name match in SAN
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto rv = tls::verify_dns_hostname(
cert, StringRef::from_lit("www.nghttp2.example.com"));
auto rv = tls::verify_dns_hostname(cert, "www.nghttp2.example.com"_sr);
assert_int(0, ==, rv);
@@ -339,7 +331,7 @@ void test_shrpx_tls_verify_dns_hostname(void) {
{
// CommonName is not used if SAN is available.
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/verify_hostname.crt");
auto rv = tls::verify_dns_hostname(cert, StringRef::from_lit("localhost"));
auto rv = tls::verify_dns_hostname(cert, "localhost"_sr);
assert_int(-1, ==, rv);
@@ -349,7 +341,7 @@ void test_shrpx_tls_verify_dns_hostname(void) {
{
// Successful DNS name match in CommonName
auto cert = load_cert(NGHTTP2_SRC_DIR "/testdata/nosan.crt");
auto rv = tls::verify_dns_hostname(cert, StringRef::from_lit("localhost"));
auto rv = tls::verify_dns_hostname(cert, "localhost"_sr);
assert_int(0, ==, rv);

View File

@@ -854,8 +854,7 @@ int Worker::create_quic_server_socket(UpstreamAddr &faddr) {
hints.ai_flags |= AI_ADDRCONFIG;
# endif // AI_ADDRCONFIG
auto node =
faddr.host == StringRef::from_lit("*") ? nullptr : faddr.host.data();
auto node = faddr.host == "*"_sr ? nullptr : faddr.host.data();
addrinfo *res, *rp;
rv = getaddrinfo(node, service.c_str(), &hints, &res);
@@ -1230,13 +1229,13 @@ const UpstreamAddr *Worker::find_quic_upstream_addr(const Address &local_addr) {
if (faddr.port == 443 || faddr.port == 80) {
switch (faddr.family) {
case AF_INET:
if (util::streq(faddr.hostport, StringRef::from_lit("0.0.0.0"))) {
if (util::streq(faddr.hostport, "0.0.0.0"_sr)) {
fallback_faddr = &faddr;
}
break;
case AF_INET6:
if (util::streq(faddr.hostport, StringRef::from_lit("[::]"))) {
if (util::streq(faddr.hostport, "[::]"_sr)) {
fallback_faddr = &faddr;
}
@@ -1247,14 +1246,13 @@ const UpstreamAddr *Worker::find_quic_upstream_addr(const Address &local_addr) {
} else {
switch (faddr.family) {
case AF_INET:
if (util::starts_with(faddr.hostport,
StringRef::from_lit("0.0.0.0:"))) {
if (util::starts_with(faddr.hostport, "0.0.0.0:"_sr)) {
fallback_faddr = &faddr;
}
break;
case AF_INET6:
if (util::starts_with(faddr.hostport, StringRef::from_lit("[::]:"))) {
if (util::starts_with(faddr.hostport, "[::]:"_sr)) {
fallback_faddr = &faddr;
}
@@ -1333,7 +1331,7 @@ size_t match_downstream_addr_group_host(
}
}
group = router.match(StringRef::from_lit(""), path);
group = router.match(""_sr, path);
if (group != -1) {
if (LOG_ENABLED(INFO)) {
LOG(INFO) << "Found pattern with query " << path
@@ -1366,7 +1364,7 @@ size_t match_downstream_addr_group(
auto path = StringRef{std::begin(raw_path), query};
if (path.empty() || path[0] != '/') {
path = StringRef::from_lit("/");
path = "/"_sr;
}
if (hostport.empty()) {

View File

@@ -74,154 +74,134 @@ void test_shrpx_worker_match_downstream_addr_group(void) {
}
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr, "/"_sr,
groups, 255, balloc));
// port is removed
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org:8080"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org:8080"_sr,
"/"_sr, groups, 255, balloc));
// host is case-insensitive
assert_size(4, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("WWW.nghttp2.org"),
StringRef::from_lit("/alpha"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "WWW.nghttp2.org"_sr,
"/alpha"_sr, groups, 255, balloc));
assert_size(1, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/bravo/"_sr, groups, 255,
balloc));
// /alpha/bravo also matches /alpha/bravo/
assert_size(1, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/bravo"_sr, groups, 255,
balloc));
// path part is case-sensitive
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/Alpha/bravo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/Alpha/bravo"_sr, groups, 255,
balloc));
assert_size(1, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo/charlie"), groups, 255,
balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/bravo/charlie"_sr, groups,
255, balloc));
assert_size(2, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/charlie"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/charlie"_sr, groups, 255,
balloc));
// pattern which does not end with '/' must match its entirely. So
// this matches to group 0, not group 2.
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/charlie/"), groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("example.org"),
StringRef::from_lit("/"), groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(routerconf, StringRef::from_lit(""),
StringRef::from_lit("/"), groups, 255,
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/charlie/"_sr, groups, 255,
balloc));
assert_size(255, ==,
match_downstream_addr_group(routerconf, StringRef::from_lit(""),
StringRef::from_lit("alpha"), groups,
match_downstream_addr_group(routerconf, "example.org"_sr, "/"_sr,
groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(routerconf, ""_sr, "/"_sr, groups,
255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("foo/bar"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, ""_sr, "alpha"_sr, groups,
255, balloc));
// If path is StringRef::from_lit("*", only match with host + "/").
assert_size(255, ==,
match_downstream_addr_group(routerconf, "foo/bar"_sr, "/"_sr,
groups, 255, balloc));
// If path is "*", only match with host + "/").
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("*"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr, "*"_sr,
groups, 255, balloc));
assert_size(5, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("[::1]"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "[::1]"_sr, "/"_sr,
groups, 255, balloc));
assert_size(5, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("[::1]:8080"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "[::1]:8080"_sr, "/"_sr,
groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("[::1"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "[::1"_sr, "/"_sr, groups,
255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("[::1]8000"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "[::1]8000"_sr, "/"_sr,
groups, 255, balloc));
// Check the case where adding route extends tree
assert_size(6, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo/delta"), groups, 255,
balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/bravo/delta"_sr, groups, 255,
balloc));
assert_size(1, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/alpha/bravo/delta/"), groups, 255,
balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/alpha/bravo/delta/"_sr, groups, 255,
balloc));
// Check the case where query is done in a single node
assert_size(7, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("example.com"),
StringRef::from_lit("/alpha/bravo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "example.com"_sr,
"/alpha/bravo"_sr, groups, 255,
balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("example.com"),
StringRef::from_lit("/alpha/bravo/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "example.com"_sr,
"/alpha/bravo/"_sr, groups, 255,
balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("example.com"),
StringRef::from_lit("/alpha"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "example.com"_sr,
"/alpha"_sr, groups, 255, balloc));
// Check the case where quey is done in a single node
assert_size(8, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("/alpha"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "192.168.0.1"_sr,
"/alpha"_sr, groups, 255, balloc));
assert_size(8, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("/alpha/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "192.168.0.1"_sr,
"/alpha/"_sr, groups, 255, balloc));
assert_size(8, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("/alpha/bravo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "192.168.0.1"_sr,
"/alpha/bravo"_sr, groups, 255,
balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("/alph"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "192.168.0.1"_sr,
"/alph"_sr, groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("192.168.0.1"),
StringRef::from_lit("/"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "192.168.0.1"_sr, "/"_sr,
groups, 255, balloc));
// Test for wildcard hosts
auto g1 = std::make_shared<DownstreamAddrGroup>();
@@ -236,52 +216,46 @@ void test_shrpx_worker_match_downstream_addr_group(void) {
g3->pattern = ImmutableString::from_lit(".local");
groups.push_back(std::move(g3));
wp.emplace_back(StringRef::from_lit("git.nghttp2.org"));
wcrouter.add_route(StringRef::from_lit("gro.2ptthgn.tig"), 0);
wp.back().router.add_route(StringRef::from_lit("/echo/"), 10);
wp.emplace_back("git.nghttp2.org"_sr);
wcrouter.add_route("gro.2ptthgn.tig"_sr, 0);
wp.back().router.add_route("/echo/"_sr, 10);
wp.emplace_back(StringRef::from_lit(".nghttp2.org"));
wcrouter.add_route(StringRef::from_lit("gro.2ptthgn."), 1);
wp.back().router.add_route(StringRef::from_lit("/echo/"), 11);
wp.back().router.add_route(StringRef::from_lit("/echo/foxtrot"), 12);
wp.emplace_back(".nghttp2.org"_sr);
wcrouter.add_route("gro.2ptthgn."_sr, 1);
wp.back().router.add_route("/echo/"_sr, 11);
wp.back().router.add_route("/echo/foxtrot"_sr, 12);
wp.emplace_back(StringRef::from_lit(".local"));
wcrouter.add_route(StringRef::from_lit("lacol."), 2);
wp.back().router.add_route(StringRef::from_lit("/"), 13);
wp.emplace_back(".local"_sr);
wcrouter.add_route("lacol."_sr, 2);
wp.back().router.add_route("/"_sr, 13);
assert_size(11, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("git.nghttp2.org"),
StringRef::from_lit("/echo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "git.nghttp2.org"_sr,
"/echo"_sr, groups, 255, balloc));
assert_size(10, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("0git.nghttp2.org"),
StringRef::from_lit("/echo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "0git.nghttp2.org"_sr,
"/echo"_sr, groups, 255, balloc));
assert_size(11, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("it.nghttp2.org"),
StringRef::from_lit("/echo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "it.nghttp2.org"_sr,
"/echo"_sr, groups, 255, balloc));
assert_size(255, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit(".nghttp2.org"),
StringRef::from_lit("/echo/foxtrot"), groups, 255, balloc));
match_downstream_addr_group(routerconf, ".nghttp2.org"_sr,
"/echo/foxtrot"_sr, groups, 255,
balloc));
assert_size(9, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("alpha.nghttp2.org"),
StringRef::from_lit("/golf"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "alpha.nghttp2.org"_sr,
"/golf"_sr, groups, 255, balloc));
assert_size(0, ==,
match_downstream_addr_group(
routerconf, StringRef::from_lit("nghttp2.org"),
StringRef::from_lit("/echo"), groups, 255, balloc));
match_downstream_addr_group(routerconf, "nghttp2.org"_sr,
"/echo"_sr, groups, 255, balloc));
assert_size(13, ==,
match_downstream_addr_group(routerconf,
StringRef::from_lit("test.local"),
match_downstream_addr_group(routerconf, "test.local"_sr,
StringRef{}, groups, 255, balloc));
}

View File

@@ -380,6 +380,8 @@ public:
constexpr StringRef(std::nullptr_t) = delete;
constexpr explicit StringRef(const std::string &s)
: base(s.c_str()), len(s.size()) {}
constexpr explicit StringRef(const std::string_view &s)
: base(s.data()), len(s.size()) {}
constexpr explicit StringRef(const ImmutableString &s)
: base(s.c_str()), len(s.size()) {}
constexpr StringRef(const char *s) : base(s), len(traits_type::length(s)) {}
@@ -395,9 +397,6 @@ public:
: base(s.data()), len(s.size_bytes()) {}
explicit StringRef(std::span<const uint8_t> s)
: base(reinterpret_cast<const char *>(s.data())), len(s.size_bytes()) {}
template <size_t N> static constexpr StringRef from_lit(const char (&s)[N]) {
return StringRef{s, N - 1};
}
static constexpr StringRef from_maybe_nullptr(const char *s) noexcept {
if (s == nullptr) {
return StringRef();
@@ -499,6 +498,10 @@ inline std::string &operator+=(std::string &lhs, const StringRef &rhs) {
return lhs;
}
constexpr StringRef operator""_sr(const char *str, size_t len) noexcept {
return {str, len};
}
template <typename T, std::size_t N>
[[nodiscard]] std::span<const uint8_t, N == std::dynamic_extent
? std::dynamic_extent

View File

@@ -165,7 +165,7 @@ void test_template_string_ref(void) {
assert_size(5, ==, ref.size());
// from string literal
auto from_lit = StringRef::from_lit("alpha");
auto from_lit = "alpha"_sr;
assert_stdsv_equal("alpha"sv, from_lit);
assert_size(5, ==, from_lit.size());

View File

@@ -28,11 +28,14 @@
#include "nghttp2_config.h"
#include <cinttypes>
#include <string_view>
#include <openssl/ssl.h>
#include "ssl_compat.h"
using namespace std::literals;
namespace nghttp2 {
namespace tls {
@@ -41,19 +44,20 @@ namespace tls {
// suites for TLSv1.2 by mozilla.
//
// https://wiki.mozilla.org/Security/Server_Side_TLS
constexpr char DEFAULT_CIPHER_LIST[] =
constexpr auto DEFAULT_CIPHER_LIST =
"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-"
"AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-"
"POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-"
"AES256-GCM-SHA384";
"AES256-GCM-SHA384"sv;
// Recommended general purpose "Modern compatibility" cipher suites
// for TLSv1.3 by mozilla.
//
// https://wiki.mozilla.org/Security/Server_Side_TLS
constexpr char DEFAULT_TLS13_CIPHER_LIST[] =
constexpr auto DEFAULT_TLS13_CIPHER_LIST =
#if defined(NGHTTP2_GENUINE_OPENSSL) || defined(NGHTTP2_OPENSSL_IS_LIBRESSL)
"TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
"TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:"
"TLS_CHACHA20_POLY1305_SHA256"sv
#else // !NGHTTP2_GENUINE_OPENSSL && !NGHTTP2_OPENSSL_IS_LIBRESSL
""
#endif // !NGHTTP2_GENUINE_OPENSSL && !NGHTTP2_OPENSSL_IS_LIBRESSL

View File

@@ -60,20 +60,20 @@
namespace nghttp2 {
constexpr auto NGHTTP2_H2_ALPN = StringRef::from_lit("\x2h2");
constexpr auto NGHTTP2_H2 = StringRef::from_lit("h2");
constexpr auto NGHTTP2_H2_ALPN = "\x2h2"_sr;
constexpr auto NGHTTP2_H2 = "h2"_sr;
// The additional HTTP/2 protocol ALPN protocol identifier we also
// supports for our applications to make smooth migration into final
// h2 ALPN ID.
constexpr auto NGHTTP2_H2_16_ALPN = StringRef::from_lit("\x5h2-16");
constexpr auto NGHTTP2_H2_16 = StringRef::from_lit("h2-16");
constexpr auto NGHTTP2_H2_16_ALPN = "\x5h2-16"_sr;
constexpr auto NGHTTP2_H2_16 = "h2-16"_sr;
constexpr auto NGHTTP2_H2_14_ALPN = StringRef::from_lit("\x5h2-14");
constexpr auto NGHTTP2_H2_14 = StringRef::from_lit("h2-14");
constexpr auto NGHTTP2_H2_14_ALPN = "\x5h2-14"_sr;
constexpr auto NGHTTP2_H2_14 = "h2-14"_sr;
constexpr auto NGHTTP2_H1_1_ALPN = StringRef::from_lit("\x8http/1.1");
constexpr auto NGHTTP2_H1_1 = StringRef::from_lit("http/1.1");
constexpr auto NGHTTP2_H1_1_ALPN = "\x8http/1.1"_sr;
constexpr auto NGHTTP2_H1_1 = "http/1.1"_sr;
constexpr size_t NGHTTP2_MAX_UINT64_DIGITS = str_size("18446744073709551615");

View File

@@ -89,24 +89,17 @@ const MunitSuite util_suite{
};
void test_util_streq(void) {
assert_true(
util::streq(StringRef::from_lit("alpha"), StringRef::from_lit("alpha")));
assert_false(util::streq(StringRef::from_lit("alpha"),
StringRef::from_lit("alphabravo")));
assert_false(util::streq(StringRef::from_lit("alphabravo"),
StringRef::from_lit("alpha")));
assert_false(
util::streq(StringRef::from_lit("alpha"), StringRef::from_lit("alphA")));
assert_false(util::streq(StringRef{}, StringRef::from_lit("a")));
assert_true(util::streq("alpha"_sr, "alpha"_sr));
assert_false(util::streq("alpha"_sr, "alphabravo"_sr));
assert_false(util::streq("alphabravo"_sr, "alpha"_sr));
assert_false(util::streq("alpha"_sr, "alphA"_sr));
assert_false(util::streq(StringRef{}, "a"_sr));
assert_true(util::streq(StringRef{}, StringRef{}));
assert_false(util::streq(StringRef::from_lit("alpha"), StringRef{}));
assert_false(util::streq("alpha"_sr, StringRef{}));
assert_false(
util::streq(StringRef::from_lit("alph"), StringRef::from_lit("alpha")));
assert_false(
util::streq(StringRef::from_lit("alpha"), StringRef::from_lit("alph")));
assert_false(
util::streq(StringRef::from_lit("alpha"), StringRef::from_lit("alphA")));
assert_false(util::streq("alph"_sr, "alpha"_sr));
assert_false(util::streq("alpha"_sr, "alph"_sr));
assert_false(util::streq("alpha"_sr, "alphA"_sr));
assert_true(util::streq_l("alpha", "alpha", 5));
assert_true(util::streq_l("alpha", "alphabravo", 5));
@@ -125,15 +118,11 @@ void test_util_strieq(void) {
assert_false(util::strieq(std::string("alpha"), std::string("AlPhA ")));
assert_false(util::strieq(std::string(), std::string("AlPhA ")));
assert_true(
util::strieq(StringRef::from_lit("alpha"), StringRef::from_lit("alpha")));
assert_true(
util::strieq(StringRef::from_lit("alpha"), StringRef::from_lit("AlPhA")));
assert_true(util::strieq("alpha"_sr, "alpha"_sr));
assert_true(util::strieq("alpha"_sr, "AlPhA"_sr));
assert_true(util::strieq(StringRef{}, StringRef{}));
assert_false(util::strieq(StringRef::from_lit("alpha"),
StringRef::from_lit("AlPhA ")));
assert_false(
util::strieq(StringRef::from_lit(""), StringRef::from_lit("AlPhA ")));
assert_false(util::strieq("alpha"_sr, "AlPhA "_sr));
assert_false(util::strieq(""_sr, "AlPhA "_sr));
assert_true(util::strieq_l("alpha", "alpha", 5));
assert_true(util::strieq_l("alpha", "AlPhA", 5));
@@ -141,11 +130,11 @@ void test_util_strieq(void) {
assert_false(util::strieq_l("alpha", "AlPhA ", 6));
assert_false(util::strieq_l("", "AlPhA ", 6));
assert_true(util::strieq_l("alpha", StringRef::from_lit("alpha")));
assert_true(util::strieq_l("alpha", StringRef::from_lit("AlPhA")));
assert_true(util::strieq_l("alpha", "alpha"_sr));
assert_true(util::strieq_l("alpha", "AlPhA"_sr));
assert_true(util::strieq_l("", StringRef{}));
assert_false(util::strieq_l("alpha", StringRef::from_lit("AlPhA ")));
assert_false(util::strieq_l("", StringRef::from_lit("AlPhA ")));
assert_false(util::strieq_l("alpha", "AlPhA "_sr));
assert_false(util::strieq_l("", "AlPhA "_sr));
}
void test_util_inp_strlower(void) {
@@ -165,10 +154,8 @@ void test_util_inp_strlower(void) {
void test_util_to_base64(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal("AAA++B/="sv,
util::to_base64(balloc, StringRef::from_lit("AAA--B_")));
assert_stdsv_equal("AAA++B/B"sv,
util::to_base64(balloc, StringRef::from_lit("AAA--B_B")));
assert_stdsv_equal("AAA++B/="sv, util::to_base64(balloc, "AAA--B_"_sr));
assert_stdsv_equal("AAA++B/B"sv, util::to_base64(balloc, "AAA--B_B"_sr));
}
void test_util_to_token68(void) {
@@ -183,14 +170,11 @@ void test_util_to_token68(void) {
void test_util_percent_encode_token(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal(
"h2"sv, util::percent_encode_token(balloc, StringRef::from_lit("h2")));
assert_stdsv_equal(
"h3~"sv, util::percent_encode_token(balloc, StringRef::from_lit("h3~")));
assert_stdsv_equal("100%25"sv, util::percent_encode_token(
balloc, StringRef::from_lit("100%")));
assert_stdsv_equal("http%202"sv, util::percent_encode_token(
balloc, StringRef::from_lit("http 2")));
assert_stdsv_equal("h2"sv, util::percent_encode_token(balloc, "h2"_sr));
assert_stdsv_equal("h3~"sv, util::percent_encode_token(balloc, "h3~"_sr));
assert_stdsv_equal("100%25"sv, util::percent_encode_token(balloc, "100%"_sr));
assert_stdsv_equal("http%202"sv,
util::percent_encode_token(balloc, "http 2"_sr));
}
void test_util_percent_decode(void) {
@@ -211,25 +195,20 @@ void test_util_percent_decode(void) {
}
BlockAllocator balloc(1024, 1024);
assert_stdsv_equal(
"foobar"sv,
util::percent_decode(balloc, StringRef::from_lit("%66%6F%6f%62%61%72")));
assert_stdsv_equal("foobar"sv,
util::percent_decode(balloc, "%66%6F%6f%62%61%72"_sr));
assert_stdsv_equal(
"f%6"sv, util::percent_decode(balloc, StringRef::from_lit("%66%6")));
assert_stdsv_equal("f%6"sv, util::percent_decode(balloc, "%66%6"_sr));
assert_stdsv_equal("f%"sv,
util::percent_decode(balloc, StringRef::from_lit("%66%")));
assert_stdsv_equal("f%"sv, util::percent_decode(balloc, "%66%"_sr));
}
void test_util_quote_string(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal("alpha"sv,
util::quote_string(balloc, StringRef::from_lit("alpha")));
assert_stdsv_equal(""sv, util::quote_string(balloc, StringRef::from_lit("")));
assert_stdsv_equal(
"\\\"alpha\\\""sv,
util::quote_string(balloc, StringRef::from_lit("\"alpha\"")));
assert_stdsv_equal("alpha"sv, util::quote_string(balloc, "alpha"_sr));
assert_stdsv_equal(""sv, util::quote_string(balloc, ""_sr));
assert_stdsv_equal("\\\"alpha\\\""sv,
util::quote_string(balloc, "\"alpha\""_sr));
}
void test_util_utox(void) {
@@ -464,51 +443,38 @@ void test_util_format_duration(void) {
}
void test_util_starts_with(void) {
assert_true(util::starts_with(StringRef::from_lit("foo"),
StringRef::from_lit("foo")));
assert_true(util::starts_with(StringRef::from_lit("fooo"),
StringRef::from_lit("foo")));
assert_true(util::starts_with(StringRef::from_lit("ofoo"), StringRef{}));
assert_false(util::starts_with(StringRef::from_lit("ofoo"),
StringRef::from_lit("foo")));
assert_true(util::starts_with("foo"_sr, "foo"_sr));
assert_true(util::starts_with("fooo"_sr, "foo"_sr));
assert_true(util::starts_with("ofoo"_sr, StringRef{}));
assert_false(util::starts_with("ofoo"_sr, "foo"_sr));
assert_true(util::istarts_with(StringRef::from_lit("FOO"),
StringRef::from_lit("fOO")));
assert_true(util::istarts_with(StringRef::from_lit("ofoo"), StringRef{}));
assert_true(util::istarts_with(StringRef::from_lit("fOOo"),
StringRef::from_lit("Foo")));
assert_false(util::istarts_with(StringRef::from_lit("ofoo"),
StringRef::from_lit("foo")));
assert_true(util::istarts_with("FOO"_sr, "fOO"_sr));
assert_true(util::istarts_with("ofoo"_sr, StringRef{}));
assert_true(util::istarts_with("fOOo"_sr, "Foo"_sr));
assert_false(util::istarts_with("ofoo"_sr, "foo"_sr));
assert_true(util::istarts_with_l(StringRef::from_lit("fOOo"), "Foo"));
assert_false(util::istarts_with_l(StringRef::from_lit("ofoo"), "foo"));
assert_true(util::istarts_with_l("fOOo"_sr, "Foo"));
assert_false(util::istarts_with_l("ofoo"_sr, "foo"));
}
void test_util_ends_with(void) {
assert_true(
util::ends_with(StringRef::from_lit("foo"), StringRef::from_lit("foo")));
assert_true(util::ends_with(StringRef::from_lit("foo"), StringRef{}));
assert_true(
util::ends_with(StringRef::from_lit("ofoo"), StringRef::from_lit("foo")));
assert_false(
util::ends_with(StringRef::from_lit("ofoo"), StringRef::from_lit("fo")));
assert_true(util::ends_with("foo"_sr, "foo"_sr));
assert_true(util::ends_with("foo"_sr, StringRef{}));
assert_true(util::ends_with("ofoo"_sr, "foo"_sr));
assert_false(util::ends_with("ofoo"_sr, "fo"_sr));
assert_true(
util::iends_with(StringRef::from_lit("fOo"), StringRef::from_lit("Foo")));
assert_true(util::iends_with(StringRef::from_lit("foo"), StringRef{}));
assert_true(util::iends_with(StringRef::from_lit("oFoo"),
StringRef::from_lit("fOO")));
assert_false(
util::iends_with(StringRef::from_lit("ofoo"), StringRef::from_lit("fo")));
assert_true(util::iends_with("fOo"_sr, "Foo"_sr));
assert_true(util::iends_with("foo"_sr, StringRef{}));
assert_true(util::iends_with("oFoo"_sr, "fOO"_sr));
assert_false(util::iends_with("ofoo"_sr, "fo"_sr));
assert_true(util::iends_with_l(StringRef::from_lit("oFoo"), "fOO"));
assert_false(util::iends_with_l(StringRef::from_lit("ofoo"), "fo"));
assert_true(util::iends_with_l("oFoo"_sr, "fOO"));
assert_false(util::iends_with_l("ofoo"_sr, "fo"));
}
void test_util_parse_http_date(void) {
assert_int64(1001939696, ==,
util::parse_http_date(
StringRef::from_lit("Mon, 1 Oct 2001 12:34:56 GMT")));
util::parse_http_date("Mon, 1 Oct 2001 12:34:56 GMT"_sr));
}
void test_util_localtime_date(void) {
@@ -573,16 +539,16 @@ void test_util_get_uint64(void) {
}
void test_util_parse_config_str_list(void) {
auto res = util::parse_config_str_list(StringRef::from_lit("a"));
auto res = util::parse_config_str_list("a"_sr);
assert_size(1, ==, res.size());
assert_stdstring_equal("a", res[0]);
res = util::parse_config_str_list(StringRef::from_lit("a,"));
res = util::parse_config_str_list("a,"_sr);
assert_size(2, ==, res.size());
assert_stdstring_equal("a", res[0]);
assert_stdstring_equal("", res[1]);
res = util::parse_config_str_list(StringRef::from_lit(":a::"), ':');
res = util::parse_config_str_list(":a::"_sr, ':');
assert_size(4, ==, res.size());
assert_stdstring_equal("", res[0]);
assert_stdstring_equal("a", res[1]);
@@ -593,7 +559,7 @@ void test_util_parse_config_str_list(void) {
assert_size(1, ==, res.size());
assert_stdstring_equal("", res[0]);
res = util::parse_config_str_list(StringRef::from_lit("alpha,bravo,charlie"));
res = util::parse_config_str_list("alpha,bravo,charlie"_sr);
assert_size(3, ==, res.size());
assert_stdstring_equal("alpha", res[0]);
assert_stdstring_equal("bravo", res[1]);
@@ -603,51 +569,42 @@ void test_util_parse_config_str_list(void) {
void test_util_make_http_hostport(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal(
"localhost"sv,
util::make_http_hostport(balloc, StringRef::from_lit("localhost"), 80));
assert_stdsv_equal("[::1]"sv, util::make_http_hostport(
balloc, StringRef::from_lit("::1"), 443));
assert_stdsv_equal(
"localhost:3000"sv,
util::make_http_hostport(balloc, StringRef::from_lit("localhost"), 3000));
assert_stdsv_equal("localhost"sv,
util::make_http_hostport(balloc, "localhost"_sr, 80));
assert_stdsv_equal("[::1]"sv,
util::make_http_hostport(balloc, "::1"_sr, 443));
assert_stdsv_equal("localhost:3000"sv,
util::make_http_hostport(balloc, "localhost"_sr, 3000));
}
void test_util_make_hostport(void) {
std::array<char, util::max_hostport> hostport_buf;
assert_stdsv_equal("localhost:80"sv,
util::make_hostport(std::begin(hostport_buf),
StringRef::from_lit("localhost"), 80));
assert_stdsv_equal("[::1]:443"sv,
util::make_hostport(std::begin(hostport_buf),
StringRef::from_lit("::1"), 443));
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal(
"localhost:80"sv,
util::make_hostport(balloc, StringRef::from_lit("localhost"), 80));
util::make_hostport(std::begin(hostport_buf), "localhost"_sr, 80));
assert_stdsv_equal(
"[::1]:443"sv,
util::make_hostport(balloc, StringRef::from_lit("::1"), 443));
util::make_hostport(std::begin(hostport_buf), "::1"_sr, 443));
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal("localhost:80"sv,
util::make_hostport(balloc, "localhost"_sr, 80));
assert_stdsv_equal("[::1]:443"sv, util::make_hostport(balloc, "::1"_sr, 443));
}
void test_util_strifind(void) {
assert_true(util::strifind(StringRef::from_lit("gzip, deflate, bzip2"),
StringRef::from_lit("gzip")));
assert_true(util::strifind("gzip, deflate, bzip2"_sr, "gzip"_sr));
assert_true(util::strifind(StringRef::from_lit("gzip, deflate, bzip2"),
StringRef::from_lit("dEflate")));
assert_true(util::strifind("gzip, deflate, bzip2"_sr, "dEflate"_sr));
assert_true(util::strifind(StringRef::from_lit("gzip, deflate, bzip2"),
StringRef::from_lit("BZIP2")));
assert_true(util::strifind("gzip, deflate, bzip2"_sr, "BZIP2"_sr));
assert_true(util::strifind(StringRef::from_lit("nghttp2"), StringRef{}));
assert_true(util::strifind("nghttp2"_sr, StringRef{}));
// Be aware this fact
assert_false(util::strifind(StringRef{}, StringRef{}));
assert_false(util::strifind(StringRef::from_lit("nghttp2"),
StringRef::from_lit("http1")));
assert_false(util::strifind("nghttp2"_sr, "http1"_sr));
}
void test_util_random_alpha_digit(void) {
@@ -668,9 +625,8 @@ void test_util_random_alpha_digit(void) {
void test_util_format_hex(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal(
"0ff0"sv,
util::format_hex(balloc, std::span{StringRef::from_lit("\x0f\xf0")}));
assert_stdsv_equal("0ff0"sv,
util::format_hex(balloc, std::span{"\x0f\xf0"_sr}));
assert_stdsv_equal(""sv,
util::format_hex(balloc, std::span<const uint8_t>{}));
@@ -701,111 +657,89 @@ void test_util_format_hex(void) {
void test_util_is_hex_string(void) {
assert_true(util::is_hex_string(StringRef{}));
assert_true(util::is_hex_string(StringRef::from_lit("0123456789abcdef")));
assert_true(util::is_hex_string(StringRef::from_lit("0123456789ABCDEF")));
assert_false(util::is_hex_string(StringRef::from_lit("000")));
assert_false(util::is_hex_string(StringRef::from_lit("XX")));
assert_true(util::is_hex_string("0123456789abcdef"_sr));
assert_true(util::is_hex_string("0123456789ABCDEF"_sr));
assert_false(util::is_hex_string("000"_sr));
assert_false(util::is_hex_string("XX"_sr));
}
void test_util_decode_hex(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal("\x0f\xf0"sv, StringRef{util::decode_hex(
balloc, StringRef::from_lit("0ff0"))});
assert_stdsv_equal("\x0f\xf0"sv,
StringRef{util::decode_hex(balloc, "0ff0"_sr)});
assert_stdsv_equal(""sv, StringRef{util::decode_hex(balloc, StringRef{})});
}
void test_util_extract_host(void) {
assert_stdsv_equal("foo"sv, util::extract_host(StringRef::from_lit("foo")));
assert_stdsv_equal("foo"sv, util::extract_host(StringRef::from_lit("foo:")));
assert_stdsv_equal("foo"sv, util::extract_host(StringRef::from_lit("foo:0")));
assert_stdsv_equal("[::1]"sv,
util::extract_host(StringRef::from_lit("[::1]")));
assert_stdsv_equal("[::1]"sv,
util::extract_host(StringRef::from_lit("[::1]:")));
assert_stdsv_equal("foo"sv, util::extract_host("foo"_sr));
assert_stdsv_equal("foo"sv, util::extract_host("foo:"_sr));
assert_stdsv_equal("foo"sv, util::extract_host("foo:0"_sr));
assert_stdsv_equal("[::1]"sv, util::extract_host("[::1]"_sr));
assert_stdsv_equal("[::1]"sv, util::extract_host("[::1]:"_sr));
assert_true(util::extract_host(StringRef::from_lit(":foo")).empty());
assert_true(util::extract_host(StringRef::from_lit("[::1")).empty());
assert_true(util::extract_host(StringRef::from_lit("[::1]0")).empty());
assert_true(util::extract_host(":foo"_sr).empty());
assert_true(util::extract_host("[::1"_sr).empty());
assert_true(util::extract_host("[::1]0"_sr).empty());
assert_true(util::extract_host(StringRef{}).empty());
}
void test_util_split_hostport(void) {
assert_true(std::make_pair(StringRef::from_lit("foo"), StringRef{}) ==
util::split_hostport(StringRef::from_lit("foo")));
assert_true(
std::make_pair(StringRef::from_lit("foo"), StringRef::from_lit("80")) ==
util::split_hostport(StringRef::from_lit("foo:80")));
assert_true(
std::make_pair(StringRef::from_lit("::1"), StringRef::from_lit("80")) ==
util::split_hostport(StringRef::from_lit("[::1]:80")));
assert_true(std::make_pair(StringRef::from_lit("::1"), StringRef{}) ==
util::split_hostport(StringRef::from_lit("[::1]")));
assert_true(std::make_pair("foo"_sr, StringRef{}) ==
util::split_hostport("foo"_sr));
assert_true(std::make_pair("foo"_sr, "80"_sr) ==
util::split_hostport("foo:80"_sr));
assert_true(std::make_pair("::1"_sr, "80"_sr) ==
util::split_hostport("[::1]:80"_sr));
assert_true(std::make_pair("::1"_sr, StringRef{}) ==
util::split_hostport("[::1]"_sr));
assert_true(std::make_pair(StringRef{}, StringRef{}) ==
util::split_hostport(StringRef{}));
assert_true(std::make_pair(StringRef{}, StringRef{}) ==
util::split_hostport(StringRef::from_lit("[::1]:")));
util::split_hostport("[::1]:"_sr));
assert_true(std::make_pair(StringRef{}, StringRef{}) ==
util::split_hostport(StringRef::from_lit("foo:")));
util::split_hostport("foo:"_sr));
assert_true(std::make_pair(StringRef{}, StringRef{}) ==
util::split_hostport(StringRef::from_lit("[::1:")));
util::split_hostport("[::1:"_sr));
assert_true(std::make_pair(StringRef{}, StringRef{}) ==
util::split_hostport(StringRef::from_lit("[::1]80")));
util::split_hostport("[::1]80"_sr));
}
void test_util_split_str(void) {
assert_true(std::vector<StringRef>{StringRef::from_lit("")} ==
util::split_str(StringRef::from_lit(""), ','));
assert_true(std::vector<StringRef>{StringRef::from_lit("alpha")} ==
util::split_str(StringRef::from_lit("alpha"), ','));
assert_true((std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("")}) ==
util::split_str(StringRef::from_lit("alpha,"), ','));
assert_true((std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("bravo")}) ==
util::split_str(StringRef::from_lit("alpha,bravo"), ','));
assert_true((std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("bravo"),
StringRef::from_lit("charlie")}) ==
util::split_str(StringRef::from_lit("alpha,bravo,charlie"), ','));
assert_true(
(std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("bravo"),
StringRef::from_lit("charlie")}) ==
util::split_str(StringRef::from_lit("alpha,bravo,charlie"), ',', 0));
assert_true(std::vector<StringRef>{StringRef::from_lit("")} ==
util::split_str(StringRef::from_lit(""), ',', 1));
assert_true(std::vector<StringRef>{StringRef::from_lit("")} ==
util::split_str(StringRef::from_lit(""), ',', 2));
assert_true(
(std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("bravo,charlie")}) ==
util::split_str(StringRef::from_lit("alpha,bravo,charlie"), ',', 2));
assert_true(std::vector<StringRef>{StringRef::from_lit("alpha")} ==
util::split_str(StringRef::from_lit("alpha"), ',', 2));
assert_true((std::vector<StringRef>{StringRef::from_lit("alpha"),
StringRef::from_lit("")}) ==
util::split_str(StringRef::from_lit("alpha,"), ',', 2));
assert_true(std::vector<StringRef>{StringRef::from_lit("alpha")} ==
util::split_str(StringRef::from_lit("alpha"), ',', 0));
assert_true(
std::vector<StringRef>{StringRef::from_lit("alpha,bravo,charlie")} ==
util::split_str(StringRef::from_lit("alpha,bravo,charlie"), ',', 1));
assert_true(std::vector<StringRef>{""_sr} == util::split_str(""_sr, ','));
assert_true(std::vector<StringRef>{"alpha"_sr} ==
util::split_str("alpha"_sr, ','));
assert_true((std::vector<StringRef>{"alpha"_sr, ""_sr}) ==
util::split_str("alpha,"_sr, ','));
assert_true((std::vector<StringRef>{"alpha"_sr, "bravo"_sr}) ==
util::split_str("alpha,bravo"_sr, ','));
assert_true((std::vector<StringRef>{"alpha"_sr, "bravo"_sr, "charlie"_sr}) ==
util::split_str("alpha,bravo,charlie"_sr, ','));
assert_true((std::vector<StringRef>{"alpha"_sr, "bravo"_sr, "charlie"_sr}) ==
util::split_str("alpha,bravo,charlie"_sr, ',', 0));
assert_true(std::vector<StringRef>{""_sr} == util::split_str(""_sr, ',', 1));
assert_true(std::vector<StringRef>{""_sr} == util::split_str(""_sr, ',', 2));
assert_true((std::vector<StringRef>{"alpha"_sr, "bravo,charlie"_sr}) ==
util::split_str("alpha,bravo,charlie"_sr, ',', 2));
assert_true(std::vector<StringRef>{"alpha"_sr} ==
util::split_str("alpha"_sr, ',', 2));
assert_true((std::vector<StringRef>{"alpha"_sr, ""_sr}) ==
util::split_str("alpha,"_sr, ',', 2));
assert_true(std::vector<StringRef>{"alpha"_sr} ==
util::split_str("alpha"_sr, ',', 0));
assert_true(std::vector<StringRef>{"alpha,bravo,charlie"_sr} ==
util::split_str("alpha,bravo,charlie"_sr, ',', 1));
}
void test_util_rstrip(void) {
BlockAllocator balloc(4096, 4096);
assert_stdsv_equal("alpha"sv,
util::rstrip(balloc, StringRef::from_lit("alpha")));
assert_stdsv_equal("alpha"sv,
util::rstrip(balloc, StringRef::from_lit("alpha ")));
assert_stdsv_equal("alpha"sv,
util::rstrip(balloc, StringRef::from_lit("alpha \t")));
assert_stdsv_equal(""sv, util::rstrip(balloc, StringRef::from_lit("")));
assert_stdsv_equal(""sv,
util::rstrip(balloc, StringRef::from_lit("\t\t\t ")));
assert_stdsv_equal("alpha"sv, util::rstrip(balloc, "alpha"_sr));
assert_stdsv_equal("alpha"sv, util::rstrip(balloc, "alpha "_sr));
assert_stdsv_equal("alpha"sv, util::rstrip(balloc, "alpha \t"_sr));
assert_stdsv_equal(""sv, util::rstrip(balloc, ""_sr));
assert_stdsv_equal(""sv, util::rstrip(balloc, "\t\t\t "_sr));
}
} // namespace shrpx