@@ -202,11 +202,12 @@ namespace crow
202202 using self_t = Crow;
203203
204204 // / \brief The HTTP server
205- using server_t = Server<Crow, SocketAdaptor, Middlewares...>;
206-
205+ using server_t = Server<Crow, TCPAcceptor, SocketAdaptor, Middlewares...>;
206+ // / \brief An HTTP server that runs on unix domain socket
207+ using unix_server_t = Server<Crow, UnixSocketAcceptor, UnixSocketAdaptor, Middlewares...>;
207208#ifdef CROW_ENABLE_SSL
208209 // / \brief An HTTP server that runs on SSL with an SSLAdaptor
209- using ssl_server_t = Server<Crow, SSLAdaptor, Middlewares...>;
210+ using ssl_server_t = Server<Crow, TCPAcceptor, SSLAdaptor, Middlewares...>;
210211#endif
211212 Crow ()
212213 {}
@@ -349,6 +350,20 @@ namespace crow
349350 return bindaddr_;
350351 }
351352
353+ // / \brief Disable tcp/ip and use unix domain socket instead
354+ self_t & local_socket_path (std::string path)
355+ {
356+ bindaddr_ = path;
357+ use_unix_ = true ;
358+ return *this ;
359+ }
360+
361+ // / \brief Get the unix domain socket path
362+ std::string local_socket_path ()
363+ {
364+ return bindaddr_;
365+ }
366+
352367 // / \brief Run the server on multiple threads using all available threads
353368 self_t & multithreaded ()
354369 {
@@ -506,16 +521,17 @@ namespace crow
506521#endif
507522 validate ();
508523
509- error_code ec;
510- asio::ip::address addr = asio::ip::make_address (bindaddr_,ec);
511- if (ec){
512- CROW_LOG_ERROR << ec.message () << " - Can not create valid ip address from string: \" " << bindaddr_ << " \" " ;
513- return ;
514- }
515- tcp::endpoint endpoint (addr, port_);
516524#ifdef CROW_ENABLE_SSL
517525 if (ssl_used_)
518526 {
527+
528+ error_code ec;
529+ asio::ip::address addr = asio::ip::make_address (bindaddr_,ec);
530+ if (ec){
531+ CROW_LOG_ERROR << ec.message () << " - Can not create valid ip address from string: \" " << bindaddr_ << " \" " ;
532+ return ;
533+ }
534+ tcp::endpoint endpoint (addr, port_);
519535 router_.using_ssl = true ;
520536 ssl_server_ = std::move (std::unique_ptr<ssl_server_t >(new ssl_server_t (this , endpoint, server_name_, &middlewares_, concurrency_, timeout_, &ssl_context_)));
521537 ssl_server_->set_tick_function (tick_interval_, tick_function_);
@@ -530,14 +546,36 @@ namespace crow
530546 else
531547#endif
532548 {
533- server_ = std::move (std::unique_ptr<server_t >(new server_t (this , endpoint, server_name_, &middlewares_, concurrency_, timeout_, nullptr )));
534- server_->set_tick_function (tick_interval_, tick_function_);
535- for (auto snum : signals_)
549+ if (use_unix_)
536550 {
537- server_->signal_add (snum);
551+ UnixSocketAcceptor::endpoint endpoint (bindaddr_);
552+ unix_server_ = std::move (std::unique_ptr<unix_server_t >(new unix_server_t (this , endpoint, server_name_, &middlewares_, concurrency_, timeout_, nullptr )));
553+ unix_server_->set_tick_function (tick_interval_, tick_function_);
554+ for (auto snum : signals_)
555+ {
556+ unix_server_->signal_add (snum);
557+ }
558+ notify_server_start ();
559+ unix_server_->run ();
560+ }
561+ else
562+ {
563+ error_code ec;
564+ asio::ip::address addr = asio::ip::make_address (bindaddr_,ec);
565+ if (ec){
566+ CROW_LOG_ERROR << ec.message () << " - Can not create valid ip address from string: \" " << bindaddr_ << " \" " ;
567+ return ;
568+ }
569+ TCPAcceptor::endpoint endpoint (addr, port_);
570+ server_ = std::move (std::unique_ptr<server_t >(new server_t (this , endpoint, server_name_, &middlewares_, concurrency_, timeout_, nullptr )));
571+ server_->set_tick_function (tick_interval_, tick_function_);
572+ for (auto snum : signals_)
573+ {
574+ server_->signal_add (snum);
575+ }
576+ notify_server_start ();
577+ server_->run ();
538578 }
539- notify_server_start ();
540- server_->run ();
541579 }
542580 }
543581
@@ -565,6 +603,7 @@ namespace crow
565603 {
566604 close_websockets ();
567605 if (server_) { server_->stop (); }
606+ if (unix_server_) { unix_server_->stop (); }
568607 }
569608 }
570609
@@ -717,12 +756,12 @@ namespace crow
717756 status = cv_started_.wait_until (lock, wait_until);
718757 }
719758 }
720-
721759 if (status == std::cv_status::no_timeout)
722760 {
723- if (server_)
724- {
761+ if (server_) {
725762 status = server_->wait_for_start (wait_until);
763+ } else if (unix_server_) {
764+ status = unix_server_->wait_for_start (wait_until);
726765 }
727766#ifdef CROW_ENABLE_SSL
728767 else if (ssl_server_)
@@ -767,6 +806,7 @@ namespace crow
767806 uint64_t max_payload_{UINT64_MAX };
768807 std::string server_name_ = std::string(" Crow/" ) + VERSION ;
769808 std::string bindaddr_ = " 0.0.0.0" ;
809+ bool use_unix_ = false ;
770810 size_t res_stream_threshold_ = 1048576 ;
771811 Router router_;
772812 bool static_routes_added_{false };
@@ -788,6 +828,7 @@ namespace crow
788828#endif
789829
790830 std::unique_ptr<server_t > server_;
831+ std::unique_ptr<unix_server_t > unix_server_;
791832
792833 std::vector<int > signals_{SIGINT , SIGTERM };
793834
0 commit comments