http: using string_view to avoid unnecessary copy in Headers

This commit is contained in:
Matthew Zipkin 2025-04-28 10:27:26 -04:00
parent 7856f20fec
commit 54a36093f7
No known key found for this signature in database
GPG key ID: E7E2984B6289C93A
3 changed files with 9 additions and 9 deletions

View file

@ -130,7 +130,7 @@ static bool multiUserAuthorized(std::string strUserPass)
return false; return false;
} }
static bool RPCAuthorized(const std::string& strAuth, std::string& strAuthUsernameOut) static bool RPCAuthorized(const std::string_view& strAuth, std::string& strAuthUsernameOut)
{ {
if (strAuth.substr(0, 6) != "Basic ") if (strAuth.substr(0, 6) != "Basic ")
return false; return false;
@ -159,7 +159,7 @@ static bool HTTPReq_JSONRPC(const std::any& context, HTTPRequest* req)
return false; return false;
} }
// Check authorization // Check authorization
std::pair<bool, std::string> authHeader = req->GetHeader("authorization"); std::pair<bool, std::string_view> authHeader = req->GetHeader("authorization");
if (!authHeader.first) { if (!authHeader.first) {
req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA); req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
req->WriteReply(HTTP_UNAUTHORIZED); req->WriteReply(HTTP_UNAUTHORIZED);

View file

@ -805,11 +805,11 @@ void UnregisterHTTPHandler(const std::string &prefix, bool exactMatch)
namespace http_bitcoin { namespace http_bitcoin {
using util::Split; using util::Split;
std::optional<std::string> HTTPHeaders::Find(const std::string key) const std::optional<std::string_view> HTTPHeaders::Find(const std::string key) const
{ {
const auto it = m_map.find(key); const auto it = m_map.find(key);
if (it == m_map.end()) return std::nullopt; if (it == m_map.end()) return std::nullopt;
return it->second; return std::string_view(it->second);
} }
void HTTPHeaders::Write(const std::string key, const std::string value) void HTTPHeaders::Write(const std::string key, const std::string value)
@ -817,7 +817,7 @@ void HTTPHeaders::Write(const std::string key, const std::string value)
// If present, append value to list // If present, append value to list
const auto existing_value = Find(key); const auto existing_value = Find(key);
if (existing_value) { if (existing_value) {
m_map[key] = existing_value.value() + ", " + value; m_map[key] = std::string(existing_value.value()) + ", " + value;
} else { } else {
m_map[key] = value; m_map[key] = value;
} }
@ -1008,9 +1008,9 @@ std::optional<std::string> GetQueryParameterFromUri(const std::string& uri, cons
return std::nullopt; return std::nullopt;
} }
std::pair<bool, std::string> HTTPRequest::GetHeader(const std::string& hdr) const std::pair<bool, std::string_view> HTTPRequest::GetHeader(const std::string& hdr) const
{ {
std::optional<std::string> found{m_headers.Find(hdr)}; std::optional<std::string_view> found{m_headers.Find(hdr)};
if (found.has_value()) { if (found.has_value()) {
return std::make_pair(true, found.value()); return std::make_pair(true, found.value());
} else } else

View file

@ -209,7 +209,7 @@ static const size_t MAX_HEADERS_SIZE{8192};
class HTTPHeaders class HTTPHeaders
{ {
public: public:
std::optional<std::string> Find(const std::string key) const; std::optional<std::string_view> Find(const std::string key) const;
void Write(const std::string key, const std::string value); void Write(const std::string key, const std::string value);
void Remove(const std::string key); void Remove(const std::string key);
bool Read(util::LineReader& reader); bool Read(util::LineReader& reader);
@ -266,7 +266,7 @@ public:
CService GetPeer() const; CService GetPeer() const;
HTTPRequestMethod GetRequestMethod() const; HTTPRequestMethod GetRequestMethod() const;
std::optional<std::string> GetQueryParameter(const std::string& key) const; std::optional<std::string> GetQueryParameter(const std::string& key) const;
std::pair<bool, std::string> GetHeader(const std::string& hdr) const; std::pair<bool, std::string_view> GetHeader(const std::string& hdr) const;
std::string ReadBody() const {return m_body;}; std::string ReadBody() const {return m_body;};
void WriteHeader(const std::string& hdr, const std::string& value); void WriteHeader(const std::string& hdr, const std::string& value);