From 1992bbb4b4126cb61f46fcd8e02059c9a490183a Mon Sep 17 00:00:00 2001 From: eidheim Date: Mon, 3 Jul 2017 15:02:35 +0200 Subject: [PATCH] Preparation for std::enable_shared_from_this: Server- and Client-constructors are no longer public, use ::create instead --- client_http.hpp | 13 +++++- client_https.hpp | 15 ++++-- http_examples.cpp | 34 +++++++------- https_examples.cpp | 36 +++++++-------- server_http.hpp | 12 ++++- server_https.hpp | 27 +++++++---- tests/io_test.cpp | 108 +++++++++++++++++++++---------------------- tests/parse_test.cpp | 16 +++---- 8 files changed, 147 insertions(+), 114 deletions(-) diff --git a/client_http.hpp b/client_http.hpp index 2c003c4..b52a209 100644 --- a/client_http.hpp +++ b/client_http.hpp @@ -34,6 +34,9 @@ namespace SimpleWeb { template class ClientBase { + ClientBase(const ClientBase &) = delete; + ClientBase &operator=(const ClientBase &) = delete; + public: class Content : public std::istream { friend class ClientBase; @@ -538,12 +541,18 @@ namespace SimpleWeb { template <> class Client : public ClientBase { - public: friend ClientBase; + Client(const Client &) = delete; + Client &operator=(const Client &) = delete; - Client(const std::string &server_port_path) : ClientBase::ClientBase(server_port_path, 80) {} + public: + static std::shared_ptr create(const std::string &server_port_path) { + return std::shared_ptr(new Client(server_port_path)); + } protected: + Client(const std::string &server_port_path) : ClientBase::ClientBase(server_port_path, 80) {} + std::shared_ptr create_connection() override { return std::make_shared(host, port, config, std::unique_ptr(new HTTP(*io_service))); } diff --git a/client_https.hpp b/client_https.hpp index a5069fa..7acbc22 100644 --- a/client_https.hpp +++ b/client_https.hpp @@ -14,11 +14,19 @@ namespace SimpleWeb { template <> class Client : public ClientBase { - public: friend ClientBase; + Client(const Client &) = delete; + Client &operator=(const Client &) = delete; - Client(const std::string &server_port_path, bool verify_certificate = true, const std::string &cert_file = std::string(), - const std::string &private_key_file = std::string(), const std::string &verify_file = std::string()) + public: + static std::shared_ptr create(const std::string &server_port_path, bool verify_certificate = true, const std::string &cert_file = std::string(), + const std::string &private_key_file = std::string(), const std::string &verify_file = std::string()) { + return std::shared_ptr(new Client(server_port_path, verify_certificate, cert_file, private_key_file, verify_file)); + } + + protected: + Client(const std::string &server_port_path, bool verify_certificate, const std::string &cert_file, + const std::string &private_key_file, const std::string &verify_file) : ClientBase::ClientBase(server_port_path, 443), context(asio::ssl::context::tlsv12) { if(cert_file.size() > 0 && private_key_file.size() > 0) { context.use_certificate_chain_file(cert_file); @@ -39,7 +47,6 @@ namespace SimpleWeb { context.set_verify_mode(asio::ssl::verify_none); } - protected: asio::ssl::context context; std::shared_ptr create_connection() override { diff --git a/http_examples.cpp b/http_examples.cpp index db7f4c7..6434f21 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -29,12 +29,12 @@ int main() { //HTTP-server at port 8080 using 1 thread //Unless you do more heavy non-threaded processing in the resources, //1 thread is usually faster than several threads - HttpServer server; - server.config.port = 8080; + auto server = HttpServer::create(); + server->config.port = 8080; //Add resources using path-regex and method-string, and an anonymous function //POST-example for the path /string, responds the posted string - server.resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { //Retrieve string: auto content = request->content.string(); //request->content.string() is a convenience function for: @@ -58,7 +58,7 @@ int main() { // "lastName": "Smith", // "age": 25 //} - server.resource["^/json$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/json$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { try { ptree pt; read_json(request->content, pt); @@ -90,7 +90,7 @@ int main() { //GET-example for the path /info //Responds with request-information - server.resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { stringstream stream; stream << "

Request from " << request->remote_endpoint_address << " (" << request->remote_endpoint_port << ")

"; stream << request->method << " " << request->path << " HTTP/" << request->http_version << "
"; @@ -115,7 +115,7 @@ int main() { //GET-example for the path /match/[number], responds with the matched string in path (number) //For instance a request GET /match/123 will receive: 123 - server.resource["^/match/([0-9]+)$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/match/([0-9]+)$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { string number = request->path_match[1]; *response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; @@ -126,7 +126,7 @@ int main() { }; //Get example simulating heavy work in a separate thread - server.resource["^/work$"]["GET"] = [](shared_ptr &response, shared_ptr & /*request*/) { + server->resource["^/work$"]["GET"] = [](shared_ptr &response, shared_ptr & /*request*/) { thread work_thread([response] { this_thread::sleep_for(chrono::seconds(5)); response->write("Work done"); @@ -138,7 +138,7 @@ int main() { //Will respond with content in the web/-directory, and its subdirectories. //Default file: index.html //Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server - server.default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { + server->default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { try { auto web_root_path = boost::filesystem::canonical("web"); auto path = boost::filesystem::canonical(web_root_path / request->path); @@ -183,7 +183,7 @@ int main() { header.emplace("Content-Length", to_string(length)); response->write(header); - default_resource_send(server, response, ifs); + default_resource_send(*server, response, ifs); } else throw invalid_argument("could not read file"); @@ -193,36 +193,36 @@ int main() { } }; - server.on_error = [](std::shared_ptr & /*request*/, const SimpleWeb::error_code & /*ec*/) { + server->on_error = [](std::shared_ptr & /*request*/, const SimpleWeb::error_code & /*ec*/) { // handle errors here }; thread server_thread([&server]() { //Start server - server.start(); + server->start(); }); //Wait for server to start so that the client can connect this_thread::sleep_for(chrono::seconds(1)); //Client examples - HttpClient client("localhost:8080"); + auto client = HttpClient::create("localhost:8080"); // synchronous request examples - auto r1 = client.request("GET", "/match/123"); + auto r1 = client->request("GET", "/match/123"); cout << r1->content.rdbuf() << endl; // Alternatively, use the convenience function r1->content.string() string json_string = "{\"firstName\": \"John\",\"lastName\": \"Smith\",\"age\": 25}"; - auto r2 = client.request("POST", "/string", json_string); + auto r2 = client->request("POST", "/string", json_string); cout << r2->content.rdbuf() << endl; // asynchronous request example - client.request("POST", "/json", json_string, [](std::shared_ptr &response, const SimpleWeb::error_code &ec) { + client->request("POST", "/json", json_string, [](std::shared_ptr &response, const SimpleWeb::error_code &ec) { if(!ec) cout << response->content.rdbuf() << endl; }); - client.io_service->reset(); // needed because the io_service has been run already in the synchronous examples - client.io_service->run(); + client->io_service->reset(); // needed because the io_service has been run already in the synchronous examples + client->io_service->run(); server_thread.join(); } diff --git a/https_examples.cpp b/https_examples.cpp index cdd0576..4e773fe 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -27,12 +27,12 @@ int main() { //HTTPS-server at port 8080 using 1 thread //Unless you do more heavy non-threaded processing in the resources, //1 thread is usually faster than several threads - HttpsServer server("server.crt", "server.key"); - server.config.port = 8080; + auto server = HttpsServer::create("server.crt", "server.key"); + server->config.port = 8080; //Add resources using path-regex and method-string, and an anonymous function //POST-example for the path /string, responds the posted string - server.resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { //Retrieve string: auto content = request->content.string(); //request->content.string() is a convenience function for: @@ -56,7 +56,7 @@ int main() { // "lastName": "Smith", // "age": 25 //} - server.resource["^/json$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/json$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { try { ptree pt; read_json(request->content, pt); @@ -88,7 +88,7 @@ int main() { //GET-example for the path /info //Responds with request-information - server.resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { stringstream stream; stream << "

Request from " << request->remote_endpoint_address << " (" << request->remote_endpoint_port << ")

"; stream << request->method << " " << request->path << " HTTP/" << request->http_version << "
"; @@ -113,7 +113,7 @@ int main() { //GET-example for the path /match/[number], responds with the matched string in path (number) //For instance a request GET /match/123 will receive: 123 - server.resource["^/match/([0-9]+)$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/match/([0-9]+)$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { string number = request->path_match[1]; *response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; @@ -124,7 +124,7 @@ int main() { }; //Get example simulating heavy work in a separate thread - server.resource["^/work$"]["GET"] = [](shared_ptr &response, shared_ptr & /*request*/) { + server->resource["^/work$"]["GET"] = [](shared_ptr &response, shared_ptr & /*request*/) { thread work_thread([response] { this_thread::sleep_for(chrono::seconds(5)); response->write("Work done"); @@ -136,7 +136,7 @@ int main() { //Will respond with content in the web/-directory, and its subdirectories. //Default file: index.html //Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server - server.default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { + server->default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { try { auto web_root_path = boost::filesystem::canonical("web"); auto path = boost::filesystem::canonical(web_root_path / request->path); @@ -181,7 +181,7 @@ int main() { header.emplace("Content-Length", to_string(length)); response->write(header); - default_resource_send(server, response, ifs); + default_resource_send(*server, response, ifs); } else throw invalid_argument("could not read file"); @@ -191,37 +191,37 @@ int main() { } }; - server.on_error = [](std::shared_ptr & /*request*/, const SimpleWeb::error_code & /*ec*/) { + server->on_error = [](std::shared_ptr & /*request*/, const SimpleWeb::error_code & /*ec*/) { // handle errors here }; thread server_thread([&server]() { //Start server - server.start(); + server->start(); }); //Wait for server to start so that the client can connect this_thread::sleep_for(chrono::seconds(1)); //Client examples - //Second Client() parameter set to false: no certificate verification - HttpsClient client("localhost:8080", false); + //Second create() parameter set to false: no certificate verification + auto client = HttpsClient::create("localhost:8080", false); // synchronous request examples - auto r1 = client.request("GET", "/match/123"); + auto r1 = client->request("GET", "/match/123"); cout << r1->content.rdbuf() << endl; // Alternatively, use the convenience function r1->content.string() string json_string = "{\"firstName\": \"John\",\"lastName\": \"Smith\",\"age\": 25}"; - auto r2 = client.request("POST", "/string", json_string); + auto r2 = client->request("POST", "/string", json_string); cout << r2->content.rdbuf() << endl; // asynchronous request example - client.request("POST", "/json", json_string, [](std::shared_ptr &response, const SimpleWeb::error_code &ec) { + client->request("POST", "/json", json_string, [](std::shared_ptr &response, const SimpleWeb::error_code &ec) { if(!ec) cout << response->content.rdbuf() << endl; }); - client.io_service->reset(); // needed because the io_service has been run already in the synchronous examples - client.io_service->run(); + client->io_service->reset(); // needed because the io_service has been run already in the synchronous examples + client->io_service->run(); server_thread.join(); } diff --git a/server_http.hpp b/server_http.hpp index f87c0c8..ac62d35 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -44,6 +44,9 @@ namespace SimpleWeb { template class ServerBase { + ServerBase(const ServerBase &) = delete; + ServerBase &operator=(const ServerBase &) = delete; + public: virtual ~ServerBase() {} @@ -507,10 +510,17 @@ namespace SimpleWeb { template <> class Server : public ServerBase { + Server(const Server &) = delete; + Server &operator=(const Server &) = delete; + public: - Server() : ServerBase::ServerBase(80) {} + static std::shared_ptr create() { + return std::shared_ptr(new Server()); + } protected: + Server() : ServerBase::ServerBase(80) {} + void accept() override { //Create new socket for this connection //Shared_ptr is used to pass temporary objects to the asynchronous functions diff --git a/server_https.hpp b/server_https.hpp index 18c44ba..7a649b5 100644 --- a/server_https.hpp +++ b/server_https.hpp @@ -17,20 +17,15 @@ namespace SimpleWeb { template <> class Server : public ServerBase { + Server(const Server &) = delete; + Server &operator=(const Server &) = delete; + std::string session_id_context; bool set_session_id_context = false; public: - Server(const std::string &cert_file, const std::string &private_key_file, const std::string &verify_file = std::string()) - : ServerBase::ServerBase(443), context(asio::ssl::context::tlsv12) { - context.use_certificate_chain_file(cert_file); - context.use_private_key_file(private_key_file, asio::ssl::context::pem); - - if(verify_file.size() > 0) { - context.load_verify_file(verify_file); - context.set_verify_mode(asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert | asio::ssl::verify_client_once); - set_session_id_context = true; - } + static std::shared_ptr create(const std::string &cert_file, const std::string &private_key_file, const std::string &verify_file = std::string()) { + return std::shared_ptr(new Server(cert_file, private_key_file, verify_file)); } void start() override { @@ -45,6 +40,18 @@ namespace SimpleWeb { } protected: + Server(const std::string &cert_file, const std::string &private_key_file, const std::string &verify_file) + : ServerBase::ServerBase(443), context(asio::ssl::context::tlsv12) { + context.use_certificate_chain_file(cert_file); + context.use_private_key_file(private_key_file, asio::ssl::context::pem); + + if(verify_file.size() > 0) { + context.load_verify_file(verify_file); + context.set_verify_mode(asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert | asio::ssl::verify_client_once); + set_session_id_context = true; + } + } + asio::ssl::context context; void accept() override { diff --git a/tests/io_test.cpp b/tests/io_test.cpp index 26d7648..e172766 100644 --- a/tests/io_test.cpp +++ b/tests/io_test.cpp @@ -9,31 +9,31 @@ typedef SimpleWeb::Server HttpServer; typedef SimpleWeb::Client HttpClient; int main() { - HttpServer server; - server.config.port = 8080; + auto server = HttpServer::create(); + server->config.port = 8080; - server.resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/string$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { auto content = request->content.string(); *response << "HTTP/1.1 200 OK\r\nContent-Length: " << content.length() << "\r\n\r\n" << content; }; - server.resource["^/string2$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/string2$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { response->write(request->content.string()); }; - server.resource["^/string3$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/string3$"]["POST"] = [](shared_ptr &response, shared_ptr &request) { std::stringstream stream; stream << request->content.rdbuf(); response->write(stream); }; - server.resource["^/string4$"]["POST"] = [](shared_ptr &response, shared_ptr & /*request*/) { + server->resource["^/string4$"]["POST"] = [](shared_ptr &response, shared_ptr & /*request*/) { response->write(SimpleWeb::StatusCode::client_error_forbidden, {{"Test1", "test2"}, {"tesT3", "test4"}}); }; - server.resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/info$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { stringstream content_stream; content_stream << request->method << " " << request->path << " " << request->http_version << " "; content_stream << request->header.find("test parameter")->second; @@ -44,20 +44,20 @@ int main() { << content_stream.rdbuf(); }; - server.resource["^/match/([0-9]+)$"]["GET"] = [&server](shared_ptr &response, shared_ptr &request) { + server->resource["^/match/([0-9]+)$"]["GET"] = [&server](shared_ptr &response, shared_ptr &request) { string number = request->path_match[1]; *response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; }; - server.resource["^/header$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/header$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { auto content = request->header.find("test1")->second + request->header.find("test2")->second; *response << "HTTP/1.1 200 OK\r\nContent-Length: " << content.length() << "\r\n\r\n" << content; }; - server.resource["^/query_string$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { + server->resource["^/query_string$"]["GET"] = [](shared_ptr &response, shared_ptr &request) { assert(request->path == "/query_string"); assert(request->query_string == "testing"); auto queries = request->parse_query_string(); @@ -68,16 +68,16 @@ int main() { thread server_thread([&server]() { //Start server - server.start(); + server->start(); }); this_thread::sleep_for(chrono::seconds(1)); { - HttpClient client("localhost:8080"); + auto client = HttpClient::create("localhost:8080"); { stringstream output; - auto r = client.request("POST", "/string", "A string"); + auto r = client->request("POST", "/string", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); output << r->content.rdbuf(); assert(output.str() == "A string"); @@ -85,14 +85,14 @@ int main() { { stringstream output; - auto r = client.request("POST", "/string", "A string"); + auto r = client->request("POST", "/string", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); assert(r->content.string() == "A string"); } { stringstream output; - auto r = client.request("POST", "/string2", "A string"); + auto r = client->request("POST", "/string2", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); output << r->content.rdbuf(); assert(output.str() == "A string"); @@ -100,7 +100,7 @@ int main() { { stringstream output; - auto r = client.request("POST", "/string3", "A string"); + auto r = client->request("POST", "/string3", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); output << r->content.rdbuf(); assert(output.str() == "A string"); @@ -108,7 +108,7 @@ int main() { { stringstream output; - auto r = client.request("POST", "/string4", "A string"); + auto r = client->request("POST", "/string4", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::client_error_forbidden); assert(r->header.size() == 3); assert(r->header.find("test1")->second == "test2"); @@ -121,78 +121,78 @@ int main() { { stringstream output; stringstream content("A string"); - auto r = client.request("POST", "/string", content); + auto r = client->request("POST", "/string", content); output << r->content.rdbuf(); assert(output.str() == "A string"); } { stringstream output; - auto r = client.request("GET", "/info", "", {{"Test Parameter", "test value"}}); + auto r = client->request("GET", "/info", "", {{"Test Parameter", "test value"}}); output << r->content.rdbuf(); assert(output.str() == "GET /info 1.1 test value"); } { stringstream output; - auto r = client.request("GET", "/match/123"); + auto r = client->request("GET", "/match/123"); output << r->content.rdbuf(); assert(output.str() == "123"); } } { - HttpClient client("localhost:8080"); + auto client = HttpClient::create("localhost:8080"); HttpClient::Connection *connection; { // test performing the stream version of the request methods first stringstream output; stringstream content("A string"); - auto r = client.request("POST", "/string", content); + auto r = client->request("POST", "/string", content); output << r->content.rdbuf(); assert(output.str() == "A string"); - assert(client.connections->size() == 1); - connection = client.connections->front().get(); + assert(client->connections->size() == 1); + connection = client->connections->front().get(); } { stringstream output; - auto r = client.request("POST", "/string", "A string"); + auto r = client->request("POST", "/string", "A string"); output << r->content.rdbuf(); assert(output.str() == "A string"); - assert(client.connections->size() == 1); - assert(connection == client.connections->front().get()); + assert(client->connections->size() == 1); + assert(connection == client->connections->front().get()); } { stringstream output; - auto r = client.request("GET", "/header", "", {{"test1", "test"}, {"test2", "ing"}}); + auto r = client->request("GET", "/header", "", {{"test1", "test"}, {"test2", "ing"}}); output << r->content.rdbuf(); assert(output.str() == "testing"); - assert(client.connections->size() == 1); - assert(connection == client.connections->front().get()); + assert(client->connections->size() == 1); + assert(connection == client->connections->front().get()); } { stringstream output; - auto r = client.request("GET", "/query_string?testing"); + auto r = client->request("GET", "/query_string?testing"); assert(r->content.string() == "testing"); - assert(client.connections->size() == 1); - assert(connection == client.connections->front().get()); + assert(client->connections->size() == 1); + assert(connection == client->connections->front().get()); } } { - HttpClient client("localhost:8080"); + auto client = HttpClient::create("localhost:8080"); bool call = false; - client.request("GET", "/match/123", [&call](shared_ptr &response, const SimpleWeb::error_code &ec) { + client->request("GET", "/match/123", [&call](shared_ptr &response, const SimpleWeb::error_code &ec) { assert(!ec); stringstream output; output << response->content.rdbuf(); assert(output.str() == "123"); call = true; }); - client.io_service->run(); + client->io_service->run(); assert(call); { @@ -201,7 +201,7 @@ int main() { for(size_t c = 0; c < 100; ++c) { calls[c] = 0; threads.emplace_back([c, &client, &calls] { - client.request("GET", "/match/123", [c, &calls](shared_ptr &response, const SimpleWeb::error_code &ec) { + client->request("GET", "/match/123", [c, &calls](shared_ptr &response, const SimpleWeb::error_code &ec) { assert(!ec); stringstream output; output << response->content.rdbuf(); @@ -212,52 +212,52 @@ int main() { } for(auto &thread : threads) thread.join(); - assert(client.connections->size() == 100); - client.io_service->reset(); - client.io_service->run(); - assert(client.connections->size() == 1); + assert(client->connections->size() == 100); + client->io_service->reset(); + client->io_service->run(); + assert(client->connections->size() == 1); for(auto call : calls) assert(call); } } { - HttpClient client("localhost:8080"); - assert(client.connections->size() == 0); + auto client = HttpClient::create("localhost:8080"); + assert(client->connections->size() == 0); for(size_t c = 0; c < 5000; ++c) { - auto r1 = client.request("POST", "/string", "A string"); + auto r1 = client->request("POST", "/string", "A string"); assert(SimpleWeb::status_code(r1->status_code) == SimpleWeb::StatusCode::success_ok); assert(r1->content.string() == "A string"); - assert(client.connections->size() == 1); + assert(client->connections->size() == 1); stringstream content("A string"); - auto r2 = client.request("POST", "/string", content); + auto r2 = client->request("POST", "/string", content); assert(SimpleWeb::status_code(r2->status_code) == SimpleWeb::StatusCode::success_ok); assert(r2->content.string() == "A string"); - assert(client.connections->size() == 1); + assert(client->connections->size() == 1); } } for(size_t c = 0; c < 500; ++c) { { - HttpClient client("localhost:8080"); - auto r = client.request("POST", "/string", "A string"); + auto client = HttpClient::create("localhost:8080"); + auto r = client->request("POST", "/string", "A string"); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); assert(r->content.string() == "A string"); - assert(client.connections->size() == 1); + assert(client->connections->size() == 1); } { - HttpClient client("localhost:8080"); + auto client = HttpClient::create("localhost:8080"); stringstream content("A string"); - auto r = client.request("POST", "/string", content); + auto r = client->request("POST", "/string", content); assert(SimpleWeb::status_code(r->status_code) == SimpleWeb::StatusCode::success_ok); assert(r->content.string() == "A string"); - assert(client.connections->size() == 1); + assert(client->connections->size() == 1); } } - server.stop(); + server->stop(); server_thread.join(); return 0; diff --git a/tests/parse_test.cpp b/tests/parse_test.cpp index a08a478..61c08e9 100644 --- a/tests/parse_test.cpp +++ b/tests/parse_test.cpp @@ -134,18 +134,18 @@ int main() { auto fields_result2 = QueryString::parse(query_string2); assert(fields_result1 == fields_result2 && fields_result1 == fields); - ServerTest serverTest; - serverTest.io_service = std::make_shared(); + auto serverTest = make_shared(); + serverTest->io_service = std::make_shared(); - serverTest.parse_request_test(); + serverTest->parse_request_test(); - ClientTest clientTest("test.org:8080"); - clientTest.constructor_parse_test1(); + auto clientTest = make_shared("test.org:8080"); + clientTest->constructor_parse_test1(); - ClientTest clientTest2("test.org"); - clientTest2.constructor_parse_test2(); + auto clientTest2 = make_shared("test.org"); + clientTest2->constructor_parse_test2(); - clientTest2.parse_response_header_test(); + clientTest2->parse_response_header_test(); asio::io_service io_service;