36 class JHttpServer final:
37 public std::enable_shared_from_this<JHttpServer>,
38 public Poco::Net::HTTPRequestHandlerFactory
41 JHttpServer(
size_t httpMaxThreads,
size_t httpMaxRequestQueue );
45 void start(
const std::string& host,
int port );
47 void softStop(std::chrono::milliseconds timeout);
49 void setProcessTimeout(std::chrono::milliseconds d)
noexcept
53 std::chrono::milliseconds processTimeout()
const noexcept
55 return processTimeout_;
58 inline std::shared_ptr<DebugStream> log()
noexcept
63 class Factory :
public HTTPRequestHandlerFactory
66 Factory( JHttpServer* s ): srv(s) {}
68 Poco::Net::HTTPRequestHandler* createRequestHandler(
const Poco::Net::HTTPServerRequest& req)
override
70 return srv->createRequestHandler(req);
81 std::vector<std::pair<std::string, std::string>> headers;
88 std::string reason =
"OK";
89 std::vector<std::pair<std::string, std::string>> headers;
96 bool finished =
false;
101 void httpLoop( HandlerFn& fn,
size_t count, std::chrono::milliseconds& timeout );
103 void setMaxQueueSize(
size_t n)
noexcept
105 queue_.setMaxSize(n);
115 std::promise<ResponseSnapshot> prom;
121 std::lock_guard<std::mutex> lk(m_);
123 if (maxSize_ > 0 && q_.size() >= maxSize_)
return false;
125 q_.emplace(std::move(j));
132 bool pop(Job& out, std::chrono::milliseconds timeout)
134 std::unique_lock<std::mutex> lk(m_);
136 bool ret = cv_.wait_for(lk, timeout, [&]
138 return stop_ || !q_.empty();
144 if(stop_ && q_.empty())
147 out = std::move(q_.front());
155 std::lock_guard<std::mutex> lk(m_);
159 void setMaxSize(
size_t n)
noexcept
167 std::lock_guard<std::mutex> lk(m_);
174 mutable std::mutex m_;
175 std::condition_variable cv_;
183 Poco::Net::HTTPRequestHandler* createRequestHandler(
const Poco::Net::HTTPServerRequest& )
override;
186 Poco::Net::SocketAddress sa;
187 std::shared_ptr<Poco::Net::HTTPServer> http;
188 std::shared_ptr<DebugStream> mylog;
189 std::atomic_bool started;
192 std::chrono::milliseconds processTimeout_{std::chrono::seconds(10)};
195 std::atomic_bool started_{
false};
196 std::atomic_bool workerRunning_{
false};
197 std::atomic_bool softStopping_{
false};
198 std::atomic_bool workerBusy_{
false};
199 std::condition_variable cvStop_;
200 std::mutex cvStopMutex_;
202 size_t httpMaxThreads = { 3 };
203 size_t httpMaxRequestQueue = { 50 };