@@ -61,6 +61,21 @@ int timeout_writer(void *self, IStream* stream) {
6161 return 0 ;
6262}
6363
64+ class SimpleHandler : public http ::HTTPHandler {
65+ public:
66+ int handle_request (http::Request& req, http::Response& resp, std::string_view) {
67+ std::string url_path (req.target ());
68+ resp.set_result (200 );
69+ resp.headers .content_length (url_path.size ());
70+ resp.headers .insert (" Content-Type" , " application/octet-stream" );
71+ auto n = resp.write (url_path.data (), url_path.size ());
72+ if (n != (ssize_t ) url_path.size ()) {
73+ LOG_ERRNO_RETURN (0 , -1 , " send body failed" );
74+ }
75+ return 0 ;
76+ }
77+ };
78+
6479TEST (http_client, get) {
6580 system (" mkdir -p /tmp/ease_ut/http_test/" );
6681 system (" echo \" this is a http_client request body text for socket stream\" > /tmp/ease_ut/http_test/ease-httpclient-gettestfile" );
@@ -523,6 +538,41 @@ TEST(DISABLED_http_client, ipv6) { // make sure runing in a ipv6-ready environm
523538 EXPECT_EQ (200 , op->resp .status_code ());
524539}
525540
541+ TEST (http_client, unix_socket) {
542+ const char * uds_path = " test-http-client.sock" ;
543+
544+ auto http_server = new_http_server ();
545+ DEFER (delete http_server);
546+ http_server->add_handler (new SimpleHandler, true , " /simple-api" );
547+
548+ auto socket_server = new_uds_server (true );
549+ DEFER (delete socket_server);
550+
551+ socket_server->set_handler (http_server->get_connection_handler ());
552+ ASSERT_EQ (0 , socket_server->bind (uds_path));
553+ ASSERT_EQ (0 , socket_server->listen ());
554+ ASSERT_EQ (0 , socket_server->start_loop (false ));
555+
556+ auto client = new_http_client ();
557+ DEFER (delete client);
558+
559+ Client::OperationOnStack<> op (client, Verb::GET , " http://localhost/simple-api" );
560+ int ret = op.call (uds_path);
561+ ASSERT_EQ (0 , ret);
562+ ASSERT_EQ (200 , op.resp .status_code ());
563+
564+ char buf[UINT16_MAX ];
565+ ssize_t n = op.resp .read (buf, op.resp .body_size ());
566+ ASSERT_EQ (n, (ssize_t ) op.resp .body_size ());
567+ LOG_INFO (buf);
568+
569+ // A wrong hostname or HTTPS doesn't have effect on unix socket
570+ Client::OperationOnStack<> op2 (client, Verb::GET , " https://www.wrong.hostname/simple-api" );
571+ ret = op2.call (uds_path);
572+ ASSERT_EQ (0 , ret);
573+ ASSERT_EQ (200 , op2.resp .status_code ());
574+ }
575+
526576TEST (url, url_escape_unescape) {
527577 EXPECT_EQ (
528578 url_escape (" ?a=x:b&b=cd&c= feg&d=2/1[+]@alibaba.com&e='!bad';" ),
@@ -582,5 +632,5 @@ int main(int argc, char** arg) {
582632#endif
583633 set_log_output_level (ALOG_INFO );
584634 ::testing::InitGoogleTest (&argc, arg);
585- LOG_DEBUG ( " test result:` " , RUN_ALL_TESTS () );
635+ return RUN_ALL_TESTS ();
586636}
0 commit comments