diff --git a/dependencies.txt b/dependencies.txt new file mode 100644 index 0000000000..cb1a099f3d --- /dev/null +++ b/dependencies.txt @@ -0,0 +1,17 @@ +Using this file to track boost dependency testing. + +Mac OS X 10.7.2, XCode 4.2.1, boost built using default darwin 4.2.1 toolset, example compiled with g++ 4.2.x + +SSL echo server +boost 1.48.0 - OK +boost 1.47.0 - OK +boost 1.46.1 - significant SSL context constructor change. SSL support might require 1.47 + +plain echo server +boost 1.48.0 - OK +boost 1.47.0 - OK +boost 1.46.1 - OK +boost 1.45.0 - ? +boost 1.44.0 - OK +boost 1.43.0 - OK +boost 1.42.0 - Does not build on Mac OS X 10.7 \ No newline at end of file diff --git a/examples/echo_server/Makefile b/examples/echo_server/Makefile index 87f2fb4a10..4dc14c68fb 100644 --- a/examples/echo_server/Makefile +++ b/examples/echo_server/Makefile @@ -10,7 +10,7 @@ SHARED ?= "1" ifeq ($(SHARED), 1) LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lboost_program_options -lwebsocketpp else - LDFLAGS := $(LDFLAGS) $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a -lcrypto -lssl ../../libwebsocketpp.a + LDFLAGS := $(LDFLAGS) $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a ../../libwebsocketpp.a endif echo_server: echo_server.o diff --git a/examples/echo_server/echo_server.cpp b/examples/echo_server/echo_server.cpp index 61c729b01a..0d35993437 100644 --- a/examples/echo_server/echo_server.cpp +++ b/examples/echo_server/echo_server.cpp @@ -27,41 +27,16 @@ #include "../../src/endpoint.hpp" #include "../../src/roles/server.hpp" -#include "../../src/sockets/ssl.hpp" #include typedef websocketpp::endpoint plain_endpoint_type; -typedef websocketpp::endpoint tls_endpoint_type; typedef plain_endpoint_type::handler_ptr plain_handler_ptr; -typedef tls_endpoint_type::handler_ptr tls_handler_ptr; -template -class echo_server_handler : public endpoint_type::handler { +class echo_server_handler : public plain_endpoint_type::handler { public: - typedef echo_server_handler type; - typedef typename endpoint_type::connection_ptr connection_ptr; - - std::string get_password() const { - return "test"; - } - - boost::shared_ptr on_tls_init() { - // create a tls context, init, and return. - boost::shared_ptr context(new boost::asio::ssl::context(boost::asio::ssl::context::sslv23)); - try { - context->set_options(boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::single_dh_use); - context->set_password_callback(boost::bind(&type::get_password, this)); - context->use_certificate_chain_file("/Users/zaphoyd/Documents/ZS/websocketpp/src/ssl/server.pem"); - context->use_private_key_file("/Users/zaphoyd/Documents/ZS/websocketpp/src/ssl/server.pem", boost::asio::ssl::context::pem); - context->use_tmp_dh_file("/Users/zaphoyd/Documents/ZS/websocketpp/src/ssl/dh512.pem"); - } catch (std::exception& e) { - std::cout << e.what() << std::endl; - } - return context; - } + typedef echo_server_handler type; + typedef plain_endpoint_type::connection_ptr connection_ptr; void validate(connection_ptr connection) { //std::cout << "state: " << connection->get_state() << std::endl; @@ -95,59 +70,31 @@ public: int main(int argc, char* argv[]) { unsigned short port = 9002; - bool tls = true; if (argc == 2) { // TODO: input validation? port = atoi(argv[1]); } - if (argc == 3) { - // TODO: input validation? - port = atoi(argv[1]); - tls = !strcmp(argv[2],"-tls"); - } - - try { - if (!tls) { - plain_handler_ptr h(new echo_server_handler()); - plain_endpoint_type e(h); - - e.alog().unset_level(websocketpp::log::alevel::ALL); - e.alog().set_level(websocketpp::log::alevel::CONNECT); - e.alog().set_level(websocketpp::log::alevel::DISCONNECT); - //e.alog().unset_level(websocketpp::log::alevel::DEBUG_HANDSHAKE); - - e.elog().unset_level(websocketpp::log::elevel::ALL); - e.elog().set_level(websocketpp::log::elevel::ERROR); - e.elog().set_level(websocketpp::log::elevel::FATAL); - - // TODO: fix - //e.alog().set_level(websocketpp::log::alevel::CONNECT & websocketpp::log::alevel::DISCONNECT); - //e.elog().set_levels(websocketpp::log::elevel::ERROR,websocketpp::log::elevel::FATAL); - - std::cout << "Starting WebSocket echo server on port " << port << std::endl; - e.listen(port); - } else { - tls_handler_ptr h(new echo_server_handler()); - tls_endpoint_type e(h); - - e.alog().unset_level(websocketpp::log::alevel::ALL); - e.alog().set_level(websocketpp::log::alevel::CONNECT); - e.alog().set_level(websocketpp::log::alevel::DISCONNECT); - e.alog().set_level(websocketpp::log::alevel::DEVEL); - e.alog().set_level(websocketpp::log::alevel::DEBUG_CLOSE); - //e.alog().unset_level(websocketpp::log::alevel::DEBUG_HANDSHAKE); - - e.elog().unset_level(websocketpp::log::elevel::ALL); - e.elog().set_level(websocketpp::log::elevel::ERROR); - e.elog().set_level(websocketpp::log::elevel::FATAL); - - std::cout << "Starting Secure WebSocket echo server on port " << port << std::endl; - e.listen(port); - } + try { + plain_handler_ptr h(new echo_server_handler()); + plain_endpoint_type e(h); + e.alog().unset_level(websocketpp::log::alevel::ALL); + e.alog().set_level(websocketpp::log::alevel::CONNECT); + e.alog().set_level(websocketpp::log::alevel::DISCONNECT); + //e.alog().unset_level(websocketpp::log::alevel::DEBUG_HANDSHAKE); + e.elog().unset_level(websocketpp::log::elevel::ALL); + e.elog().set_level(websocketpp::log::elevel::ERROR); + e.elog().set_level(websocketpp::log::elevel::FATAL); + + // TODO: fix + //e.alog().set_level(websocketpp::log::alevel::CONNECT & websocketpp::log::alevel::DISCONNECT); + //e.elog().set_levels(websocketpp::log::elevel::ERROR,websocketpp::log::elevel::FATAL); + + std::cout << "Starting WebSocket echo server on port " << port << std::endl; + e.listen(port); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } diff --git a/examples/echo_server/echo_server_old b/examples/echo_server/echo_server_old deleted file mode 100755 index c3a38d68c7..0000000000 Binary files a/examples/echo_server/echo_server_old and /dev/null differ diff --git a/examples/echo_server_tls/Makefile b/examples/echo_server_tls/Makefile new file mode 100644 index 0000000000..7f52b5e0b0 --- /dev/null +++ b/examples/echo_server_tls/Makefile @@ -0,0 +1,26 @@ +BOOST_LIB_PATH ?= /usr/local/lib +BOOST_INCLUDE_PATH ?= /usr/local/include + +CFLAGS = -O2 -I$(BOOST_INCLUDE_PATH) +LDFLAGS = -L$(BOOST_LIB_PATH) + +CXX ?= c++ +SHARED ?= "1" + +ifeq ($(SHARED), 1) + LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lcrypto -lssl -lwebsocketpp +else + LDFLAGS := $(LDFLAGS) $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a -lcrypto -lssl ../../libwebsocketpp.a +endif + +echo_server_tls: echo_server_tls.o + $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) + +%.o: %.cpp + $(CXX) -c $(CFLAGS) -o $@ $^ + +# cleanup by removing generated files +# +.PHONY: clean +clean: + rm -f *.o echo_server_tls diff --git a/examples/echo_server_tls/echo.cpp b/examples/echo_server_tls/echo.cpp new file mode 100644 index 0000000000..d1001affb6 --- /dev/null +++ b/examples/echo_server_tls/echo.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + diff --git a/examples/echo_server_tls/echo.hpp b/examples/echo_server_tls/echo.hpp new file mode 100644 index 0000000000..48e8948d6c --- /dev/null +++ b/examples/echo_server_tls/echo.hpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef ECHO_SERVER_HANDLER_HPP +#define ECHO_SERVER_HANDLER_HPP + +#include "../../src/websocketpp.hpp" +#include "../../src/interfaces/session.hpp" +#include + +#include +#include + +using websocketpp::session::server_ptr; +using websocketpp::session::server_handler; + +namespace websocketecho { + +class echo_server_handler : public server_handler { +public: + // The echo server allows all domains is protocol free. + void validate(server_ptr session) {} + + // an echo server is stateless. + // The handler has no need to keep track of connected clients. + void on_fail(server_ptr session) {} + void on_open(server_ptr session) {} + void on_close(server_ptr session) {} + + // both text and binary messages are echoed back to the sending client. + void on_message(server_ptr session,websocketpp::utf8_string_ptr msg) { + std::cout << *msg << std::endl; + session->send(*msg); + } + void on_message(server_ptr session,websocketpp::binary_string_ptr data) { + session->send(*data); + } +}; + +} + +#endif // ECHO_SERVER_HANDLER_HPP diff --git a/examples/echo_server_tls/echo_client.html b/examples/echo_server_tls/echo_client.html new file mode 100644 index 0000000000..cd46a17a72 --- /dev/null +++ b/examples/echo_server_tls/echo_client.html @@ -0,0 +1,94 @@ + + + + + + + + + + +
+
+ + +
+ +
+
+
+
+ + + \ No newline at end of file diff --git a/examples/echo_server_tls/echo_server_tls b/examples/echo_server_tls/echo_server_tls new file mode 100755 index 0000000000..255d92b471 Binary files /dev/null and b/examples/echo_server_tls/echo_server_tls differ diff --git a/examples/echo_server_tls/echo_server_tls.cpp b/examples/echo_server_tls/echo_server_tls.cpp new file mode 100644 index 0000000000..483de978c8 --- /dev/null +++ b/examples/echo_server_tls/echo_server_tls.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "../../src/endpoint.hpp" +#include "../../src/roles/server.hpp" +#include "../../src/sockets/ssl.hpp" + +#include + +typedef websocketpp::endpoint plain_endpoint_type; +typedef websocketpp::endpoint tls_endpoint_type; +typedef plain_endpoint_type::handler_ptr plain_handler_ptr; +typedef tls_endpoint_type::handler_ptr tls_handler_ptr; + +template +class echo_server_handler : public endpoint_type::handler { +public: + typedef echo_server_handler type; + typedef typename endpoint_type::connection_ptr connection_ptr; + + std::string get_password() const { + return "test"; + } + + boost::shared_ptr on_tls_init() { + // create a tls context, init, and return. + boost::shared_ptr context(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); + try { + context->set_options(boost::asio::ssl::context::default_workarounds | + boost::asio::ssl::context::no_sslv2 | + boost::asio::ssl::context::single_dh_use); + context->set_password_callback(boost::bind(&type::get_password, this)); + context->use_certificate_chain_file("/Users/zaphoyd/Documents/websocketpp/src/ssl/server.pem"); + context->use_private_key_file("/Users/zaphoyd/Documents/websocketpp/src/ssl/server.pem", boost::asio::ssl::context::pem); + context->use_tmp_dh_file("/Users/zaphoyd/Documents/websocketpp/src/ssl/dh512.pem"); + } catch (std::exception& e) { + std::cout << e.what() << std::endl; + } + return context; + } + + void validate(connection_ptr connection) { + //std::cout << "state: " << connection->get_state() << std::endl; + } + + void on_open(connection_ptr connection) { + //std::cout << "connection opened" << std::endl; + } + + void on_close(connection_ptr connection) { + //std::cout << "connection closed" << std::endl; + } + + void on_message(connection_ptr connection,websocketpp::utf8_string_ptr msg) { + //std::cout << "got message: " << *msg << std::endl; + connection->send(*msg); + } + void on_message(connection_ptr connection,websocketpp::binary_string_ptr data) { + //std::cout << "got binary message of length: " << data->size() << std::endl; + connection->send(*data); + } + + void http(connection_ptr connection) { + connection->set_body("HTTP Response!!"); + } + + void on_fail(connection_ptr connection) { + std::cout << "connection failed" << std::endl; + } +}; + +int main(int argc, char* argv[]) { + unsigned short port = 9002; + bool tls = false; + + if (argc == 2) { + // TODO: input validation? + port = atoi(argv[1]); + } + + if (argc == 3) { + // TODO: input validation? + port = atoi(argv[1]); + tls = !strcmp(argv[2],"-tls"); + } + + try { + if (tls) { + tls_handler_ptr h(new echo_server_handler()); + tls_endpoint_type e(h); + + e.alog().unset_level(websocketpp::log::alevel::ALL); + e.alog().set_level(websocketpp::log::alevel::CONNECT); + e.alog().set_level(websocketpp::log::alevel::DISCONNECT); + e.alog().set_level(websocketpp::log::alevel::DEVEL); + e.alog().set_level(websocketpp::log::alevel::DEBUG_CLOSE); + //e.alog().unset_level(websocketpp::log::alevel::DEBUG_HANDSHAKE); + + e.elog().unset_level(websocketpp::log::elevel::ALL); + e.elog().set_level(websocketpp::log::elevel::ERROR); + e.elog().set_level(websocketpp::log::elevel::FATAL); + + std::cout << "Starting Secure WebSocket echo server on port " << port << std::endl; + e.listen(port); + } else { + plain_handler_ptr h(new echo_server_handler()); + plain_endpoint_type e(h); + + e.alog().unset_level(websocketpp::log::alevel::ALL); + e.alog().set_level(websocketpp::log::alevel::CONNECT); + e.alog().set_level(websocketpp::log::alevel::DISCONNECT); + //e.alog().unset_level(websocketpp::log::alevel::DEBUG_HANDSHAKE); + + e.elog().unset_level(websocketpp::log::elevel::ALL); + e.elog().set_level(websocketpp::log::elevel::ERROR); + e.elog().set_level(websocketpp::log::elevel::FATAL); + + // TODO: fix + //e.alog().set_level(websocketpp::log::alevel::CONNECT & websocketpp::log::alevel::DISCONNECT); + //e.elog().set_levels(websocketpp::log::elevel::ERROR,websocketpp::log::elevel::FATAL); + + std::cout << "Starting WebSocket echo server on port " << port << std::endl; + e.listen(port); + } + + + } catch (std::exception& e) { + std::cerr << "Exception: " << e.what() << std::endl; + } + + return 0; +}