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)
|
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})
|
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
|
class SSLListener : public Socket
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SSLListener() noexcept;
|
SSLListener(const std::string &crt_path, const std::string &pem_path, const std::string &private_key_path) noexcept;
|
||||||
virtual ~SSLListener() noexcept;
|
virtual ~SSLListener() noexcept;
|
||||||
SSLListener(SSLListener &&o) noexcept = default;
|
SSLListener(SSLListener &&o) noexcept = default;
|
||||||
|
|
||||||
|
|||||||
67
main.cpp
67
main.cpp
@ -11,6 +11,73 @@
|
|||||||
|
|
||||||
int main()
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
namespace fr
|
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
|
//Initialise SSL objects required
|
||||||
mbedtls_net_init(&listen_fd);
|
mbedtls_net_init(&listen_fd);
|
||||||
@ -20,21 +20,21 @@ namespace fr
|
|||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
//Load certificates and private key todo: Switch from inbuilt test certificates
|
//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)
|
if(error != 0)
|
||||||
{
|
{
|
||||||
std::cout << "Failed to initialise SSL listener. CRT Parse returned: " << error << std::endl;
|
std::cout << "Failed to initialise SSL listener. CRT Parse returned: " << error << std::endl;
|
||||||
return;
|
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)
|
if(error != 0)
|
||||||
{
|
{
|
||||||
std::cout << "Failed to initialise SSL listener. PEM Parse returned: " << error << std::endl;
|
std::cout << "Failed to initialise SSL listener. PEM Parse returned: " << error << std::endl;
|
||||||
return;
|
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)
|
if(error != 0)
|
||||||
{
|
{
|
||||||
std::cout << "Failed to initialise SSL listener. Private Key Parse returned: " << error << std::endl;
|
std::cout << "Failed to initialise SSL listener. Private Key Parse returned: " << error << std::endl;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user