cppwebserver.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. Copyright 2017 Herik Lima de Castro and Marcelo Medeiros Eler
  3. Distributed under MIT license, or public domain if desired and
  4. recognized in your jurisdiction.
  5. See file LICENSE for detail.
  6. */
  7. #include "cppwebserver.h"
  8. #include "sslloader.h"
  9. CWF_BEGIN_NAMESPACE
  10. CppWebServer::CppWebServer(const Configuration &configuration, Filter *filter)
  11. : configuration(configuration)
  12. , filter(filter)
  13. {
  14. ssl = SslLoader(configuration).getSslConfiguration();
  15. this->thread()->setPriority(QThread::TimeCriticalPriority);
  16. pool.setMaxThreadCount(configuration.getMaxThread());
  17. pool.setExpiryTimeout(configuration.getTimeOut());
  18. if (!filter) {
  19. this->filter = new Filter;
  20. }
  21. timer = new QTimer;
  22. connect(timer, &QTimer::timeout, this, &CppWebServer::doClean);
  23. timer->start(configuration.getCleanupInterval());
  24. }
  25. CppWebServer::~CppWebServer()
  26. {
  27. while (!pool.waitForDone()) {
  28. }
  29. std::for_each(urlController.constBegin(), urlController.constEnd(), [](Controller *i) {
  30. delete i;
  31. });
  32. std::for_each(sessions.constBegin(), sessions.constEnd(), [](Session *i) { delete i; });
  33. delete filter;
  34. delete ssl;
  35. }
  36. void CppWebServer::incomingConnection(qintptr socketfd)
  37. {
  38. while (block) {
  39. this->thread()->msleep(static_cast<unsigned long>(sleepTime));
  40. }
  41. pool.start(new HttpReadRequest(socketfd, urlController, sessions, configuration, ssl, filter),
  42. QThread::LowPriority);
  43. }
  44. void CppWebServer::doClean()
  45. {
  46. block = 1;
  47. while (!pool.waitForDone(sleepTime)) {
  48. }
  49. Session *session = nullptr;
  50. QStringList idSessionsToDelete;
  51. for (auto it = sessions.begin(); it != sessions.end(); ++it) {
  52. session = it.value();
  53. if (session->isExpired()) {
  54. idSessionsToDelete.push_back(session->getId());
  55. delete session;
  56. }
  57. }
  58. for (int i = 0; i < idSessionsToDelete.size(); ++i) {
  59. sessions.remove(idSessionsToDelete[i]);
  60. }
  61. block = 0;
  62. }
  63. CWF_END_NAMESPACE