Browse Source

Merge branch 'master' of https://github.com/yhirose/cpp-httplib

yhirose 5 years ago
parent
commit
cf386f97fd
2 changed files with 38 additions and 0 deletions
  1. 5 0
      httplib.h
  2. 33 0
      test/test.cc

+ 5 - 0
httplib.h

@@ -1469,6 +1469,11 @@ socket_t create_socket(const char *host, int port, Fn fn,
     int yes = 1;
     int yes = 1;
     setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&yes),
     setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&yes),
                sizeof(yes));
                sizeof(yes));
+
+    int no = 0;
+    setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char *>(&no),
+               sizeof(no));
+
 #ifdef SO_REUSEPORT
 #ifdef SO_REUSEPORT
     setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast<char *>(&yes),
     setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast<char *>(&yes),
                sizeof(yes));
                sizeof(yes));

+ 33 - 0
test/test.cc

@@ -724,6 +724,39 @@ TEST(RedirectToDifferentPort, Redirect) {
 }
 }
 #endif
 #endif
 
 
+TEST(Server, BindDualStack) {
+  Server svr;
+
+  svr.Get("/1", [&](const Request & /*req*/, Response &res) {
+    res.set_content("Hello World!", "text/plain");
+  });
+
+  auto thread = std::thread([&]() { svr.listen("::", PORT); });
+
+  // Give GET time to get a few messages.
+  std::this_thread::sleep_for(std::chrono::seconds(1));
+
+  {
+    Client cli("127.0.0.1", PORT);
+
+    auto res = cli.Get("/1");
+    ASSERT_TRUE(res != nullptr);
+    EXPECT_EQ(200, res->status);
+    EXPECT_EQ(res->body, "Hello World!");
+  }
+  {
+    Client cli("::1", PORT);
+
+    auto res = cli.Get("/1");
+    ASSERT_TRUE(res != nullptr);
+    EXPECT_EQ(200, res->status);
+    EXPECT_EQ(res->body, "Hello World!");
+  }
+  svr.stop();
+  thread.join();
+  ASSERT_FALSE(svr.is_running());
+}
+
 TEST(Server, BindAndListenSeparately) {
 TEST(Server, BindAndListenSeparately) {
   Server svr;
   Server svr;
   int port = svr.bind_to_any_port("0.0.0.0");
   int port = svr.bind_to_any_port("0.0.0.0");