diff --git a/examples/echo_client/echo_client.cpp b/examples/echo_client/echo_client.cpp index 70df86cf50..26c65131ec 100644 --- a/examples/echo_client/echo_client.cpp +++ b/examples/echo_client/echo_client.cpp @@ -71,7 +71,7 @@ int main(int argc, char* argv[]) { con = endpoint.connect(uri+"getCaseCount"); - con->add_request_header("User Agent","WebSocket++/0.2.0"); + con->add_request_header("User Agent","WebSocket++/0.2.0-dev"); endpoint.run(); @@ -82,7 +82,7 @@ int main(int argc, char* argv[]) { std::stringstream url; - url << uri << "/runCase?case=" << i << "&agent=\"WebSocket++/0.2.0\""; + url << uri << "runCase?case=" << i << "&agent=WebSocket++/0.2.0-dev"; con = endpoint.connect(url.str()); diff --git a/examples/fuzzing_server_tls/fuzzing_server_tls.cpp b/examples/fuzzing_server_tls/fuzzing_server_tls.cpp index a2f2ede185..e27bf65b1f 100644 --- a/examples/fuzzing_server_tls/fuzzing_server_tls.cpp +++ b/examples/fuzzing_server_tls/fuzzing_server_tls.cpp @@ -25,24 +25,22 @@ * */ -#include "../../src/endpoint.hpp" -#include "../../src/roles/server.hpp" -#include "../../src/sockets/ssl.hpp" +#include "../../src/sockets/tls.hpp" +#include "../../src/websocketpp.hpp" #include #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; +using websocketpp::server; +using websocketpp::server_tls; template -class echo_server_handler : public endpoint_type::handler { +class fuzzing_server_handler : public endpoint_type::handler { public: - typedef echo_server_handler type; - typedef typename endpoint_type::connection_ptr connection_ptr; + typedef fuzzing_server_handler type; + typedef typename endpoint_type::handler::connection_ptr connection_ptr; + typedef typename endpoint_type::handler::message_ptr message_ptr; std::string get_password() const { return "test"; @@ -56,38 +54,85 @@ public: 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"); + context->use_certificate_chain_file("../../src/ssl/server.pem"); + context->use_private_key_file("../..p/src/ssl/server.pem", boost::asio::ssl::context::pem); + context->use_tmp_dh_file("../../src/ssl/dh512.pem"); } catch (std::exception& e) { std::cout << e.what() << std::endl; } return context; } - void validate(connection_ptr connection) { + void validate(connection_ptr con) { //std::cout << "state: " << connection->get_state() << std::endl; - - - - } - void on_open(connection_ptr connection) { + void on_open(connection_ptr con) { + if (con->get_resource() == "/getCaseCount") { + con->send("12"); + con->close(websocketpp::close::status::NORMAL); + return; + } + + if (con->get_resource().find("/runCase?case=") == 0) { + std::string foo = con->get_resource(); + + size_t a = foo.find("case="); + size_t b = foo.find("&"); + size_t c = foo.find("agent="); + + std::string case_no = foo.substr(a+5,b-(a+5)); + std::string agent = foo.substr(c+6,foo.size()-(c+6)); + + // /runCase?case=" << i << "&agent=\"WebSocket++/0.2.0\" + + m_case_no = std::atoi(case_no.c_str()); + + if (m_case_no == 1) { + std::cout << "Running tests for agent: " << agent << std::endl; + } + } else { + std::cout << "Running tests for agent: Unknown" << std::endl; + m_case_no = 12; + } + + + //std::cout << "connection opened" << std::endl; // extract user agent // start timer - start_time = boost::posix_time::microsec_clock::local_time(); + // send message - connection->send("abcd"); + + m_test_sizes[0] = 65536; + m_test_sizes[1] = 262144; + m_test_sizes[2] = 1048576; + m_test_sizes[3] = 4194304; + m_test_sizes[4] = 8388608; + m_test_sizes[5] = 16777216; + + m_data.clear(); + + websocketpp::frame::opcode::value mode; + if (m_case_no <= 6) { + fill_utf8(m_data,m_test_sizes[(m_case_no-1)%6]); + mode = websocketpp::frame::opcode::TEXT; + } else { + fill_binary(m_data,m_test_sizes[(m_case_no-1)%6]); + mode = websocketpp::frame::opcode::BINARY; + } + + start_time = boost::posix_time::microsec_clock::local_time(); + + con->send(m_data,mode); // stop } - void on_close(connection_ptr connection) { + void on_close(connection_ptr con) { //std::cout << "connection closed" << std::endl; } - void on_message(connection_ptr connection,websocketpp::message::data_ptr msg) { + void on_message(connection_ptr con,message_ptr msg) { //std::cout << "got message: " << *msg << std::endl; //connection->send(msg->get_payload(),(msg->get_opcode() == websocketpp::frame::opcode::BINARY)); @@ -95,12 +140,18 @@ public: boost::posix_time::time_period len(start_time,end_time); - if (msg->get_payload() == "abcd") { - std::cout << "Pass in " << len.length() << std::endl; + if (m_case_no <= 6) { + std::cout << "9.1." << (m_case_no); } else { - std::cout << "Fail in " << len.length() << std::endl; + std::cout << "9.2." << (m_case_no-6); } + if (msg->get_payload() == m_data) { + std::cout << " Pass in " << len.length() << std::endl; + } else { + std::cout << " Fail in " << len.length() << std::endl; + } + con->close(websocketpp::close::status::NORMAL); // stop timer // check if message was valid } @@ -113,8 +164,44 @@ public: std::cout << "connection failed" << std::endl; } + void fill_utf8(std::string& data,size_t size,bool random = true) { + if (random) { + uint32_t val; + for (int i = 0; i < size; i++) { + if (i%4 == 0) { + val = uint32_t(rand()); + } + + data.push_back(char(((reinterpret_cast(&val)[i%4])%95)+32)); + } + } else { + data.assign(size,'*'); + } + } + + void fill_binary(std::string& data,size_t size,bool random = true) { + if (random) { + int32_t val; + for (int i = 0; i < size; i++) { + if (i%4 == 0) { + val = rand(); + } + + data.push_back((reinterpret_cast(&val))[i%4]); + } + } else { + data.assign(size,'*'); + } + } + boost::posix_time::ptime start_time; boost::posix_time::ptime end_time; + + int m_case_no; + int m_minor; + int m_subtest; + int m_test_sizes[6]; + std::string m_data; }; int main(int argc, char* argv[]) { @@ -134,41 +221,25 @@ int main(int argc, char* argv[]) { try { if (tls) { - tls_handler_ptr h(new echo_server_handler()); - tls_endpoint_type e(h); + server_tls::handler::ptr handler(new fuzzing_server_handler()); + server_tls endpoint(handler); - 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); + endpoint.alog().unset_level(websocketpp::log::alevel::ALL); + endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - 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); + std::cout << "Starting Secure WebSocket fuzzing server on port " + << port << std::endl; + endpoint.listen(port); } else { - plain_handler_ptr h(new echo_server_handler()); - plain_endpoint_type e(h); + server::handler::ptr handler(new fuzzing_server_handler()); + server endpoint(handler); - 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); + endpoint.alog().unset_level(websocketpp::log::alevel::ALL); + endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - 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); + std::cout << "Starting WebSocket fuzzing server on port " + << port << std::endl; + endpoint.listen(port); }