Added support for passing SSL cert info to listener
This commit is contained in:
parent
7d3e0fe5c8
commit
509b37095f
@ -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)
|
||||
TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto -static)
|
||||
@ -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;
|
||||
|
||||
|
||||
67
main.cpp
67
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<std::unique_ptr<fr::Socket>> 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<fr::HttpSocket<fr::SSLSocket>> socket(new fr::HttpSocket<fr::SSLSocket>);
|
||||
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<fr::SSLSocket> &client = (fr::HttpSocket<fr::SSLSocket>&)**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("<h1>frnetlib test page</h1>");
|
||||
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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user