summaryrefslogtreecommitdiffstats
path: root/src/HttpServer.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/HttpServer.cc124
1 files changed, 63 insertions, 61 deletions
diff --git a/src/HttpServer.cc b/src/HttpServer.cc
index 6b28d1b..fb7b1db 100644
--- a/src/HttpServer.cc
+++ b/src/HttpServer.cc
@@ -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 {
@@ -925,28 +924,32 @@ int Http2Handler::submit_file_response(const StringRef &status, Stream *stream,
const std::string *content_type,
nghttp2_data_provider2 *data_prd) {
std::string last_modified_str;
- auto nva = make_array(http2::make_nv_ls_nocopy(":status", status),
- http2::make_nv_ls_nocopy("server", NGHTTPD_SERVER),
- http2::make_nv_ll("cache-control", "max-age=3600"),
- http2::make_nv_ls("date", sessions_->get_cached_date()),
- http2::make_nv_ll("", ""), http2::make_nv_ll("", ""),
- http2::make_nv_ll("", ""), http2::make_nv_ll("", ""));
+ auto nva = std::to_array({
+ http2::make_field(":status"_sr, status),
+ http2::make_field("server"_sr, NGHTTPD_SERVER),
+ http2::make_field("cache-control"_sr, "max-age=3600"_sr),
+ http2::make_field_v("date"_sr, sessions_->get_cached_date()),
+ {},
+ {},
+ {},
+ {},
+ });
size_t nvlen = 4;
if (!get_config()->no_content_length) {
- nva[nvlen++] = http2::make_nv_ls_nocopy(
- "content-length",
+ nva[nvlen++] = http2::make_field(
+ "content-length"_sr,
util::make_string_ref_uint(stream->balloc, file_length));
}
if (last_modified != 0) {
last_modified_str = util::http_date(last_modified);
- nva[nvlen++] = http2::make_nv_ls("last-modified", last_modified_str);
+ nva[nvlen++] = http2::make_field_v("last-modified"_sr, last_modified_str);
}
if (content_type) {
- nva[nvlen++] = http2::make_nv_ls("content-type", *content_type);
+ nva[nvlen++] = http2::make_field_v("content-type"_sr, *content_type);
}
auto &trailer_names = get_config()->trailer_names;
if (!trailer_names.empty()) {
- nva[nvlen++] = http2::make_nv_ls_nocopy("trailer", trailer_names);
+ nva[nvlen++] = http2::make_field("trailer"_sr, trailer_names);
}
return nghttp2_submit_response2(session_, stream->stream_id, nva.data(),
nvlen, data_prd);
@@ -957,19 +960,20 @@ int Http2Handler::submit_response(const StringRef &status, int32_t stream_id,
nghttp2_data_provider2 *data_prd) {
auto nva = std::vector<nghttp2_nv>();
nva.reserve(4 + headers.size());
- nva.push_back(http2::make_nv_ls_nocopy(":status", status));
- nva.push_back(http2::make_nv_ls_nocopy("server", NGHTTPD_SERVER));
- nva.push_back(http2::make_nv_ls("date", sessions_->get_cached_date()));
+ nva.push_back(http2::make_field(":status"_sr, status));
+ nva.push_back(http2::make_field("server"_sr, NGHTTPD_SERVER));
+ nva.push_back(http2::make_field_v("date"_sr, sessions_->get_cached_date()));
if (data_prd) {
auto &trailer_names = get_config()->trailer_names;
if (!trailer_names.empty()) {
- nva.push_back(http2::make_nv_ls_nocopy("trailer", trailer_names));
+ nva.push_back(http2::make_field("trailer"_sr, trailer_names));
}
}
for (auto &nv : headers) {
- nva.push_back(http2::make_nv_nocopy(nv.name, nv.value, nv.no_index));
+ nva.push_back(
+ http2::make_field(nv.name, nv.value, http2::no_index(nv.no_index)));
}
int r = nghttp2_submit_response2(session_, stream_id, nva.data(), nva.size(),
data_prd);
@@ -978,16 +982,18 @@ int Http2Handler::submit_response(const StringRef &status, int32_t stream_id,
int Http2Handler::submit_response(const StringRef &status, int32_t stream_id,
nghttp2_data_provider2 *data_prd) {
- auto nva = make_array(http2::make_nv_ls_nocopy(":status", status),
- http2::make_nv_ls_nocopy("server", NGHTTPD_SERVER),
- http2::make_nv_ls("date", sessions_->get_cached_date()),
- http2::make_nv_ll("", ""));
+ auto nva = std::to_array({
+ http2::make_field(":status"_sr, status),
+ http2::make_field("server"_sr, NGHTTPD_SERVER),
+ http2::make_field_v("date"_sr, sessions_->get_cached_date()),
+ {},
+ });
size_t nvlen = 3;
if (data_prd) {
auto &trailer_names = get_config()->trailer_names;
if (!trailer_names.empty()) {
- nva[nvlen++] = http2::make_nv_ls_nocopy("trailer", trailer_names);
+ nva[nvlen++] = http2::make_field("trailer"_sr, trailer_names);
}
}
@@ -997,7 +1003,7 @@ int Http2Handler::submit_response(const StringRef &status, int32_t stream_id,
int Http2Handler::submit_non_final_response(const std::string &status,
int32_t stream_id) {
- auto nva = make_array(http2::make_nv_ls(":status", status));
+ auto nva = std::to_array({http2::make_field_v(":status"_sr, status)});
return nghttp2_submit_headers(session_, NGHTTP2_FLAG_NONE, stream_id, nullptr,
nva.data(), nva.size(), nullptr);
}
@@ -1010,13 +1016,12 @@ 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 = make_array(http2::make_nv_ll(":method", "GET"),
- http2::make_nv_ls_nocopy(":path", push_path),
- http2::make_nv_ls_nocopy(":scheme", scheme),
- http2::make_nv_ls_nocopy(":authority", authority));
+ auto nva = std::to_array({http2::make_field(":method"_sr, "GET"_sr),
+ http2::make_field(":path"_sr, push_path),
+ http2::make_field(":scheme"_sr, scheme),
+ http2::make_field(":authority"_sr, authority)});
auto promised_stream_id = nghttp2_submit_push_promise(
session_, NGHTTP2_FLAG_END_HEADERS, stream->stream_id, nva.data(),
@@ -1029,7 +1034,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 =
@@ -1103,7 +1108,8 @@ nghttp2_ssize file_read_callback(nghttp2_session *session, int32_t stream_id,
std::vector<nghttp2_nv> nva;
nva.reserve(config->trailer.size());
for (auto &kv : config->trailer) {
- nva.push_back(http2::make_nv(kv.name, kv.value, kv.no_index));
+ nva.push_back(http2::make_field_nv(kv.name, kv.value,
+ http2::no_index(kv.no_index)));
}
rv = nghttp2_submit_trailer(session, stream_id, nva.data(), nva.size());
if (rv != 0) {
@@ -1140,10 +1146,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);
@@ -1167,15 +1172,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
@@ -1209,10 +1212,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);
@@ -1245,8 +1248,8 @@ void prepare_response(Stream *stream, Http2Handler *hd,
auto query_pos = std::find(std::begin(reqpath), std::end(reqpath), '?');
if (query_pos != std::end(reqpath)) {
// Do not response to this request to allow clients to test timeouts.
- if (util::streq_l("nghttpd_do_not_respond_to_req=yes",
- StringRef{query_pos, std::end(reqpath)})) {
+ if ("nghttpd_do_not_respond_to_req=yes"_sr ==
+ StringRef{query_pos, std::end(reqpath)}) {
return;
}
raw_path = StringRef{std::begin(reqpath), query_pos};
@@ -1278,7 +1281,7 @@ void prepare_response(Stream *stream, Http2Handler *hd,
}
if (!hd->get_config()->push.empty()) {
- auto push_itr = hd->get_config()->push.find(path.str());
+ auto push_itr = hd->get_config()->push.find(std::string{path});
if (allow_push && push_itr != std::end(hd->get_config()->push)) {
for (auto &push_path : (*push_itr).second) {
rv = hd->submit_push_promise(stream, StringRef{push_path});
@@ -1339,8 +1342,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);
@@ -1370,16 +1373,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;
}
@@ -1390,8 +1392,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
@@ -1425,7 +1427,7 @@ int on_header_callback2(nghttp2_session *session, const nghttp2_frame *frame,
stream->header_buffer_size += namebuf.len + valuebuf.len;
- auto token = http2::lookup_token(namebuf.base, namebuf.len);
+ auto token = http2::lookup_token(StringRef{namebuf.base, namebuf.len});
auto &header = stream->header;
@@ -1528,14 +1530,13 @@ int hd_on_frame_recv_callback(nghttp2_session *session,
auto expect100 = stream->header.expect;
- if (util::strieq_l("100-continue", expect100)) {
+ if (util::strieq("100-continue"_sr, expect100)) {
hd->submit_non_final_response("100", frame->hd.stream_id);
}
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;
@@ -2129,7 +2130,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;
}