Simple-Web-Server icon indicating copy to clipboard operation
Simple-Web-Server copied to clipboard

Create common, polymorphic base class for HTTP/HTTPSServer

Open ttislerdg opened this issue 7 years ago • 6 comments

Addresses Issue #168

Removed templating on ServerBase and inner classes. Created virtual methods for those using sockets Subclassed Response and Connection for HTTP/HTTPS

All code and functionality should be identical, just reorganized to make the base class possible

ttislerdg avatar Feb 06 '18 12:02 ttislerdg

Sorry for the late reply, but thank you for this.

I have not yet had time to study the changes, but hopefully I will get a look at it soon.

eidheim avatar Feb 14 '18 09:02 eidheim

I went a slightly different direction in https://github.com/eidheim/Simple-Web-Server/tree/base_class. Not sure what solution is best, but at least I know it is doable:)

eidheim avatar Feb 16 '18 14:02 eidheim

Your method looks cleaner. I like that there is minimal duplicated code. That's something I hadn't given enough effort to avoiding.

So to make sure, I'd do something like this to create the server

SimpleWeb::ServerInterface* server = https ?
         new SimpleWeb::Server<SimpleWeb::HTTPS>(cert, key) :
         new SimpleWeb::Server<SimpleWeb::HTTP>();

and then access the methods like before

  server->default_resource["GET"] = [this](std::shared_ptr<SimpleWeb::ServerInterface::Response> response,
                                           std::shared_ptr<SimpleWeb::ServerInterface::Request> request) { }

ttislerdg avatar Feb 16 '18 14:02 ttislerdg

Yes, for instance:

#include "client_https.hpp"
#include "server_https.hpp"
#include <vector>

int main() {
  auto io_service = std::make_shared<SimpleWeb::asio::io_service>();
  std::vector<std::unique_ptr<SimpleWeb::ServerInterface>> servers;

  servers.emplace_back(new SimpleWeb::Server<SimpleWeb::HTTP>());
  servers.back()->io_service = io_service;
  servers.back()->config.port = 8080;
  servers.back()->default_resource["GET"] = [](std::shared_ptr<SimpleWeb::ServerInterface::Response> response,
                                               std::shared_ptr<SimpleWeb::ServerInterface::Request> /*request*/) {
    response->write("Hello World");
  };

  servers.emplace_back(new SimpleWeb::Server<SimpleWeb::HTTPS>("server.crt", "server.key"));
  servers.back()->io_service = io_service;
  servers.back()->config.port = 8081;
  servers.back()->default_resource["GET"] = servers[0]->default_resource["GET"];

  for(auto &server : servers)
    server->start();

  io_service->run();
}

Although I'll probably change the names ServerInterface and ServerBase. Have to have a look what is common to use in such cases.

eidheim avatar Feb 16 '18 17:02 eidheim

For the time being, I changed it so that one now can write:

#include "client_https.hpp"
#include "server_https.hpp"
#include <vector>

int main() {
  auto io_service = std::make_shared<SimpleWeb::asio::io_service>();
  std::vector<std::unique_ptr<SimpleWeb::ServerBase>> servers;

  servers.emplace_back(new SimpleWeb::Server<SimpleWeb::HTTP>());
  servers.back()->io_service = io_service;
  servers.back()->config.port = 8080;
  servers.back()->default_resource["GET"] = [](std::shared_ptr<SimpleWeb::Server<>::Response> response,
                                               std::shared_ptr<SimpleWeb::Server<>::Request> /*request*/) {
    response->write("Hello World");
  };

  servers.emplace_back(new SimpleWeb::Server<SimpleWeb::HTTPS>("server.crt", "server.key"));
  servers.back()->io_service = io_service;
  servers.back()->config.port = 8081;
  servers.back()->default_resource["GET"] = servers[0]->default_resource["GET"];

  for(auto &server : servers)
    server->start();

  io_service->run();
}

The class name ServerTemplate bothers me though.

eidheim avatar Feb 16 '18 18:02 eidheim

I managed to simplify https://github.com/eidheim/Simple-Web-Server/tree/base_class further by splitting the Response class instead of the Connection class.

eidheim avatar Feb 17 '18 09:02 eidheim