Browse Source

Add get_socket_fd method to Client and ClientImpl, add according unit… (#1341)

* Add get_socket_fd method to Client and ClientImpl, add according unit test

* Change name get_socket_fd to get_socket

* Change name get_socket to socket

Co-authored-by: ata.yardimci <[email protected]>
Rockybilly 3 years ago
parent
commit
0b541ffebc
2 changed files with 47 additions and 0 deletions
  1. 10 0
      httplib.h
  2. 37 0
      test/test.cc

+ 10 - 0
httplib.h

@@ -992,6 +992,8 @@ public:
 
 
   size_t is_socket_open() const;
   size_t is_socket_open() const;
 
 
+  socket_t socket() const;
+
   void stop();
   void stop();
 
 
   void set_hostname_addr_map(std::map<std::string, std::string> addr_map);
   void set_hostname_addr_map(std::map<std::string, std::string> addr_map);
@@ -1344,6 +1346,8 @@ public:
 
 
   size_t is_socket_open() const;
   size_t is_socket_open() const;
 
 
+  socket_t socket() const;
+
   void stop();
   void stop();
 
 
   void set_hostname_addr_map(std::map<std::string, std::string> addr_map);
   void set_hostname_addr_map(std::map<std::string, std::string> addr_map);
@@ -6944,6 +6948,10 @@ inline size_t ClientImpl::is_socket_open() const {
   return socket_.is_open();
   return socket_.is_open();
 }
 }
 
 
+inline socket_t ClientImpl::socket() const {
+  return socket_.sock;
+}
+
 inline void ClientImpl::stop() {
 inline void ClientImpl::stop() {
   std::lock_guard<std::mutex> guard(socket_mutex_);
   std::lock_guard<std::mutex> guard(socket_mutex_);
 
 
@@ -8151,6 +8159,8 @@ inline Result Client::send(const Request &req) { return cli_->send(req); }
 
 
 inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); }
 inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); }
 
 
+inline socket_t Client::socket() const { return cli_->socket(); }
+
 inline void Client::stop() { cli_->stop(); }
 inline void Client::stop() { cli_->stop(); }
 
 
 inline void
 inline void

+ 37 - 0
test/test.cc

@@ -4750,6 +4750,43 @@ TEST(SendAPI, SimpleInterface_Online) {
   EXPECT_EQ(301, res->status);
   EXPECT_EQ(301, res->status);
 }
 }
 
 
+TEST(ClientImplMethods, GetSocketTest) {
+  httplib::Server svr;
+  svr.Get( "/", [&](const httplib::Request& req, httplib::Response& res) {
+    res.status = 200;
+  });
+
+  auto thread = std::thread([&]() { svr.listen("127.0.0.1", 3333); });
+
+  while (!svr.is_running()) {
+    std::this_thread::sleep_for(std::chrono::milliseconds(5));
+  }
+
+  {
+    httplib::Client cli("http://127.0.0.1:3333");
+    cli.set_keep_alive(true);
+
+    // Use the behavior of cpp-httplib of opening the connection
+    // only when the first request happens. If that changes,
+    // this test would be obsolete.
+
+    EXPECT_EQ(cli.socket(), INVALID_SOCKET);
+
+    // This also implicitly tests the server. But other tests would fail much
+    // earlier than this one to be considered.
+
+    auto res = cli.Get("/");
+    ASSERT_TRUE(res);
+
+    EXPECT_EQ(200, res->status);
+    ASSERT_TRUE(cli.socket() != INVALID_SOCKET);
+  }
+
+  svr.stop();
+  thread.join();
+  ASSERT_FALSE(svr.is_running());
+}
+
 // Disabled due to out-of-memory problem on GitHub Actions
 // Disabled due to out-of-memory problem on GitHub Actions
 #ifdef _WIN64
 #ifdef _WIN64
 TEST(ServerLargeContentTest, DISABLED_SendLargeContent) {
 TEST(ServerLargeContentTest, DISABLED_SendLargeContent) {