Added Sha1 hash, and Base64 encode implementations which are optionally compiled if websock support is enabled, to assist in the WebSock handshake.
Added WebSocket to manage the WebSock protocol during connections.
Added WebFrame to allow for sending/receiving data through the WebSock protocol easily.
Fixed TcpSocket::set_descriptor(nullptr) causing an invalid read from address 0x0.
Improved HTTP response/request parsing so that they report a parse failure if the first few bytes of the HTTP request don't match the expected format rather than continuing to look for an end of header.
Fixed broken fr::Http::url_encode() implementation.
Optimised fr::Http::url_decode() implementation.
Added fr::Http unit tests.
Fixed SSLListener failing to accept SSLSockets properly (not setting the descriptor properly).
TcpSocket::receive_raw and SSLSocket::receive_raw now behave the same, rather than SSLSocket acting more like Socket::receive_all.
Documented specific return values from Socket::receive_all().
Socket::receive_all now returns WouldBlock if the socket is in blocking mode and the first read returns no data, so it doesn't behave like a blocking socket.
Disabled copying/moving of sockets. Copying shouldn't have been enabled, but might add move constructors in the future.
Added Socket::disconnect, which internally just calls close_socket, to allow for protocol-specific disconnect sequences in the future (WebSockets).
Socket mutexes are no longer really required, and so have been removed.
Added more tests for network encoding functions, and the URL parser.
The URL parser now returns a path preceeded with a '/' instead of cutting it out. Added get_uri() to URL, for getting the whole URI, so users don't have to concat it themselves from the more specialised functions.
Fixed default socket connect timeout checking for the wrong value.
Fixed request_type_strings not containing all of the possible request types.
Fixed README using old socket close syntax.
Cleaned up the examples a bit.
Fixed HTTP request parse failing if the URI was too short.
Fixed HTTP parser not converting POST/GET data to lowercase before storing it, making post and get data which contained capitals impossible to access.
Both fr::TcpSocket and fr::SSLSocket can have timeouts specified when connecting. This works by putting the socket into non-blocking mode, making a connect, and then selecting on the socket for the requested timeout. If the select times out then we've failed to connect, if it didn't time out then we've connected.
Receiving an http request/response will now return errors like HttpHeaderTooBig, instead of the type being set to that.
Added fr::Socket::status_to_string for converting status values into English strings.
Added the ability to disable certificate verification for SSL sockets which is useful for testing.
Added the ability to specify maximum HTTP request header/body sizes in the CMake build config to prevent a malicious client from causing OOM errors.
Fixed a bug in HttpResponse and HttpRequest parse causing it to abort if the request is invalid in some cases.
Started work on tests for fr::HttpRequest.
Fixed the final POST data variable containing header data it shouldn't (\r\n\r\n).
Fixed fr::Http::header_exists, and family, not converting things to lowercase first.
Whilst receiving data, the SSL socket would not return if the remote socket disconnected, leading to it blocking indefinitely.
Whilst sending enough data to require multiple writes, the socket would disconnect instead of sending more. This has also been fixed.
Recv's return value was being checked to see if it was greater or equal to 0, if everything was okay. 0 indicates connection closed, and so the socket should have disconnected instead of returning Success.
fr::HttpSocket has been removed.
fr::Sendable has been added. Classes can inherit this if they want to be sendable through sockets. Both fr::Http (which is inherited by fr::HttpRequest and fr::HttpResponse), and fr::Packet inherit this, to allow them to be sent through fr::Socket::send()/fr::Socket::receive().
Fixed broken fr::SocketSelector and fr::SocketReactor, as they no longer accepted fr::Listener's due to fr::Listener no longer inheriting fr::Socket.
Fixed Content-Length header being added to Http responses even if there's a pre-existing one.
Fixed header parsing sometimes adding a carriage return to the header value.
Removed useless copy/move constructors from HttpResponse, causing issues.
fr::TcpSocket checked if the recv response was greater than 0, which created issues as 0 is a valid result if no data was received and no error occurred.
fr::HttpResponse::construct() now adds in a content-length header.
fr::HttpResponse::parse trims the body if it's larger than content length.
fr::Http::set_uri() now prepends a '/' if one's not provided.
Fixed fr::Http::parse_header from cutting off the end of headers.