diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d13117ba..4f93e243a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ endif () ############ Project name and version set (WEBSOCKETPP_MAJOR_VERSION 0) set (WEBSOCKETPP_MINOR_VERSION 8) -set (WEBSOCKETPP_PATCH_VERSION 1) +set (WEBSOCKETPP_PATCH_VERSION 2) set (WEBSOCKETPP_VERSION ${WEBSOCKETPP_MAJOR_VERSION}.${WEBSOCKETPP_MINOR_VERSION}.${WEBSOCKETPP_PATCH_VERSION}) if(POLICY CMP0048) @@ -123,7 +123,11 @@ if (BUILD_TESTS OR BUILD_EXAMPLES) # g++ if (CMAKE_COMPILER_IS_GNUCXX) - set (WEBSOCKETPP_PLATFORM_LIBS pthread rt) + if (NOT APPLE) + set (WEBSOCKETPP_PLATFORM_LIBS pthread rt) + else() + set (WEBSOCKETPP_PLATFORM_LIBS pthread) + endif() set (WEBSOCKETPP_PLATFORM_TLS_LIBS ssl crypto) set (WEBSOCKETPP_BOOST_LIBS system thread) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") @@ -202,7 +206,7 @@ if (BUILD_TESTS OR BUILD_EXAMPLES) endif () if (NOT Boost_USE_STATIC_LIBS) - add_definitions (/DBOOST_TEST_DYN_LINK) + add_definitions (-DBOOST_TEST_DYN_LINK) endif () set (Boost_FIND_REQUIRED TRUE) diff --git a/Doxyfile b/Doxyfile index e2061659b..20b695cc9 100644 --- a/Doxyfile +++ b/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = WebSocket++ # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.8.1 +PROJECT_NUMBER = 0.8.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/changelog.md b/changelog.md index 6771d6e9e..3488a1981 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,17 @@ HEAD +0.8.2 - 2020-04-19 +- Examples: Update print_client_tls example to remove use of deprecated + OpenSSL functions. +- Compatibility: Removes the use of make_shared in a number of cases where + it would be incompatible with newer versions of ASIO. Thank you Stefan + Floeren for the patch. #810 #814 #862 #843 #794 #808 +- CMake: Update cmake installer to better handle dependencies when using + g++ on MacOS. Thank you Luca Palano for reporting and a patch. #831 +- CMake: Update cmake installer to use a variable for the include directory + improving the ability of the install to be customized. THank you Schrijvers + Luc and Gianfranco Costamanga for reporting and a patch. #842 + 0.8.1 - 2018-07-16 Note: This release does not change library behavior. It only corrects issues in the installer and test system. diff --git a/cmake/CMakeHelpers.cmake b/cmake/CMakeHelpers.cmake index 1478f4b52..f6036325b 100644 --- a/cmake/CMakeHelpers.cmake +++ b/cmake/CMakeHelpers.cmake @@ -80,7 +80,7 @@ macro (final_target) endif () install (DIRECTORY ${CMAKE_SOURCE_DIR}/${TARGET_NAME} - DESTINATION include/ + DESTINATION ${INSTALL_INCLUDE_DIR}/ FILES_MATCHING PATTERN "*.hpp*") endmacro () diff --git a/docs/faq.dox b/docs/faq.dox index 24059f755..9f417ec41 100644 --- a/docs/faq.dox +++ b/docs/faq.dox @@ -55,7 +55,7 @@ If you handle errors from methods like send, ping, close, etc correctly then you Normally, for security purposes, operating systems prevent programs from listening on sockets created by other programs. When your program crashes and restarts, the new instance is a different program from the perspective of the operating system. As such it can’t listen on the socket address/port that the previous program was using until after a timeout occurs to make sure the old program was done with it. -The the first step for handling this is to make sure that you provide a method (signal handler, admin websocket message, etc) to perform a clean server shutdown. There is a question elsewhere in this FAQ that describes the steps necessary for this. +The first step for handling this is to make sure that you provide a method (signal handler, admin websocket message, etc) to perform a clean server shutdown. There is a question elsewhere in this FAQ that describes the steps necessary for this. The clean close strategy won't help in the case of crashes or other abnormal closures. An option to consider for these cases is the use of the SO_REUSEADDR socket option. This instructs the OS to not request an exclusive lock on the socket. This means that after your program crashes the replacement you start can immediately listen on that address/port combo again. diff --git a/examples/print_client_tls/print_client_tls.cpp b/examples/print_client_tls/print_client_tls.cpp index 0a1c72c06..469d9c61e 100644 --- a/examples/print_client_tls/print_client_tls.cpp +++ b/examples/print_client_tls/print_client_tls.cpp @@ -61,7 +61,7 @@ bool verify_subject_alternative_name(const char * hostname, X509 * cert) { continue; } - char * dns_name = (char *) ASN1_STRING_data(current_name->d.dNSName); + char const * dns_name = (char const *) ASN1_STRING_get0_data(current_name->d.dNSName); // Make sure there isn't an embedded NUL character in the DNS name if (ASN1_STRING_length(current_name->d.dNSName) != strlen(dns_name)) { @@ -76,7 +76,7 @@ bool verify_subject_alternative_name(const char * hostname, X509 * cert) { } /// Verify that the certificate common name matches the given hostname -bool verify_common_name(const char * hostname, X509 * cert) { +bool verify_common_name(char const * hostname, X509 * cert) { // Find the position of the CN field in the Subject field of the certificate int common_name_loc = X509_NAME_get_index_by_NID(X509_get_subject_name(cert), NID_commonName, -1); if (common_name_loc < 0) { @@ -95,7 +95,7 @@ bool verify_common_name(const char * hostname, X509 * cert) { return false; } - char * common_name_str = (char *) ASN1_STRING_data(common_name_asn1); + char const * common_name_str = (char const *) ASN1_STRING_get0_data(common_name_asn1); // Make sure there isn't an embedded NUL character in the CN if (ASN1_STRING_length(common_name_asn1) != strlen(common_name_str)) { diff --git a/readme.md b/readme.md index aa99f668e..6cc608516 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -WebSocket++ (0.8.1) +WebSocket++ (0.8.2) ========================== WebSocket++ is a header only C++ library that implements RFC6455 The WebSocket diff --git a/websocketpp/transport/asio/connection.hpp b/websocketpp/transport/asio/connection.hpp index 60f88a79f..57dda74a2 100644 --- a/websocketpp/transport/asio/connection.hpp +++ b/websocketpp/transport/asio/connection.hpp @@ -311,9 +311,10 @@ class connection : public config::socket_type::socket_con_type { * needed. */ timer_ptr set_timer(long duration, timer_handler callback) { - timer_ptr new_timer = lib::make_shared( - lib::ref(*m_io_service), - lib::asio::milliseconds(duration) + timer_ptr new_timer( + new lib::asio::steady_timer( + *m_io_service, + lib::asio::milliseconds(duration)) ); if (config::enable_multithreading) { @@ -461,8 +462,7 @@ class connection : public config::socket_type::socket_con_type { m_io_service = io_service; if (config::enable_multithreading) { - m_strand = lib::make_shared( - lib::ref(*io_service)); + m_strand.reset(new lib::asio::io_service::strand(*io_service)); } lib::error_code ec = socket_con_type::init_asio(io_service, m_strand, diff --git a/websocketpp/transport/asio/endpoint.hpp b/websocketpp/transport/asio/endpoint.hpp index ddab2c742..94509adb3 100644 --- a/websocketpp/transport/asio/endpoint.hpp +++ b/websocketpp/transport/asio/endpoint.hpp @@ -195,8 +195,7 @@ class endpoint : public config::socket_type { m_io_service = ptr; m_external_io_service = true; - m_acceptor = lib::make_shared( - lib::ref(*m_io_service)); + m_acceptor.reset(new lib::asio::ip::tcp::acceptor(*m_io_service)); m_state = READY; ec = lib::error_code(); @@ -688,9 +687,7 @@ class endpoint : public config::socket_type { * @since 0.3.0 */ void start_perpetual() { - m_work = lib::make_shared( - lib::ref(*m_io_service) - ); + m_work.reset(new lib::asio::io_service::work(*m_io_service)); } /// Clears the endpoint's perpetual flag, allowing it to exit when empty @@ -854,8 +851,7 @@ class endpoint : public config::socket_type { // Create a resolver if (!m_resolver) { - m_resolver = lib::make_shared( - lib::ref(*m_io_service)); + m_resolver.reset(new lib::asio::ip::tcp::resolver(*m_io_service)); } tcon->set_uri(u); diff --git a/websocketpp/transport/asio/security/none.hpp b/websocketpp/transport/asio/security/none.hpp index 5c8293dbe..6c7d35241 100644 --- a/websocketpp/transport/asio/security/none.hpp +++ b/websocketpp/transport/asio/security/none.hpp @@ -168,8 +168,7 @@ class connection : public lib::enable_shared_from_this { return socket::make_error_code(socket::error::invalid_state); } - m_socket = lib::make_shared( - lib::ref(*service)); + m_socket.reset(new lib::asio::ip::tcp::socket(*service)); if (m_socket_init_handler) { m_socket_init_handler(m_hdl, *m_socket); diff --git a/websocketpp/transport/asio/security/tls.hpp b/websocketpp/transport/asio/security/tls.hpp index c76fd9aa1..04ac37903 100644 --- a/websocketpp/transport/asio/security/tls.hpp +++ b/websocketpp/transport/asio/security/tls.hpp @@ -193,8 +193,7 @@ class connection : public lib::enable_shared_from_this { if (!m_context) { return socket::make_error_code(socket::error::invalid_tls_context); } - m_socket = lib::make_shared( - _WEBSOCKETPP_REF(*service),lib::ref(*m_context)); + m_socket.reset(new socket_type(*service, *m_context)); if (m_socket_init_handler) { m_socket_init_handler(m_hdl, get_socket()); diff --git a/websocketpp/version.hpp b/websocketpp/version.hpp index f701ab103..5766546f7 100644 --- a/websocketpp/version.hpp +++ b/websocketpp/version.hpp @@ -44,7 +44,7 @@ static int const major_version = 0; /// Library minor version number static int const minor_version = 8; /// Library patch version number -static int const patch_version = 1; +static int const patch_version = 2; /// Library pre-release flag /** * This is a textual flag indicating the type and number for pre-release @@ -54,7 +54,7 @@ static int const patch_version = 1; static char const prerelease_flag[] = ""; /// Default user agent string -static char const user_agent[] = "WebSocket++/0.8.1"; +static char const user_agent[] = "WebSocket++/0.8.2"; } // namespace websocketpp