Skip to content

Commit 1738a58

Browse files
authored
support customized UserAgent in http client (#479)
Signed-off-by: liulanzheng <[email protected]>
1 parent 32df410 commit 1738a58

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

net/http/client.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,10 @@ class ClientImpl : public Client {
224224
LOG_ERROR_RETURN(EINVAL, ROUNDTRIP_FAILED,
225225
"Content-Length and Transfer-Encoding conflicted");
226226
}
227-
op->req.headers.insert("User-Agent", USERAGENT);
228-
op->req.headers.insert("Connection", "keep-alive");
229227
op->req.headers.merge(m_common_headers);
228+
op->req.headers.insert("User-Agent", m_user_agent.empty() ? std::string_view(USERAGENT)
229+
: std::string_view(m_user_agent));
230+
op->req.headers.insert("Connection", "keep-alive");
230231
if (m_cookie_jar && m_cookie_jar->set_cookies_to_headers(&op->req) != 0)
231232
LOG_ERROR_RETURN(0, -1, "set_cookies_to_headers failed");
232233
Timeout tmo(std::min(op->timeout.timeout(), m_timeout));

net/http/client.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ class Client : public Object {
109109
m_proxy_url.from_string(proxy);
110110
m_proxy = true;
111111
}
112+
void set_user_agent(std::string_view user_agent) {
113+
m_user_agent = std::string(user_agent);
114+
}
112115
StoredURL* get_proxy() {
113116
return &m_proxy_url;
114117
}
@@ -129,6 +132,7 @@ class Client : public Object {
129132
bool secure = false, uint64_t timeout = -1UL) = 0;
130133
protected:
131134
StoredURL m_proxy_url;
135+
std::string m_user_agent;
132136
uint64_t m_timeout = -1UL;
133137
bool m_proxy = false;
134138
};

net/http/test/client_function_test.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,46 @@ TEST(http_client, partial_body) {
512512
EXPECT_EQ(true, buf == "http_clien");
513513
}
514514

515+
int ua_check_handler(void*, Request &req, Response &resp, std::string_view) {
516+
auto ua = req.headers["User-Agent"];
517+
LOG_DEBUG(VALUE(ua));
518+
EXPECT_EQ(ua, "TEST_UA");
519+
resp.set_result(200);
520+
std::string str = "success";
521+
resp.headers.content_length(7);
522+
resp.write((void*)str.data(), str.size());
523+
return 0;
524+
}
525+
526+
527+
TEST(http_client, user_agent) {
528+
auto tcpserver = new_tcp_socket_server();
529+
DEFER(delete tcpserver);
530+
tcpserver->bind(18731);
531+
tcpserver->listen();
532+
auto server = new_http_server();
533+
DEFER(delete server);
534+
server->add_handler({nullptr, &ua_check_handler});
535+
tcpserver->set_handler(server->get_connection_handler());
536+
tcpserver->start_loop();
537+
538+
std::string target_get = "http://localhost:18731/file";
539+
auto client = new_http_client();
540+
client->set_user_agent("TEST_UA");
541+
DEFER(delete client);
542+
auto op = client->new_operation(Verb::GET, target_get);
543+
DEFER(delete op);
544+
op->req.headers.content_length(0);
545+
client->call(op);
546+
EXPECT_EQ(op->status_code, 200);
547+
std::string buf;
548+
buf.resize(op->resp.headers.content_length());
549+
op->resp.read((void*)buf.data(), op->resp.headers.content_length());
550+
LOG_DEBUG(VALUE(buf));
551+
EXPECT_EQ(true, buf == "success");
552+
}
553+
554+
515555
TEST(url, url_escape_unescape) {
516556
EXPECT_EQ(
517557
url_escape("?a=x:b&b=cd&c= feg&d=2/1[+]@alibaba.com&e='!bad';"),

0 commit comments

Comments
 (0)