in include/ylt/standalone/cinatra/coro_http_client.hpp [1547:1644]
std::string build_request_header(
const uri_t &u, http_method method, const auto &ctx,
bool already_has_len = false,
std::unordered_map<std::string, std::string> headers = {}) {
std::string req_str(method_name(method));
req_str.append(" ").append(u.get_path());
if (!u.query.empty()) {
req_str.append("?").append(u.query);
}
if (!headers.empty()) {
req_headers_ = std::move(headers);
req_str.append(" HTTP/1.1\r\n");
}
else {
if (req_headers_.find("Host") == req_headers_.end()) {
req_str.append(" HTTP/1.1\r\nHost:").append(u.host).append("\r\n");
}
else {
req_str.append(" HTTP/1.1\r\n");
}
}
auto type_str = get_content_type_str(ctx.content_type);
if (!type_str.empty()) {
if (ctx.content_type == req_content_type::multipart) {
type_str.append(BOUNDARY);
}
req_headers_["Content-Type"] = std::move(type_str);
}
bool has_connection = false;
// add user headers
if (!req_headers_.empty()) {
for (auto &pair : req_headers_) {
if (pair.first == "Connection") {
has_connection = true;
}
req_str.append(pair.first)
.append(": ")
.append(pair.second)
.append("\r\n");
}
}
if (!has_connection) {
req_str.append("Connection: keep-alive\r\n");
}
if (!proxy_basic_auth_username_.empty() &&
!proxy_basic_auth_password_.empty()) {
std::string basic_auth_str = "Proxy-Authorization: Basic ";
std::string basic_base64_str = base64_encode(
proxy_basic_auth_username_ + ":" + proxy_basic_auth_password_);
req_str.append(basic_auth_str).append(basic_base64_str).append(CRCF);
}
if (!proxy_bearer_token_auth_token_.empty()) {
std::string bearer_token_str = "Proxy-Authorization: Bearer ";
req_str.append(bearer_token_str)
.append(proxy_bearer_token_auth_token_)
.append(CRCF);
}
if (!ctx.req_header.empty())
req_str.append(ctx.req_header);
size_t content_len = ctx.content.size();
bool should_add_len = false;
if (content_len > 0) {
should_add_len = true;
}
else {
if ((method == http_method::POST || method == http_method::PUT) &&
ctx.content_type != req_content_type::multipart) {
should_add_len = true;
}
}
if (req_headers_.find("Content-Length") != req_headers_.end()) {
should_add_len = false;
}
if (already_has_len) {
should_add_len = false;
}
if (should_add_len) {
char buf[32];
auto [ptr, ec] = std::to_chars(buf, buf + 32, content_len);
req_str.append("Content-Length: ")
.append(std::string_view(buf, ptr - buf))
.append("\r\n");
}
req_str.append("\r\n");
return req_str;
}