diff --git a/CMakeLists.txt b/CMakeLists.txt index 27be970..8396c8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,4 +12,4 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -fPIC -pthread -lmbedtls set(SOURCE_FILES main.cpp src/TcpSocket.cpp include/TcpSocket.h src/TcpListener.cpp include/TcpListener.h src/Socket.cpp include/Socket.h src/Packet.cpp include/Packet.h include/NetworkEncoding.h src/SocketSelector.cpp include/SocketSelector.h src/HttpSocket.cpp include/HttpSocket.h src/HttpRequest.cpp include/HttpRequest.h src/HttpResponse.cpp include/HttpResponse.h src/Http.cpp include/Http.h src/SSLSocket.cpp include/SSLSocket.h src/SSLListener.cpp include/SSLListener.h) add_executable(frnetlib ${SOURCE_FILES}) -TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto) \ No newline at end of file +TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto -static) \ No newline at end of file diff --git a/include/SSLListener.h b/include/SSLListener.h index 2beac98..40ca986 100644 --- a/include/SSLListener.h +++ b/include/SSLListener.h @@ -26,7 +26,7 @@ namespace fr class SSLListener : public Socket { public: - SSLListener() noexcept; + SSLListener(const std::string &crt_path, const std::string &pem_path, const std::string &private_key_path) noexcept; virtual ~SSLListener() noexcept; SSLListener(SSLListener &&o) noexcept = default; diff --git a/main.cpp b/main.cpp index 5ef16c6..970cca0 100644 --- a/main.cpp +++ b/main.cpp @@ -11,6 +11,73 @@ int main() { + //Bind to port + fr::SSLListener listener("key.crt", "key.pem", "private.key"); + if(listener.listen("8080") != fr::Socket::Success) + { + //Error + } + + //Create socket selector and add listener + fr::SocketSelector selector; + selector.add(listener); + + //Create vector to store open connections + std::vector> connections; + + //Infinitely loop. No timeout is specified so it will not return false. + while(selector.wait()) + { + //Check if it was the selector who sent data + if(selector.is_ready(listener)) + { + std::unique_ptr> socket(new fr::HttpSocket); + if(listener.accept(*socket) == fr::Socket::Success) + { + selector.add(*socket); + connections.emplace_back(std::move(socket)); + } + } + + //Else it must have been one of the clients + else + { + //Find which client send the data + for(auto iter = connections.begin(); iter != connections.end();) + { + //Eww + fr::HttpSocket &client = (fr::HttpSocket&)**iter; + + //Check if it's this client + if(selector.is_ready(client)) + { + //It is, so receive their HTTP request + fr::HttpRequest request; + if(client.receive(request) == fr::Socket::Success) + { + //Send back a HTTP response containing 'Hello, World!' + fr::HttpResponse response; + response.set_body("

frnetlib test page

"); + client.send(response); + + //Remove them from the selector and close the connection + selector.remove(client); + client.close(); + iter = connections.erase(iter); + } + else + { + iter++; + } + } + else + { + iter++; + } + } + } + } + return 0; } \ No newline at end of file diff --git a/src/SSLListener.cpp b/src/SSLListener.cpp index 6d63469..1b2a56a 100644 --- a/src/SSLListener.cpp +++ b/src/SSLListener.cpp @@ -7,7 +7,7 @@ namespace fr { - SSLListener::SSLListener() noexcept + SSLListener::SSLListener(const std::string &crt_path, const std::string &pem_path, const std::string &private_key_path) noexcept { //Initialise SSL objects required mbedtls_net_init(&listen_fd); @@ -20,21 +20,21 @@ namespace fr int error = 0; //Load certificates and private key todo: Switch from inbuilt test certificates - error = mbedtls_x509_crt_parse(&srvcert, (const unsigned char *)mbedtls_test_srv_crt, mbedtls_test_srv_crt_len); + error = mbedtls_x509_crt_parse_file(&srvcert, crt_path.c_str()); if(error != 0) { std::cout << "Failed to initialise SSL listener. CRT Parse returned: " << error << std::endl; return; } - error = mbedtls_x509_crt_parse(&srvcert, (const unsigned char *)mbedtls_test_cas_pem, mbedtls_test_cas_pem_len); + error = mbedtls_x509_crt_parse_file(&srvcert, pem_path.c_str()); if(error != 0) { std::cout << "Failed to initialise SSL listener. PEM Parse returned: " << error << std::endl; return; } - error = mbedtls_pk_parse_key(&pkey, (const unsigned char *)mbedtls_test_srv_key, mbedtls_test_srv_key_len, NULL, 0); + error = mbedtls_pk_parse_keyfile(&pkey, private_key_path.c_str(), 0); if(error != 0) { std::cout << "Failed to initialise SSL listener. Private Key Parse returned: " << error << std::endl;