Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Return string view from HTTPHdr methods #12091

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Prev Previous commit
Next Next commit
Return string_view from HTTPHdr::query_get
  • Loading branch information
hnakamur committed Mar 7, 2025
commit fdaad534f7ba1daf999bdccceab2d329e456842c
16 changes: 10 additions & 6 deletions include/proxy/hdrs/HTTP.h
Original file line number Diff line number Diff line change
@@ -567,10 +567,9 @@ class HTTPHdr : public MIMEHdr

/** Get the URL query.
This is a reference, not allocated.
@return A pointer to the query or @c NULL if there is no valid URL.
@return A string_view to the query or an empty string_view if there is no valid URL.
*/
const char *query_get(int *length ///< Storage for query length.
);
std::string_view query_get();

/** Get the URL fragment.
This is a reference, not allocated.
@@ -1214,11 +1213,16 @@ HTTPHdr::path_get()
return std::string_view{};
}

inline const char *
HTTPHdr::query_get(int *length)
inline std::string_view
HTTPHdr::query_get()
{
URL *url = this->url_get();
return url ? url->query_get(length) : nullptr;
if (url) {
int length;
auto query{url->query_get(&length)};
return std::string_view{query, static_cast<std::string_view::size_type>(length)};
}
return std::string_view{};
}

inline const char *
15 changes: 7 additions & 8 deletions src/proxy/hdrs/VersionConverter.cc
Original file line number Diff line number Diff line change
@@ -123,19 +123,18 @@ VersionConverter::_convert_req_from_1_to_2(HTTPHdr &header) const

// :path
if (MIMEField *field = header.field_find(PSEUDO_HEADER_PATH.data(), PSEUDO_HEADER_PATH.size()); field != nullptr) {
auto value{header.path_get()};
int query_len = 0;
const char *query = header.query_get(&query_len);
int path_len = static_cast<int>(value.length()) + 1;
auto value{header.path_get()};
auto query{header.query_get()};
int path_len = static_cast<int>(value.length()) + 1;

ts::LocalBuffer<char> buf(static_cast<int>(value.length()) + 1 + 1 + 1 + query_len);
ts::LocalBuffer<char> buf(static_cast<int>(value.length()) + 1 + 1 + 1 + static_cast<int>(query.length()));
char *path = buf.data();
path[0] = '/';
memcpy(path + 1, value.data(), static_cast<int>(value.length()));
if (query_len > 0) {
if (static_cast<int>(query.length()) > 0) {
path[path_len] = '?';
memcpy(path + path_len + 1, query, query_len);
path_len += 1 + query_len;
memcpy(path + path_len + 1, query.data(), static_cast<int>(query.length()));
path_len += 1 + static_cast<int>(query.length());
}
field->value_set(header.m_heap, header.m_mime, path, path_len);
} else {