Commit acbf38fd authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

src: Refactor using StringRef, simplify function parameters

parent 1e8bea15
...@@ -77,8 +77,8 @@ bool serve_mux::handle(std::string pattern, request_cb cb) { ...@@ -77,8 +77,8 @@ bool serve_mux::handle(std::string pattern, request_cb cb) {
request_cb serve_mux::handler(request_impl &req) const { request_cb serve_mux::handler(request_impl &req) const {
auto &path = req.uri().path; auto &path = req.uri().path;
if (req.method() != "CONNECT") { if (req.method() != "CONNECT") {
auto clean_path = ::nghttp2::http2::path_join( auto clean_path = ::nghttp2::http2::path_join(StringRef{}, StringRef{},
nullptr, 0, nullptr, 0, path.c_str(), path.size(), nullptr, 0); StringRef{path}, StringRef{});
if (clean_path != path) { if (clean_path != path) {
auto new_uri = util::percent_encode_path(clean_path); auto new_uri = util::percent_encode_path(clean_path);
auto &uref = req.uri(); auto &uref = req.uri();
......
...@@ -1185,39 +1185,37 @@ void eat_dir(std::string &path) { ...@@ -1185,39 +1185,37 @@ void eat_dir(std::string &path) {
} }
} // namespace } // namespace
std::string path_join(const char *base_path, size_t base_pathlen, std::string path_join(const StringRef &base_path, const StringRef &base_query,
const char *base_query, size_t base_querylen, const StringRef &rel_path, const StringRef &rel_query) {
const char *rel_path, size_t rel_pathlen,
const char *rel_query, size_t rel_querylen) {
std::string res; std::string res;
if (rel_pathlen == 0) { if (rel_path.empty()) {
if (base_pathlen == 0) { if (base_path.empty()) {
res = "/"; res = "/";
} else { } else {
res.assign(base_path, base_pathlen); res.assign(std::begin(base_path), std::end(base_path));
} }
if (rel_querylen == 0) { if (rel_query.empty()) {
if (base_querylen) { if (!base_query.empty()) {
res += '?'; res += '?';
res.append(base_query, base_querylen); res.append(std::begin(base_query), std::end(base_query));
} }
return res; return res;
} }
res += '?'; res += '?';
res.append(rel_query, rel_querylen); res.append(std::begin(rel_query), std::end(rel_query));
return res; return res;
} }
auto first = rel_path; auto first = std::begin(rel_path);
auto last = rel_path + rel_pathlen; auto last = std::end(rel_path);
if (rel_path[0] == '/') { if (rel_path[0] == '/') {
res = "/"; res = "/";
++first; ++first;
} else if (base_pathlen == 0) { } else if (base_path.empty()) {
res = "/"; res = "/";
} else { } else {
res.assign(base_path, base_pathlen); res.assign(std::begin(base_path), std::end(base_path));
} }
for (; first != last;) { for (; first != last;) {
...@@ -1254,9 +1252,9 @@ std::string path_join(const char *base_path, size_t base_pathlen, ...@@ -1254,9 +1252,9 @@ std::string path_join(const char *base_path, size_t base_pathlen,
for (; first != last && *first == '/'; ++first) for (; first != last && *first == '/'; ++first)
; ;
} }
if (rel_querylen) { if (!rel_query.empty()) {
res += '?'; res += '?';
res.append(rel_query, rel_querylen); res.append(std::begin(rel_query), std::end(rel_query));
} }
return res; return res;
} }
...@@ -1480,15 +1478,14 @@ int get_pure_path_component(const char **base, size_t *baselen, ...@@ -1480,15 +1478,14 @@ int get_pure_path_component(const char **base, size_t *baselen,
} }
int construct_push_component(std::string &scheme, std::string &authority, int construct_push_component(std::string &scheme, std::string &authority,
std::string &path, const char *base, std::string &path, const StringRef &base,
size_t baselen, const char *uri, size_t len) { const StringRef &uri) {
int rv; int rv;
const char *rel, *relq = nullptr; StringRef rel, relq;
size_t rellen, relqlen = 0;
http_parser_url u{}; http_parser_url u{};
rv = http_parser_parse_url(uri, len, 0, &u); rv = http_parser_parse_url(uri.c_str(), uri.size(), 0, &u);
if (rv != 0) { if (rv != 0) {
if (uri[0] == '/') { if (uri[0] == '/') {
...@@ -1496,22 +1493,20 @@ int construct_push_component(std::string &scheme, std::string &authority, ...@@ -1496,22 +1493,20 @@ int construct_push_component(std::string &scheme, std::string &authority,
} }
// treat link_url as relative URI. // treat link_url as relative URI.
auto end = std::find(uri, uri + len, '#'); auto end = std::find(std::begin(uri), std::end(uri), '#');
auto q = std::find(uri, end, '?'); auto q = std::find(std::begin(uri), end, '?');
rel = uri; rel = StringRef{std::begin(uri), q};
rellen = q - uri;
if (q != end) { if (q != end) {
relq = q + 1; relq = StringRef{q + 1, std::end(uri)};
relqlen = end - relq;
} }
} else { } else {
if (u.field_set & (1 << UF_SCHEMA)) { if (u.field_set & (1 << UF_SCHEMA)) {
http2::copy_url_component(scheme, &u, UF_SCHEMA, uri); http2::copy_url_component(scheme, &u, UF_SCHEMA, uri.c_str());
} }
if (u.field_set & (1 << UF_HOST)) { if (u.field_set & (1 << UF_HOST)) {
http2::copy_url_component(authority, &u, UF_HOST, uri); http2::copy_url_component(authority, &u, UF_HOST, uri.c_str());
if (u.field_set & (1 << UF_PORT)) { if (u.field_set & (1 << UF_PORT)) {
authority += ':'; authority += ':';
authority += util::utos(u.port); authority += util::utos(u.port);
...@@ -1520,22 +1515,18 @@ int construct_push_component(std::string &scheme, std::string &authority, ...@@ -1520,22 +1515,18 @@ int construct_push_component(std::string &scheme, std::string &authority,
if (u.field_set & (1 << UF_PATH)) { if (u.field_set & (1 << UF_PATH)) {
auto &f = u.field_data[UF_PATH]; auto &f = u.field_data[UF_PATH];
rel = uri + f.off; rel = StringRef{uri.c_str() + f.off, f.len};
rellen = f.len;
} else { } else {
rel = "/"; rel = StringRef::from_lit("/");
rellen = 1;
} }
if (u.field_set & (1 << UF_QUERY)) { if (u.field_set & (1 << UF_QUERY)) {
auto &f = u.field_data[UF_QUERY]; auto &f = u.field_data[UF_QUERY];
relq = uri + f.off; relq = StringRef{uri.c_str() + f.off, f.len};
relqlen = f.len;
} }
} }
path = path = http2::path_join(base, StringRef{}, rel, relq);
http2::path_join(base, baselen, nullptr, 0, rel, rellen, relq, relqlen);
return 0; return 0;
} }
......
...@@ -297,16 +297,13 @@ struct LinkHeader { ...@@ -297,16 +297,13 @@ struct LinkHeader {
// is ignored during parsing. // is ignored during parsing.
std::vector<LinkHeader> parse_link_header(const char *src, size_t len); std::vector<LinkHeader> parse_link_header(const char *src, size_t len);
// Constructs path by combining base path |base_path| of length // Constructs path by combining base path |base_path| with another
// |base_pathlen| with another path |rel_path| of length // path |rel_path|. The base path and another path can have optional
// |rel_pathlen|. The base path and another path can have optional
// query component. This function assumes |base_path| is normalized. // query component. This function assumes |base_path| is normalized.
// In other words, it does not contain ".." or "." path components // In other words, it does not contain ".." or "." path components
// and starts with "/" if it is not empty. // and starts with "/" if it is not empty.
std::string path_join(const char *base_path, size_t base_pathlen, std::string path_join(const StringRef &base, const StringRef &base_query,
const char *base_query, size_t base_querylen, const StringRef &rel_path, const StringRef &rel_query);
const char *rel_path, size_t rel_pathlen,
const char *rel_query, size_t rel_querylen);
// true if response has body, taking into account the request method // true if response has body, taking into account the request method
// and status code. // and status code.
...@@ -359,8 +356,7 @@ std::string normalize_path(InputIt first, InputIt last) { ...@@ -359,8 +356,7 @@ std::string normalize_path(InputIt first, InputIt last) {
} }
result.append(first, last); result.append(first, last);
} }
return path_join(nullptr, 0, nullptr, 0, result.c_str(), result.size(), return path_join(StringRef{}, StringRef{}, StringRef{result}, StringRef{});
nullptr, 0);
} }
template <typename InputIt> template <typename InputIt>
...@@ -384,14 +380,14 @@ std::string rewrite_clean_path(InputIt first, InputIt last) { ...@@ -384,14 +380,14 @@ std::string rewrite_clean_path(InputIt first, InputIt last) {
int get_pure_path_component(const char **base, size_t *baselen, int get_pure_path_component(const char **base, size_t *baselen,
const std::string &uri); const std::string &uri);
// Deduces scheme, authority and path from given |uri| of length // Deduces scheme, authority and path from given |uri|, and stores
// |len|, and stores them in |scheme|, |authority|, and |path| // them in |scheme|, |authority|, and |path| respectively. If |uri|
// respectively. If |uri| is relative path, path resolution is taken // is relative path, path resolution takes place using path given in
// palce using path given in |base| of length |baselen|. This // |base| of length |baselen|. This function returns 0 if it
// function returns 0 if it succeeds, or -1. // succeeds, or -1.
int construct_push_component(std::string &scheme, std::string &authority, int construct_push_component(std::string &scheme, std::string &authority,
std::string &path, const char *base, std::string &path, const StringRef &base,
size_t baselen, const char *uri, size_t len); const StringRef &uri);
} // namespace http2 } // namespace http2
......
This diff is collapsed.
...@@ -1755,9 +1755,8 @@ int Http2Upstream::prepare_push_promise(Downstream *downstream) { ...@@ -1755,9 +1755,8 @@ int Http2Upstream::prepare_push_promise(Downstream *downstream) {
const std::string *scheme_ptr, *authority_ptr; const std::string *scheme_ptr, *authority_ptr;
std::string scheme, authority, path; std::string scheme, authority, path;
rv = http2::construct_push_component(scheme, authority, path, base, rv = http2::construct_push_component(scheme, authority, path,
baselen, link.uri.c_str(), StringRef{base, baselen}, link.uri);
link.uri.size());
if (rv != 0) { if (rv != 0) {
continue; continue;
} }
...@@ -1872,8 +1871,8 @@ int Http2Upstream::initiate_push(Downstream *downstream, const char *uri, ...@@ -1872,8 +1871,8 @@ int Http2Upstream::initiate_push(Downstream *downstream, const char *uri,
const std::string *scheme_ptr, *authority_ptr; const std::string *scheme_ptr, *authority_ptr;
std::string scheme, authority, path; std::string scheme, authority, path;
rv = http2::construct_push_component(scheme, authority, path, base, baselen, rv = http2::construct_push_component(
uri, len); scheme, authority, path, StringRef{base, baselen}, StringRef{uri, len});
if (rv != 0) { if (rv != 0) {
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment