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
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;
116 std::shared_ptr<std::atomic<bool>> cancelled = std::make_shared<std::atomic<bool>>(
false);
122 std::lock_guard<std::mutex> lk(m_);
124 if (maxSize_ > 0 && q_.size() >= maxSize_)
return false;
126 q_.emplace(std::move(j));
133 bool pop(Job& out, std::chrono::milliseconds timeout)
135 std::unique_lock<std::mutex> lk(m_);
137 bool ret = cv_.wait_for(lk, timeout, [&]
139 return stop_ || !q_.empty();
145 if(stop_ && q_.empty())
148 out = std::move(q_.front());
156 std::lock_guard<std::mutex> lk(m_);
160 void setMaxSize(
size_t n)
noexcept
168 std::lock_guard<std::mutex> lk(m_);
174 void clear(
int status,
const std::string& reason,
const std::string& body)
176 std::lock_guard<std::mutex> lk(m_);
180 auto& job = q_.front();
181 ResponseSnapshot resp;
182 resp.status = status;
183 resp.reason = reason;
184 resp.headers = { {
"Content-Type",
"text/plain"} };
189 job.prom.set_value(std::move(resp));
199 std::lock_guard<std::mutex> lk(m_);
204 mutable std::mutex m_;
205 std::condition_variable cv_;
212 friend class Factory;
213 Poco::Net::HTTPRequestHandler* createRequestHandler(
const Poco::Net::HTTPServerRequest& )
override;
216 Poco::Net::SocketAddress sa;
217 std::shared_ptr<Poco::Net::HTTPServer> http;
218 std::shared_ptr<DebugStream> mylog;
219 std::atomic_bool started;
222 std::chrono::milliseconds processTimeout_{std::chrono::seconds(10)};
225 std::atomic_bool workerRunning_{
false};
226 std::atomic_bool softStopping_{
false};
227 std::atomic_bool workerBusy_{
false};
228 std::condition_variable cvStop_;
229 std::mutex cvStopMutex_;
231 size_t httpMaxThreads = { 3 };
232 size_t httpMaxRequestQueue = { 50 };