You've already forked cpp-httplib
							
							Fix EventDispatcher problem (#2257)
This commit is contained in:
		@@ -14,11 +14,18 @@ class EventDispatcher {
 | 
				
			|||||||
public:
 | 
					public:
 | 
				
			||||||
  EventDispatcher() {}
 | 
					  EventDispatcher() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void wait_event(DataSink *sink) {
 | 
					  bool wait_event(DataSink *sink) {
 | 
				
			||||||
    unique_lock<mutex> lk(m_);
 | 
					    unique_lock<mutex> lk(m_);
 | 
				
			||||||
    int id = id_;
 | 
					    int id = id_;
 | 
				
			||||||
    cv_.wait(lk, [&] { return cid_ == id; });
 | 
					
 | 
				
			||||||
 | 
					    // Wait with timeout to prevent hanging if client disconnects
 | 
				
			||||||
 | 
					    if (!cv_.wait_for(lk, std::chrono::seconds(5),
 | 
				
			||||||
 | 
					                      [&] { return cid_ == id; })) {
 | 
				
			||||||
 | 
					      return false; // Timeout occurred
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sink->write(message_.data(), message_.size());
 | 
					    sink->write(message_.data(), message_.size());
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void send_event(const string &message) {
 | 
					  void send_event(const string &message) {
 | 
				
			||||||
@@ -71,8 +78,7 @@ int main(void) {
 | 
				
			|||||||
    cout << "connected to event1..." << endl;
 | 
					    cout << "connected to event1..." << endl;
 | 
				
			||||||
    res.set_chunked_content_provider("text/event-stream",
 | 
					    res.set_chunked_content_provider("text/event-stream",
 | 
				
			||||||
                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
					                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
				
			||||||
                                       ed.wait_event(&sink);
 | 
					                                       return ed.wait_event(&sink);
 | 
				
			||||||
                                       return true;
 | 
					 | 
				
			||||||
                                     });
 | 
					                                     });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -80,8 +86,7 @@ int main(void) {
 | 
				
			|||||||
    cout << "connected to event2..." << endl;
 | 
					    cout << "connected to event2..." << endl;
 | 
				
			||||||
    res.set_chunked_content_provider("text/event-stream",
 | 
					    res.set_chunked_content_provider("text/event-stream",
 | 
				
			||||||
                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
					                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
				
			||||||
                                       ed.wait_event(&sink);
 | 
					                                       return ed.wait_event(&sink);
 | 
				
			||||||
                                       return true;
 | 
					 | 
				
			||||||
                                     });
 | 
					                                     });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								test/test.cc
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								test/test.cc
									
									
									
									
									
								
							@@ -11043,11 +11043,18 @@ class EventDispatcher {
 | 
				
			|||||||
public:
 | 
					public:
 | 
				
			||||||
  EventDispatcher() {}
 | 
					  EventDispatcher() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void wait_event(DataSink *sink) {
 | 
					  bool wait_event(DataSink *sink) {
 | 
				
			||||||
    unique_lock<mutex> lk(m_);
 | 
					    unique_lock<mutex> lk(m_);
 | 
				
			||||||
    int id = id_;
 | 
					    int id = id_;
 | 
				
			||||||
    cv_.wait(lk, [&] { return cid_ == id; });
 | 
					
 | 
				
			||||||
 | 
					    // Wait with timeout to prevent hanging if client disconnects
 | 
				
			||||||
 | 
					    if (!cv_.wait_for(lk, std::chrono::seconds(5),
 | 
				
			||||||
 | 
					                      [&] { return cid_ == id; })) {
 | 
				
			||||||
 | 
					      return false; // Timeout occurred
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sink->write(message_.data(), message_.size());
 | 
					    sink->write(message_.data(), message_.size());
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void send_event(const string &message) {
 | 
					  void send_event(const string &message) {
 | 
				
			||||||
@@ -11072,8 +11079,7 @@ TEST(ClientInThreadTest, Issue2068) {
 | 
				
			|||||||
  svr.Get("/event1", [&](const Request & /*req*/, Response &res) {
 | 
					  svr.Get("/event1", [&](const Request & /*req*/, Response &res) {
 | 
				
			||||||
    res.set_chunked_content_provider("text/event-stream",
 | 
					    res.set_chunked_content_provider("text/event-stream",
 | 
				
			||||||
                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
					                                     [&](size_t /*offset*/, DataSink &sink) {
 | 
				
			||||||
                                       ed.wait_event(&sink);
 | 
					                                       return ed.wait_event(&sink);
 | 
				
			||||||
                                       return true;
 | 
					 | 
				
			||||||
                                     });
 | 
					                                     });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -11116,9 +11122,11 @@ TEST(ClientInThreadTest, Issue2068) {
 | 
				
			|||||||
    std::this_thread::sleep_for(std::chrono::seconds(2));
 | 
					    std::this_thread::sleep_for(std::chrono::seconds(2));
 | 
				
			||||||
    stop = true;
 | 
					    stop = true;
 | 
				
			||||||
    client->stop();
 | 
					    client->stop();
 | 
				
			||||||
    client.reset();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    t.join();
 | 
					    t.join();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Reset client after thread has finished
 | 
				
			||||||
 | 
					    client.reset();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user