missing files for websocket 0.7
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 WEBSOCKETPP_COMMON_ASIO_HPP
|
||||
#define WEBSOCKETPP_COMMON_ASIO_HPP
|
||||
|
||||
// This file goes to some length to preserve compatibility with versions of
|
||||
// boost older than 1.49 (where the first modern steady_timer timer based on
|
||||
// boost/std chrono was introduced.
|
||||
//
|
||||
// For the versions older than 1.49, the deadline_timer is used instead. this
|
||||
// brings in dependencies on boost date_time and it has a different interface
|
||||
// that is normalized by the `lib::asio::is_neg` and `lib::asio::milliseconds`
|
||||
// wrappers provided by this file.
|
||||
//
|
||||
// The primary reason for this continued support is that boost 1.48 is the
|
||||
// default and not easily changeable version of boost supplied by the package
|
||||
// manager of popular Linux distributions like Ubuntu 12.04 LTS. Once the need
|
||||
// for this has passed this should be cleaned up and simplified.
|
||||
|
||||
#ifdef ASIO_STANDALONE
|
||||
#include <asio/version.hpp>
|
||||
|
||||
#if (ASIO_VERSION/100000) == 1 && ((ASIO_VERSION/100)%1000) < 8
|
||||
static_assert(false, "The minimum version of standalone Asio is 1.8.0");
|
||||
#endif
|
||||
|
||||
#include <asio.hpp>
|
||||
#include <asio/steady_timer.hpp>
|
||||
#include <websocketpp/common/chrono.hpp>
|
||||
#else
|
||||
#include <boost/version.hpp>
|
||||
|
||||
// See note above about boost <1.49 compatibility. If we are running on
|
||||
// boost > 1.48 pull in the steady timer and chrono library
|
||||
#if (BOOST_VERSION/100000) == 1 && ((BOOST_VERSION/100)%1000) > 48
|
||||
#include <boost/asio/steady_timer.hpp>
|
||||
#include <websocketpp/common/chrono.hpp>
|
||||
#endif
|
||||
|
||||
#include <boost/asio.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#endif
|
||||
|
||||
namespace websocketpp {
|
||||
namespace lib {
|
||||
|
||||
#ifdef ASIO_STANDALONE
|
||||
namespace asio {
|
||||
using namespace ::asio;
|
||||
// Here we assume that we will be using std::error_code with standalone
|
||||
// Asio. This is probably a good assumption, but it is possible in rare
|
||||
// cases that local Asio versions would be used.
|
||||
using std::errc;
|
||||
|
||||
// See note above about boost <1.49 compatibility. Because we require
|
||||
// a standalone Asio version of 1.8+ we are guaranteed to have
|
||||
// steady_timer available. By convention we require the chrono library
|
||||
// (either boost or std) for use with standalone Asio.
|
||||
template <typename T>
|
||||
bool is_neg(T duration) {
|
||||
return duration.count() < 0;
|
||||
}
|
||||
inline lib::chrono::milliseconds milliseconds(long duration) {
|
||||
return lib::chrono::milliseconds(duration);
|
||||
}
|
||||
} // namespace asio
|
||||
|
||||
#else
|
||||
namespace asio {
|
||||
using namespace boost::asio;
|
||||
|
||||
// See note above about boost <1.49 compatibility
|
||||
#if (BOOST_VERSION/100000) == 1 && ((BOOST_VERSION/100)%1000) > 48
|
||||
// Using boost::asio >=1.49 so we use chrono and steady_timer
|
||||
template <typename T>
|
||||
bool is_neg(T duration) {
|
||||
return duration.count() < 0;
|
||||
}
|
||||
inline lib::chrono::milliseconds milliseconds(long duration) {
|
||||
return lib::chrono::milliseconds(duration);
|
||||
}
|
||||
#else
|
||||
// Using boost::asio <1.49 we pretend a deadline timer is a steady
|
||||
// timer and wrap the negative detection and duration conversion
|
||||
// appropriately.
|
||||
typedef boost::asio::deadline_timer steady_timer;
|
||||
|
||||
template <typename T>
|
||||
bool is_neg(T duration) {
|
||||
return duration.is_negative();
|
||||
}
|
||||
inline boost::posix_time::time_duration milliseconds(long duration) {
|
||||
return boost::posix_time::milliseconds(duration);
|
||||
}
|
||||
#endif
|
||||
|
||||
using boost::system::error_code;
|
||||
namespace errc = boost::system::errc;
|
||||
} // namespace asio
|
||||
#endif
|
||||
|
||||
|
||||
} // namespace lib
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_COMMON_ASIO_HPP
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 WEBSOCKETPP_COMMON_ASIO_SSL_HPP
|
||||
#define WEBSOCKETPP_COMMON_ASIO_SSL_HPP
|
||||
|
||||
// NOTE: This file must be included before common/asio.hpp
|
||||
|
||||
#ifdef ASIO_STANDALONE
|
||||
#include <asio/ssl.hpp>
|
||||
#else
|
||||
#include <boost/asio/ssl.hpp>
|
||||
#endif
|
||||
|
||||
#endif // WEBSOCKETPP_COMMON_ASIO_SSL_HPP
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_COMMON_TIME_HPP
|
||||
#define WEBSOCKETPP_COMMON_TIME_HPP
|
||||
|
||||
#include <ctime>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace lib {
|
||||
|
||||
// Code in this header was inspired by the following article and includes some
|
||||
// code from the related project g2log. The g2log code is public domain licensed
|
||||
// http://kjellkod.wordpress.com/2013/01/22/exploring-c11-part-2-localtime-and-time-again/
|
||||
|
||||
/// Thread safe cross platform localtime
|
||||
inline std::tm localtime(std::time_t const & time) {
|
||||
std::tm tm_snapshot;
|
||||
#if (defined(__MINGW32__) || defined(__MINGW64__))
|
||||
memcpy(&tm_snapshot, ::localtime(&time), sizeof(std::tm));
|
||||
#elif (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
|
||||
localtime_s(&tm_snapshot, &time);
|
||||
#else
|
||||
localtime_r(&time, &tm_snapshot); // POSIX
|
||||
#endif
|
||||
return tm_snapshot;
|
||||
}
|
||||
|
||||
} // lib
|
||||
} // websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_COMMON_TIME_HPP
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 WEBSOCKETPP_COMMON_TYPE_TRAITS_HPP
|
||||
#define WEBSOCKETPP_COMMON_TYPE_TRAITS_HPP
|
||||
|
||||
#include <websocketpp/common/cpp11.hpp>
|
||||
|
||||
// If we've determined that we're in full C++11 mode and the user hasn't
|
||||
// explicitly disabled the use of C++11 functional header, then prefer it to
|
||||
// boost.
|
||||
#if defined _WEBSOCKETPP_CPP11_INTERNAL_ && !defined _WEBSOCKETPP_NO_CPP11_TYPE_TRAITS_
|
||||
#ifndef _WEBSOCKETPP_CPP11_TYPE_TRAITS_
|
||||
#define _WEBSOCKETPP_CPP11_TYPE_TRAITS_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef _WEBSOCKETPP_CPP11_TYPE_TRAITS_
|
||||
#include <type_traits>
|
||||
#else
|
||||
#include <boost/aligned_storage.hpp>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace websocketpp {
|
||||
namespace lib {
|
||||
|
||||
#ifdef _WEBSOCKETPP_CPP11_TYPE_TRAITS_
|
||||
using std::aligned_storage;
|
||||
using std::is_same;
|
||||
#else
|
||||
using boost::aligned_storage;
|
||||
using boost::is_same;
|
||||
#endif
|
||||
|
||||
} // namespace lib
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_COMMON_TYPE_TRAITS_HPP
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_CONFIG_MINIMAL_CLIENT_HPP
|
||||
#define WEBSOCKETPP_CONFIG_MINIMAL_CLIENT_HPP
|
||||
|
||||
#include <websocketpp/config/minimal_server.hpp>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace config {
|
||||
|
||||
/// Client config with minimal dependencies
|
||||
/**
|
||||
* This config strips out as many dependencies as possible. It is suitable for
|
||||
* use as a base class for custom configs that want to implement or choose their
|
||||
* own policies for components that even the core config includes.
|
||||
*
|
||||
* NOTE: this config stubs out enough that it cannot be used directly. You must
|
||||
* supply at least a transport policy and a cryptographically secure random
|
||||
* number generation policy for a config based on `minimal_client` to do
|
||||
* anything useful.
|
||||
*
|
||||
* Present dependency list for minimal_server config:
|
||||
*
|
||||
* C++98 STL:
|
||||
* <algorithm>
|
||||
* <map>
|
||||
* <sstream>
|
||||
* <string>
|
||||
* <vector>
|
||||
*
|
||||
* C++11 STL or Boost
|
||||
* <memory>
|
||||
* <functional>
|
||||
* <system_error>
|
||||
*
|
||||
* Operating System:
|
||||
* <stdint.h> or <boost/cstdint.hpp>
|
||||
* <netinet/in.h> or <winsock2.h> (for ntohl.. could potentially bundle this)
|
||||
*
|
||||
* @since 0.4.0-dev
|
||||
*/
|
||||
typedef minimal_server minimal_client;
|
||||
|
||||
} // namespace config
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_CONFIG_MINIMAL_CLIENT_HPP
|
||||
@@ -0,0 +1,312 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_CONFIG_MINIMAL_HPP
|
||||
#define WEBSOCKETPP_CONFIG_MINIMAL_HPP
|
||||
|
||||
// Non-Policy common stuff
|
||||
#include <websocketpp/common/platforms.hpp>
|
||||
#include <websocketpp/common/cpp11.hpp>
|
||||
#include <websocketpp/common/stdint.hpp>
|
||||
|
||||
// Concurrency
|
||||
#include <websocketpp/concurrency/none.hpp>
|
||||
|
||||
// Transport
|
||||
#include <websocketpp/transport/stub/endpoint.hpp>
|
||||
|
||||
// HTTP
|
||||
#include <websocketpp/http/request.hpp>
|
||||
#include <websocketpp/http/response.hpp>
|
||||
|
||||
// Messages
|
||||
#include <websocketpp/message_buffer/message.hpp>
|
||||
#include <websocketpp/message_buffer/alloc.hpp>
|
||||
|
||||
// Loggers
|
||||
#include <websocketpp/logger/stub.hpp>
|
||||
|
||||
// RNG
|
||||
#include <websocketpp/random/none.hpp>
|
||||
|
||||
// User stub base classes
|
||||
#include <websocketpp/endpoint_base.hpp>
|
||||
#include <websocketpp/connection_base.hpp>
|
||||
|
||||
// Extensions
|
||||
#include <websocketpp/extensions/permessage_deflate/disabled.hpp>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace config {
|
||||
|
||||
/// Server config with minimal dependencies
|
||||
/**
|
||||
* This config strips out as many dependencies as possible. It is suitable for
|
||||
* use as a base class for custom configs that want to implement or choose their
|
||||
* own policies for components that even the core config includes.
|
||||
*
|
||||
* NOTE: this config stubs out enough that it cannot be used directly. You must
|
||||
* supply at least a transport policy for a config based on `minimal_server` to
|
||||
* do anything useful.
|
||||
*
|
||||
* Present dependency list for minimal_server config:
|
||||
*
|
||||
* C++98 STL:
|
||||
* <algorithm>
|
||||
* <map>
|
||||
* <sstream>
|
||||
* <string>
|
||||
* <vector>
|
||||
*
|
||||
* C++11 STL or Boost
|
||||
* <memory>
|
||||
* <functional>
|
||||
* <system_error>
|
||||
*
|
||||
* Operating System:
|
||||
* <stdint.h> or <boost/cstdint.hpp>
|
||||
* <netinet/in.h> or <winsock2.h> (for ntohl.. could potentially bundle this)
|
||||
*
|
||||
* @since 0.4.0-dev
|
||||
*/
|
||||
struct minimal_server {
|
||||
typedef minimal_server type;
|
||||
|
||||
// Concurrency policy
|
||||
typedef websocketpp::concurrency::none concurrency_type;
|
||||
|
||||
// HTTP Parser Policies
|
||||
typedef http::parser::request request_type;
|
||||
typedef http::parser::response response_type;
|
||||
|
||||
// Message Policies
|
||||
typedef message_buffer::message<message_buffer::alloc::con_msg_manager>
|
||||
message_type;
|
||||
typedef message_buffer::alloc::con_msg_manager<message_type>
|
||||
con_msg_manager_type;
|
||||
typedef message_buffer::alloc::endpoint_msg_manager<con_msg_manager_type>
|
||||
endpoint_msg_manager_type;
|
||||
|
||||
/// Logging policies
|
||||
typedef websocketpp::log::stub elog_type;
|
||||
typedef websocketpp::log::stub alog_type;
|
||||
|
||||
/// RNG policies
|
||||
typedef websocketpp::random::none::int_generator<uint32_t> rng_type;
|
||||
|
||||
/// Controls compile time enabling/disabling of thread syncronization
|
||||
/// code Disabling can provide a minor performance improvement to single
|
||||
/// threaded applications
|
||||
static bool const enable_multithreading = true;
|
||||
|
||||
struct transport_config {
|
||||
typedef type::concurrency_type concurrency_type;
|
||||
typedef type::elog_type elog_type;
|
||||
typedef type::alog_type alog_type;
|
||||
typedef type::request_type request_type;
|
||||
typedef type::response_type response_type;
|
||||
|
||||
/// Controls compile time enabling/disabling of thread syncronization
|
||||
/// code Disabling can provide a minor performance improvement to single
|
||||
/// threaded applications
|
||||
static bool const enable_multithreading = true;
|
||||
|
||||
/// Default timer values (in ms)
|
||||
|
||||
/// Length of time to wait for socket pre-initialization
|
||||
/**
|
||||
* Exactly what this includes depends on the socket policy in use
|
||||
*/
|
||||
static const long timeout_socket_pre_init = 5000;
|
||||
|
||||
/// Length of time to wait before a proxy handshake is aborted
|
||||
static const long timeout_proxy = 5000;
|
||||
|
||||
/// Length of time to wait for socket post-initialization
|
||||
/**
|
||||
* Exactly what this includes depends on the socket policy in use.
|
||||
* Often this means the TLS handshake
|
||||
*/
|
||||
static const long timeout_socket_post_init = 5000;
|
||||
|
||||
/// Length of time to wait for dns resolution
|
||||
static const long timeout_dns_resolve = 5000;
|
||||
|
||||
/// Length of time to wait for TCP connect
|
||||
static const long timeout_connect = 5000;
|
||||
|
||||
/// Length of time to wait for socket shutdown
|
||||
static const long timeout_socket_shutdown = 5000;
|
||||
};
|
||||
|
||||
/// Transport Endpoint Component
|
||||
typedef websocketpp::transport::stub::endpoint<transport_config>
|
||||
transport_type;
|
||||
|
||||
/// User overridable Endpoint base class
|
||||
typedef websocketpp::endpoint_base endpoint_base;
|
||||
/// User overridable Connection base class
|
||||
typedef websocketpp::connection_base connection_base;
|
||||
|
||||
/// Default timer values (in ms)
|
||||
|
||||
/// Length of time before an opening handshake is aborted
|
||||
static const long timeout_open_handshake = 5000;
|
||||
/// Length of time before a closing handshake is aborted
|
||||
static const long timeout_close_handshake = 5000;
|
||||
/// Length of time to wait for a pong after a ping
|
||||
static const long timeout_pong = 5000;
|
||||
|
||||
/// WebSocket Protocol version to use as a client
|
||||
/**
|
||||
* What version of the WebSocket Protocol to use for outgoing client
|
||||
* connections. Setting this to a value other than 13 (RFC6455) is not
|
||||
* recommended.
|
||||
*/
|
||||
static const int client_version = 13; // RFC6455
|
||||
|
||||
/// Default static error logging channels
|
||||
/**
|
||||
* Which error logging channels to enable at compile time. Channels not
|
||||
* enabled here will be unable to be selected by programs using the library.
|
||||
* This option gives an optimizing compiler the ability to remove entirely
|
||||
* code to test whether or not to print out log messages on a certain
|
||||
* channel
|
||||
*
|
||||
* Default is all except for development/debug level errors
|
||||
*/
|
||||
static const websocketpp::log::level elog_level =
|
||||
websocketpp::log::elevel::none;
|
||||
|
||||
/// Default static access logging channels
|
||||
/**
|
||||
* Which access logging channels to enable at compile time. Channels not
|
||||
* enabled here will be unable to be selected by programs using the library.
|
||||
* This option gives an optimizing compiler the ability to remove entirely
|
||||
* code to test whether or not to print out log messages on a certain
|
||||
* channel
|
||||
*
|
||||
* Default is all except for development/debug level access messages
|
||||
*/
|
||||
static const websocketpp::log::level alog_level =
|
||||
websocketpp::log::alevel::none;
|
||||
|
||||
///
|
||||
static const size_t connection_read_buffer_size = 16384;
|
||||
|
||||
/// Drop connections immediately on protocol error.
|
||||
/**
|
||||
* Drop connections on protocol error rather than sending a close frame.
|
||||
* Off by default. This may result in legit messages near the error being
|
||||
* dropped as well. It may free up resources otherwise spent dealing with
|
||||
* misbehaving clients.
|
||||
*/
|
||||
static const bool drop_on_protocol_error = false;
|
||||
|
||||
/// Suppresses the return of detailed connection close information
|
||||
/**
|
||||
* Silence close suppresses the return of detailed connection close
|
||||
* information during the closing handshake. This information is useful
|
||||
* for debugging and presenting useful errors to end users but may be
|
||||
* undesirable for security reasons in some production environments.
|
||||
* Close reasons could be used by an attacker to confirm that the endpoint
|
||||
* is out of resources or be used to identify the WebSocket implementation
|
||||
* in use.
|
||||
*
|
||||
* Note: this will suppress *all* close codes, including those explicitly
|
||||
* sent by local applications.
|
||||
*/
|
||||
static const bool silent_close = false;
|
||||
|
||||
/// Default maximum message size
|
||||
/**
|
||||
* Default value for the processor's maximum message size. Maximum message size
|
||||
* determines the point at which the library will fail a connection with the
|
||||
* message_too_big protocol error.
|
||||
*
|
||||
* The default is 32MB
|
||||
*
|
||||
* @since 0.4.0-alpha1
|
||||
*/
|
||||
static const size_t max_message_size = 32000000;
|
||||
|
||||
/// Default maximum http body size
|
||||
/**
|
||||
* Default value for the http parser's maximum body size. Maximum body size
|
||||
* determines the point at which the library will abort reading an HTTP
|
||||
* connection with the 413/request entity too large error.
|
||||
*
|
||||
* The default is 32MB
|
||||
*
|
||||
* @since 0.5.0
|
||||
*/
|
||||
static const size_t max_http_body_size = 32000000;
|
||||
|
||||
/// Global flag for enabling/disabling extensions
|
||||
static const bool enable_extensions = true;
|
||||
|
||||
/// Extension specific settings:
|
||||
|
||||
/// permessage_compress extension
|
||||
struct permessage_deflate_config {
|
||||
typedef core::request_type request_type;
|
||||
|
||||
/// If the remote endpoint requests that we reset the compression
|
||||
/// context after each message should we honor the request?
|
||||
static const bool allow_disabling_context_takeover = true;
|
||||
|
||||
/// If the remote endpoint requests that we reduce the size of the
|
||||
/// LZ77 sliding window size this is the lowest value that will be
|
||||
/// allowed. Values range from 8 to 15. A value of 8 means we will
|
||||
/// allow any possible window size. A value of 15 means do not allow
|
||||
/// negotiation of the window size (ie require the default).
|
||||
static const uint8_t minimum_outgoing_window_bits = 8;
|
||||
};
|
||||
|
||||
typedef websocketpp::extensions::permessage_deflate::disabled
|
||||
<permessage_deflate_config> permessage_deflate_type;
|
||||
|
||||
/// Autonegotiate permessage-deflate
|
||||
/**
|
||||
* Automatically enables the permessage-deflate extension.
|
||||
*
|
||||
* For clients this results in a permessage-deflate extension request being
|
||||
* sent with every request rather than requiring it to be requested manually
|
||||
*
|
||||
* For servers this results in accepting the first set of extension settings
|
||||
* requested by the client that we understand being used. The alternative is
|
||||
* requiring the extension to be manually negotiated in `validate`. With
|
||||
* auto-negotiate on, you may still override the auto-negotiate manually if
|
||||
* needed.
|
||||
*/
|
||||
//static const bool autonegotiate_compression = false;
|
||||
};
|
||||
|
||||
} // namespace config
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_CONFIG_MINIMAL_HPP
|
||||
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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.
|
||||
*
|
||||
*
|
||||
* The initial version of this logging policy was contributed to the WebSocket++
|
||||
* project by Tom Hughes.
|
||||
*/
|
||||
|
||||
#ifndef WEBSOCKETPP_LOGGER_SYSLOG_HPP
|
||||
#define WEBSOCKETPP_LOGGER_SYSLOG_HPP
|
||||
|
||||
#include <syslog.h>
|
||||
|
||||
#include <websocketpp/logger/basic.hpp>
|
||||
|
||||
#include <websocketpp/common/cpp11.hpp>
|
||||
#include <websocketpp/logger/levels.hpp>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace log {
|
||||
|
||||
/// Basic logger that outputs to syslog
|
||||
template <typename concurrency, typename names>
|
||||
class syslog : public basic<concurrency, names> {
|
||||
public:
|
||||
typedef basic<concurrency, names> base;
|
||||
|
||||
/// Construct the logger
|
||||
/**
|
||||
* @param hint A channel type specific hint for how to construct the logger
|
||||
*/
|
||||
syslog<concurrency,names>(channel_type_hint::value hint =
|
||||
channel_type_hint::access)
|
||||
: basic<concurrency,names>(hint), m_channel_type_hint(hint) {}
|
||||
|
||||
/// Construct the logger
|
||||
/**
|
||||
* @param channels A set of channels to statically enable
|
||||
* @param hint A channel type specific hint for how to construct the logger
|
||||
*/
|
||||
syslog<concurrency,names>(level channels, channel_type_hint::value hint =
|
||||
channel_type_hint::access)
|
||||
: basic<concurrency,names>(channels, hint), m_channel_type_hint(hint) {}
|
||||
|
||||
/// Write a string message to the given channel
|
||||
/**
|
||||
* @param channel The channel to write to
|
||||
* @param msg The message to write
|
||||
*/
|
||||
void write(level channel, std::string const & msg) {
|
||||
write(channel, msg.c_str());
|
||||
}
|
||||
|
||||
/// Write a cstring message to the given channel
|
||||
/**
|
||||
* @param channel The channel to write to
|
||||
* @param msg The message to write
|
||||
*/
|
||||
void write(level channel, char const * msg) {
|
||||
scoped_lock_type lock(base::m_lock);
|
||||
if (!this->dynamic_test(channel)) { return; }
|
||||
::syslog(syslog_priority(channel), "[%s] %s",
|
||||
names::channel_name(channel), msg);
|
||||
}
|
||||
private:
|
||||
typedef typename base::scoped_lock_type scoped_lock_type;
|
||||
|
||||
/// The default level is used for all access logs and any error logs that
|
||||
/// don't trivially map to one of the standard syslog levels.
|
||||
static int const default_level = LOG_INFO;
|
||||
|
||||
/// retrieve the syslog priority code given a WebSocket++ channel
|
||||
/**
|
||||
* @param channel The level to look up
|
||||
* @return The syslog level associated with `channel`
|
||||
*/
|
||||
int syslog_priority(level channel) const {
|
||||
if (m_channel_type_hint == channel_type_hint::access) {
|
||||
return syslog_priority_access(channel);
|
||||
} else {
|
||||
return syslog_priority_error(channel);
|
||||
}
|
||||
}
|
||||
|
||||
/// retrieve the syslog priority code given a WebSocket++ error channel
|
||||
/**
|
||||
* @param channel The level to look up
|
||||
* @return The syslog level associated with `channel`
|
||||
*/
|
||||
int syslog_priority_error(level channel) const {
|
||||
switch (channel) {
|
||||
case elevel::devel:
|
||||
return LOG_DEBUG;
|
||||
case elevel::library:
|
||||
return LOG_DEBUG;
|
||||
case elevel::info:
|
||||
return LOG_INFO;
|
||||
case elevel::warn:
|
||||
return LOG_WARNING;
|
||||
case elevel::rerror:
|
||||
return LOG_ERR;
|
||||
case elevel::fatal:
|
||||
return LOG_CRIT;
|
||||
default:
|
||||
return default_level;
|
||||
}
|
||||
}
|
||||
|
||||
/// retrieve the syslog priority code given a WebSocket++ access channel
|
||||
/**
|
||||
* @param channel The level to look up
|
||||
* @return The syslog level associated with `channel`
|
||||
*/
|
||||
_WEBSOCKETPP_CONSTEXPR_TOKEN_ int syslog_priority_access(level) const {
|
||||
return default_level;
|
||||
}
|
||||
|
||||
channel_type_hint::value m_channel_type_hint;
|
||||
};
|
||||
|
||||
} // log
|
||||
} // websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_LOGGER_SYSLOG_HPP
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_DEBUG_BASE_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_DEBUG_BASE_HPP
|
||||
|
||||
#include <websocketpp/common/system_error.hpp>
|
||||
#include <websocketpp/common/cpp11.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
/// Debug transport policy that is used for various mocking and stubbing duties
|
||||
/// in unit tests.
|
||||
namespace debug {
|
||||
|
||||
/// debug transport errors
|
||||
namespace error {
|
||||
enum value {
|
||||
/// Catch-all error for transport policy errors that don't fit in other
|
||||
/// categories
|
||||
general = 1,
|
||||
|
||||
/// not implemented
|
||||
not_implemented,
|
||||
|
||||
invalid_num_bytes,
|
||||
|
||||
double_read
|
||||
};
|
||||
|
||||
/// debug transport error category
|
||||
class category : public lib::error_category {
|
||||
public:
|
||||
category() {}
|
||||
|
||||
char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {
|
||||
return "websocketpp.transport.debug";
|
||||
}
|
||||
|
||||
std::string message(int value) const {
|
||||
switch(value) {
|
||||
case general:
|
||||
return "Generic stub transport policy error";
|
||||
case not_implemented:
|
||||
return "feature not implemented";
|
||||
case invalid_num_bytes:
|
||||
return "Invalid number of bytes";
|
||||
case double_read:
|
||||
return "Read while another read was outstanding";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/// Get a reference to a static copy of the debug transport error category
|
||||
inline lib::error_category const & get_category() {
|
||||
static category instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// Get an error code with the given value and the debug transport category
|
||||
inline lib::error_code make_error_code(error::value e) {
|
||||
return lib::error_code(static_cast<int>(e), get_category());
|
||||
}
|
||||
|
||||
} // namespace error
|
||||
} // namespace debug
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
_WEBSOCKETPP_ERROR_CODE_ENUM_NS_START_
|
||||
template<> struct is_error_code_enum<websocketpp::transport::debug::error::value>
|
||||
{
|
||||
static bool const value = true;
|
||||
};
|
||||
_WEBSOCKETPP_ERROR_CODE_ENUM_NS_END_
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_DEBUG_BASE_HPP
|
||||
@@ -0,0 +1,412 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_DEBUG_CON_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_DEBUG_CON_HPP
|
||||
|
||||
#include <websocketpp/transport/debug/base.hpp>
|
||||
|
||||
#include <websocketpp/transport/base/connection.hpp>
|
||||
|
||||
#include <websocketpp/uri.hpp>
|
||||
#include <websocketpp/logger/levels.hpp>
|
||||
|
||||
#include <websocketpp/common/connection_hdl.hpp>
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
#include <websocketpp/common/platforms.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
namespace debug {
|
||||
|
||||
/// Empty timer class to stub out for timer functionality that stub
|
||||
/// transport doesn't support
|
||||
struct timer {
|
||||
void cancel() {}
|
||||
};
|
||||
|
||||
template <typename config>
|
||||
class connection : public lib::enable_shared_from_this< connection<config> > {
|
||||
public:
|
||||
/// Type of this connection transport component
|
||||
typedef connection<config> type;
|
||||
/// Type of a shared pointer to this connection transport component
|
||||
typedef lib::shared_ptr<type> ptr;
|
||||
|
||||
/// transport concurrency policy
|
||||
typedef typename config::concurrency_type concurrency_type;
|
||||
/// Type of this transport's access logging policy
|
||||
typedef typename config::alog_type alog_type;
|
||||
/// Type of this transport's error logging policy
|
||||
typedef typename config::elog_type elog_type;
|
||||
|
||||
// Concurrency policy types
|
||||
typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
|
||||
typedef typename concurrency_type::mutex_type mutex_type;
|
||||
|
||||
typedef lib::shared_ptr<timer> timer_ptr;
|
||||
|
||||
explicit connection(bool is_server, alog_type & alog, elog_type & elog)
|
||||
: m_reading(false), m_is_server(is_server), m_alog(alog), m_elog(elog)
|
||||
{
|
||||
m_alog.write(log::alevel::devel,"debug con transport constructor");
|
||||
}
|
||||
|
||||
/// Get a shared pointer to this component
|
||||
ptr get_shared() {
|
||||
return type::shared_from_this();
|
||||
}
|
||||
|
||||
/// Set whether or not this connection is secure
|
||||
/**
|
||||
* Todo: docs
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value Whether or not this connection is secure.
|
||||
*/
|
||||
void set_secure(bool) {}
|
||||
|
||||
/// Tests whether or not the underlying transport is secure
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* @return Whether or not the underlying transport is secure
|
||||
*/
|
||||
bool is_secure() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Set uri hook
|
||||
/**
|
||||
* Called by the endpoint as a connection is being established to provide
|
||||
* the uri being connected to to the transport layer.
|
||||
*
|
||||
* Implementation is optional and can be ignored if the transport has no
|
||||
* need for this information.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*
|
||||
* @param u The uri to set
|
||||
*/
|
||||
void set_uri(uri_ptr) {}
|
||||
|
||||
/// Set human readable remote endpoint address
|
||||
/**
|
||||
* Sets the remote endpoint address returned by `get_remote_endpoint`. This
|
||||
* value should be a human readable string that describes the remote
|
||||
* endpoint. Typically an IP address or hostname, perhaps with a port. But
|
||||
* may be something else depending on the nature of the underlying
|
||||
* transport.
|
||||
*
|
||||
* If none is set a default is returned.
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value The remote endpoint address to set.
|
||||
*/
|
||||
void set_remote_endpoint(std::string) {}
|
||||
|
||||
/// Get human readable remote endpoint address
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* This value is used in access and error logs and is available to the end
|
||||
* application for including in user facing interfaces and messages.
|
||||
*
|
||||
* @return A string identifying the address of the remote endpoint
|
||||
*/
|
||||
std::string get_remote_endpoint() const {
|
||||
return "unknown (debug transport)";
|
||||
}
|
||||
|
||||
/// Get the connection handle
|
||||
/**
|
||||
* @return The handle for this connection.
|
||||
*/
|
||||
connection_hdl get_handle() const {
|
||||
return connection_hdl();
|
||||
}
|
||||
|
||||
/// Call back a function after a period of time.
|
||||
/**
|
||||
* Timers are not implemented in this transport. The timer pointer will
|
||||
* always be empty. The handler will never be called.
|
||||
*
|
||||
* @param duration Length of time to wait in milliseconds
|
||||
* @param callback The function to call back when the timer has expired
|
||||
* @return A handle that can be used to cancel the timer if it is no longer
|
||||
* needed.
|
||||
*/
|
||||
timer_ptr set_timer(long, timer_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"debug connection set timer");
|
||||
m_timer_handler = handler;
|
||||
return timer_ptr();
|
||||
}
|
||||
|
||||
/// Manual input supply (read all)
|
||||
/**
|
||||
* Similar to read_some, but continues to read until all bytes in the
|
||||
* supplied buffer have been read or the connection runs out of read
|
||||
* requests.
|
||||
*
|
||||
* This method still may not read all of the bytes in the input buffer. if
|
||||
* it doesn't it indicates that the connection was most likely closed or
|
||||
* is in an error state where it is no longer accepting new input.
|
||||
*
|
||||
* @since 0.3.0
|
||||
*
|
||||
* @param buf Char buffer to read into the websocket
|
||||
* @param len Length of buf
|
||||
* @return The number of characters from buf actually read.
|
||||
*/
|
||||
size_t read_all(char const * buf, size_t len) {
|
||||
size_t total_read = 0;
|
||||
size_t temp_read = 0;
|
||||
|
||||
do {
|
||||
temp_read = this->read_some_impl(buf+total_read,len-total_read);
|
||||
total_read += temp_read;
|
||||
} while (temp_read != 0 && total_read < len);
|
||||
|
||||
return total_read;
|
||||
}
|
||||
|
||||
// debug stuff to invoke the async handlers
|
||||
void expire_timer(lib::error_code const & ec) {
|
||||
m_timer_handler(ec);
|
||||
}
|
||||
|
||||
void fullfil_write() {
|
||||
m_write_handler(lib::error_code());
|
||||
}
|
||||
protected:
|
||||
/// Initialize the connection transport
|
||||
/**
|
||||
* Initialize the connection's transport component.
|
||||
*
|
||||
* @param handler The `init_handler` to call when initialization is done
|
||||
*/
|
||||
void init(init_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"debug connection init");
|
||||
handler(lib::error_code());
|
||||
}
|
||||
|
||||
/// Initiate an async_read for at least num_bytes bytes into buf
|
||||
/**
|
||||
* Initiates an async_read request for at least num_bytes bytes. The input
|
||||
* will be read into buf. A maximum of len bytes will be input. When the
|
||||
* operation is complete, handler will be called with the status and number
|
||||
* of bytes read.
|
||||
*
|
||||
* This method may or may not call handler from within the initial call. The
|
||||
* application should be prepared to accept either.
|
||||
*
|
||||
* The application should never call this method a second time before it has
|
||||
* been called back for the first read. If this is done, the second read
|
||||
* will be called back immediately with a double_read error.
|
||||
*
|
||||
* If num_bytes or len are zero handler will be called back immediately
|
||||
* indicating success.
|
||||
*
|
||||
* @param num_bytes Don't call handler until at least this many bytes have
|
||||
* been read.
|
||||
* @param buf The buffer to read bytes into
|
||||
* @param len The size of buf. At maximum, this many bytes will be read.
|
||||
* @param handler The callback to invoke when the operation is complete or
|
||||
* ends in an error
|
||||
*/
|
||||
void async_read_at_least(size_t num_bytes, char * buf, size_t len,
|
||||
read_handler handler)
|
||||
{
|
||||
std::stringstream s;
|
||||
s << "debug_con async_read_at_least: " << num_bytes;
|
||||
m_alog.write(log::alevel::devel,s.str());
|
||||
|
||||
if (num_bytes > len) {
|
||||
handler(make_error_code(error::invalid_num_bytes),size_t(0));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_reading == true) {
|
||||
handler(make_error_code(error::double_read),size_t(0));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num_bytes == 0 || len == 0) {
|
||||
handler(lib::error_code(),size_t(0));
|
||||
return;
|
||||
}
|
||||
|
||||
m_buf = buf;
|
||||
m_len = len;
|
||||
m_bytes_needed = num_bytes;
|
||||
m_read_handler = handler;
|
||||
m_cursor = 0;
|
||||
m_reading = true;
|
||||
}
|
||||
|
||||
/// Asyncronous Transport Write
|
||||
/**
|
||||
* Write len bytes in buf to the output stream. Call handler to report
|
||||
* success or failure. handler may or may not be called during async_write,
|
||||
* but it must be safe for this to happen.
|
||||
*
|
||||
* Will return 0 on success.
|
||||
*
|
||||
* @param buf buffer to read bytes from
|
||||
* @param len number of bytes to write
|
||||
* @param handler Callback to invoke with operation status.
|
||||
*/
|
||||
void async_write(char const *, size_t, write_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"debug_con async_write");
|
||||
m_write_handler = handler;
|
||||
}
|
||||
|
||||
/// Asyncronous Transport Write (scatter-gather)
|
||||
/**
|
||||
* Write a sequence of buffers to the output stream. Call handler to report
|
||||
* success or failure. handler may or may not be called during async_write,
|
||||
* but it must be safe for this to happen.
|
||||
*
|
||||
* Will return 0 on success.
|
||||
*
|
||||
* @param bufs vector of buffers to write
|
||||
* @param handler Callback to invoke with operation status.
|
||||
*/
|
||||
void async_write(std::vector<buffer> const &, write_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"debug_con async_write buffer list");
|
||||
m_write_handler = handler;
|
||||
}
|
||||
|
||||
/// Set Connection Handle
|
||||
/**
|
||||
* @param hdl The new handle
|
||||
*/
|
||||
void set_handle(connection_hdl) {}
|
||||
|
||||
/// Call given handler back within the transport's event system (if present)
|
||||
/**
|
||||
* Invoke a callback within the transport's event system if it has one. If
|
||||
* it doesn't, the handler will be invoked immediately before this function
|
||||
* returns.
|
||||
*
|
||||
* @param handler The callback to invoke
|
||||
*
|
||||
* @return Whether or not the transport was able to register the handler for
|
||||
* callback.
|
||||
*/
|
||||
lib::error_code dispatch(dispatch_handler handler) {
|
||||
handler();
|
||||
return lib::error_code();
|
||||
}
|
||||
|
||||
/// Perform cleanup on socket shutdown_handler
|
||||
/**
|
||||
* @param h The `shutdown_handler` to call back when complete
|
||||
*/
|
||||
void async_shutdown(shutdown_handler handler) {
|
||||
handler(lib::error_code());
|
||||
}
|
||||
|
||||
size_t read_some_impl(char const * buf, size_t len) {
|
||||
m_alog.write(log::alevel::devel,"debug_con read_some");
|
||||
|
||||
if (!m_reading) {
|
||||
m_elog.write(log::elevel::devel,"write while not reading");
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t bytes_to_copy = (std::min)(len,m_len-m_cursor);
|
||||
|
||||
std::copy(buf,buf+bytes_to_copy,m_buf+m_cursor);
|
||||
|
||||
m_cursor += bytes_to_copy;
|
||||
|
||||
if (m_cursor >= m_bytes_needed) {
|
||||
complete_read(lib::error_code());
|
||||
}
|
||||
|
||||
return bytes_to_copy;
|
||||
}
|
||||
|
||||
/// Signal that a requested read is complete
|
||||
/**
|
||||
* Sets the reading flag to false and returns the handler that should be
|
||||
* called back with the result of the read. The cursor position that is sent
|
||||
* is whatever the value of m_cursor is.
|
||||
*
|
||||
* It MUST NOT be called when m_reading is false.
|
||||
* it MUST be called while holding the read lock
|
||||
*
|
||||
* It is important to use this method rather than directly setting/calling
|
||||
* m_read_handler back because this function makes sure to delete the
|
||||
* locally stored handler which contains shared pointers that will otherwise
|
||||
* cause circular reference based memory leaks.
|
||||
*
|
||||
* @param ec The error code to forward to the read handler
|
||||
*/
|
||||
void complete_read(lib::error_code const & ec) {
|
||||
m_reading = false;
|
||||
|
||||
read_handler handler = m_read_handler;
|
||||
m_read_handler = read_handler();
|
||||
|
||||
handler(ec,m_cursor);
|
||||
}
|
||||
private:
|
||||
timer_handler m_timer_handler;
|
||||
|
||||
// Read space (Protected by m_read_mutex)
|
||||
char * m_buf;
|
||||
size_t m_len;
|
||||
size_t m_bytes_needed;
|
||||
read_handler m_read_handler;
|
||||
size_t m_cursor;
|
||||
|
||||
// transport resources
|
||||
connection_hdl m_connection_hdl;
|
||||
write_handler m_write_handler;
|
||||
shutdown_handler m_shutdown_handler;
|
||||
|
||||
bool m_reading;
|
||||
bool const m_is_server;
|
||||
bool m_is_secure;
|
||||
alog_type & m_alog;
|
||||
elog_type & m_elog;
|
||||
std::string m_remote_endpoint;
|
||||
};
|
||||
|
||||
|
||||
} // namespace debug
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_DEBUG_CON_HPP
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_DEBUG_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_DEBUG_HPP
|
||||
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
#include <websocketpp/logger/levels.hpp>
|
||||
|
||||
#include <websocketpp/transport/base/endpoint.hpp>
|
||||
#include <websocketpp/transport/debug/connection.hpp>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
namespace debug {
|
||||
|
||||
template <typename config>
|
||||
class endpoint {
|
||||
public:
|
||||
/// Type of this endpoint transport component
|
||||
typedef endpoint type;
|
||||
/// Type of a pointer to this endpoint transport component
|
||||
typedef lib::shared_ptr<type> ptr;
|
||||
|
||||
/// Type of this endpoint's concurrency policy
|
||||
typedef typename config::concurrency_type concurrency_type;
|
||||
/// Type of this endpoint's error logging policy
|
||||
typedef typename config::elog_type elog_type;
|
||||
/// Type of this endpoint's access logging policy
|
||||
typedef typename config::alog_type alog_type;
|
||||
|
||||
/// Type of this endpoint transport component's associated connection
|
||||
/// transport component.
|
||||
typedef debug::connection<config> transport_con_type;
|
||||
/// Type of a shared pointer to this endpoint transport component's
|
||||
/// associated connection transport component
|
||||
typedef typename transport_con_type::ptr transport_con_ptr;
|
||||
|
||||
// generate and manage our own io_service
|
||||
explicit endpoint()
|
||||
{
|
||||
//std::cout << "transport::iostream::endpoint constructor" << std::endl;
|
||||
}
|
||||
|
||||
/// Set whether or not endpoint can create secure connections
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* Setting this value only indicates whether or not the endpoint is capable
|
||||
* of producing and managing secure connections. Connections produced by
|
||||
* this endpoint must also be individually flagged as secure if they are.
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value Whether or not the endpoint can create secure connections.
|
||||
*/
|
||||
void set_secure(bool) {}
|
||||
|
||||
/// Tests whether or not the underlying transport is secure
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* @return Whether or not the underlying transport is secure
|
||||
*/
|
||||
bool is_secure() const {
|
||||
return false;
|
||||
}
|
||||
protected:
|
||||
/// Initialize logging
|
||||
/**
|
||||
* The loggers are located in the main endpoint class. As such, the
|
||||
* transport doesn't have direct access to them. This method is called
|
||||
* by the endpoint constructor to allow shared logging from the transport
|
||||
* component. These are raw pointers to member variables of the endpoint.
|
||||
* In particular, they cannot be used in the transport constructor as they
|
||||
* haven't been constructed yet, and cannot be used in the transport
|
||||
* destructor as they will have been destroyed by then.
|
||||
*
|
||||
* @param a A pointer to the access logger to use.
|
||||
* @param e A pointer to the error logger to use.
|
||||
*/
|
||||
void init_logging(alog_type *, elog_type *) {}
|
||||
|
||||
/// Initiate a new connection
|
||||
/**
|
||||
* @param tcon A pointer to the transport connection component of the
|
||||
* connection to connect.
|
||||
* @param u A URI pointer to the URI to connect to.
|
||||
* @param cb The function to call back with the results when complete.
|
||||
*/
|
||||
void async_connect(transport_con_ptr, uri_ptr, connect_handler cb) {
|
||||
cb(lib::error_code());
|
||||
}
|
||||
|
||||
/// Initialize a connection
|
||||
/**
|
||||
* Init is called by an endpoint once for each newly created connection.
|
||||
* It's purpose is to give the transport policy the chance to perform any
|
||||
* transport specific initialization that couldn't be done via the default
|
||||
* constructor.
|
||||
*
|
||||
* @param tcon A pointer to the transport portion of the connection.
|
||||
* @return A status code indicating the success or failure of the operation
|
||||
*/
|
||||
lib::error_code init(transport_con_ptr) {
|
||||
return lib::error_code();
|
||||
}
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
} // namespace debug
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_DEBUG_HPP
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_STUB_BASE_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_STUB_BASE_HPP
|
||||
|
||||
#include <websocketpp/common/system_error.hpp>
|
||||
#include <websocketpp/common/cpp11.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
/// Stub transport policy that has no input or output.
|
||||
namespace stub {
|
||||
|
||||
/// stub transport errors
|
||||
namespace error {
|
||||
enum value {
|
||||
/// Catch-all error for transport policy errors that don't fit in other
|
||||
/// categories
|
||||
general = 1,
|
||||
|
||||
/// not implemented
|
||||
not_implemented
|
||||
};
|
||||
|
||||
/// stub transport error category
|
||||
class category : public lib::error_category {
|
||||
public:
|
||||
category() {}
|
||||
|
||||
char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {
|
||||
return "websocketpp.transport.stub";
|
||||
}
|
||||
|
||||
std::string message(int value) const {
|
||||
switch(value) {
|
||||
case general:
|
||||
return "Generic stub transport policy error";
|
||||
case not_implemented:
|
||||
return "feature not implemented";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/// Get a reference to a static copy of the stub transport error category
|
||||
inline lib::error_category const & get_category() {
|
||||
static category instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// Get an error code with the given value and the stub transport category
|
||||
inline lib::error_code make_error_code(error::value e) {
|
||||
return lib::error_code(static_cast<int>(e), get_category());
|
||||
}
|
||||
|
||||
} // namespace error
|
||||
} // namespace stub
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
_WEBSOCKETPP_ERROR_CODE_ENUM_NS_START_
|
||||
template<> struct is_error_code_enum<websocketpp::transport::stub::error::value>
|
||||
{
|
||||
static bool const value = true;
|
||||
};
|
||||
_WEBSOCKETPP_ERROR_CODE_ENUM_NS_END_
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_STUB_BASE_HPP
|
||||
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_STUB_CON_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_STUB_CON_HPP
|
||||
|
||||
#include <websocketpp/transport/stub/base.hpp>
|
||||
|
||||
#include <websocketpp/transport/base/connection.hpp>
|
||||
|
||||
#include <websocketpp/logger/levels.hpp>
|
||||
|
||||
#include <websocketpp/common/connection_hdl.hpp>
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
#include <websocketpp/common/platforms.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
namespace stub {
|
||||
|
||||
/// Empty timer class to stub out for timer functionality that stub
|
||||
/// transport doesn't support
|
||||
struct timer {
|
||||
void cancel() {}
|
||||
};
|
||||
|
||||
template <typename config>
|
||||
class connection : public lib::enable_shared_from_this< connection<config> > {
|
||||
public:
|
||||
/// Type of this connection transport component
|
||||
typedef connection<config> type;
|
||||
/// Type of a shared pointer to this connection transport component
|
||||
typedef lib::shared_ptr<type> ptr;
|
||||
|
||||
/// transport concurrency policy
|
||||
typedef typename config::concurrency_type concurrency_type;
|
||||
/// Type of this transport's access logging policy
|
||||
typedef typename config::alog_type alog_type;
|
||||
/// Type of this transport's error logging policy
|
||||
typedef typename config::elog_type elog_type;
|
||||
|
||||
// Concurrency policy types
|
||||
typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
|
||||
typedef typename concurrency_type::mutex_type mutex_type;
|
||||
|
||||
typedef lib::shared_ptr<timer> timer_ptr;
|
||||
|
||||
explicit connection(bool is_server, alog_type & alog, elog_type & elog)
|
||||
: m_alog(alog), m_elog(elog)
|
||||
{
|
||||
m_alog.write(log::alevel::devel,"stub con transport constructor");
|
||||
}
|
||||
|
||||
/// Get a shared pointer to this component
|
||||
ptr get_shared() {
|
||||
return type::shared_from_this();
|
||||
}
|
||||
|
||||
/// Set whether or not this connection is secure
|
||||
/**
|
||||
* Todo: docs
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value Whether or not this connection is secure.
|
||||
*/
|
||||
void set_secure(bool value) {}
|
||||
|
||||
/// Tests whether or not the underlying transport is secure
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* @return Whether or not the underlying transport is secure
|
||||
*/
|
||||
bool is_secure() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Set uri hook
|
||||
/**
|
||||
* Called by the endpoint as a connection is being established to provide
|
||||
* the uri being connected to to the transport layer.
|
||||
*
|
||||
* Implementation is optional and can be ignored if the transport has no
|
||||
* need for this information.
|
||||
*
|
||||
* @since 0.6.0
|
||||
*
|
||||
* @param u The uri to set
|
||||
*/
|
||||
void set_uri(uri_ptr) {}
|
||||
|
||||
/// Set human readable remote endpoint address
|
||||
/**
|
||||
* Sets the remote endpoint address returned by `get_remote_endpoint`. This
|
||||
* value should be a human readable string that describes the remote
|
||||
* endpoint. Typically an IP address or hostname, perhaps with a port. But
|
||||
* may be something else depending on the nature of the underlying
|
||||
* transport.
|
||||
*
|
||||
* If none is set a default is returned.
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value The remote endpoint address to set.
|
||||
*/
|
||||
void set_remote_endpoint(std::string value) {}
|
||||
|
||||
/// Get human readable remote endpoint address
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* This value is used in access and error logs and is available to the end
|
||||
* application for including in user facing interfaces and messages.
|
||||
*
|
||||
* @return A string identifying the address of the remote endpoint
|
||||
*/
|
||||
std::string get_remote_endpoint() const {
|
||||
return "unknown (stub transport)";
|
||||
}
|
||||
|
||||
/// Get the connection handle
|
||||
/**
|
||||
* @return The handle for this connection.
|
||||
*/
|
||||
connection_hdl get_handle() const {
|
||||
return connection_hdl();
|
||||
}
|
||||
|
||||
/// Call back a function after a period of time.
|
||||
/**
|
||||
* Timers are not implemented in this transport. The timer pointer will
|
||||
* always be empty. The handler will never be called.
|
||||
*
|
||||
* @param duration Length of time to wait in milliseconds
|
||||
* @param callback The function to call back when the timer has expired
|
||||
* @return A handle that can be used to cancel the timer if it is no longer
|
||||
* needed.
|
||||
*/
|
||||
timer_ptr set_timer(long duration, timer_handler handler) {
|
||||
return timer_ptr();
|
||||
}
|
||||
protected:
|
||||
/// Initialize the connection transport
|
||||
/**
|
||||
* Initialize the connection's transport component.
|
||||
*
|
||||
* @param handler The `init_handler` to call when initialization is done
|
||||
*/
|
||||
void init(init_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"stub connection init");
|
||||
handler(make_error_code(error::not_implemented));
|
||||
}
|
||||
|
||||
/// Initiate an async_read for at least num_bytes bytes into buf
|
||||
/**
|
||||
* Initiates an async_read request for at least num_bytes bytes. The input
|
||||
* will be read into buf. A maximum of len bytes will be input. When the
|
||||
* operation is complete, handler will be called with the status and number
|
||||
* of bytes read.
|
||||
*
|
||||
* This method may or may not call handler from within the initial call. The
|
||||
* application should be prepared to accept either.
|
||||
*
|
||||
* The application should never call this method a second time before it has
|
||||
* been called back for the first read. If this is done, the second read
|
||||
* will be called back immediately with a double_read error.
|
||||
*
|
||||
* If num_bytes or len are zero handler will be called back immediately
|
||||
* indicating success.
|
||||
*
|
||||
* @param num_bytes Don't call handler until at least this many bytes have
|
||||
* been read.
|
||||
* @param buf The buffer to read bytes into
|
||||
* @param len The size of buf. At maximum, this many bytes will be read.
|
||||
* @param handler The callback to invoke when the operation is complete or
|
||||
* ends in an error
|
||||
*/
|
||||
void async_read_at_least(size_t num_bytes, char * buf, size_t len,
|
||||
read_handler handler)
|
||||
{
|
||||
m_alog.write(log::alevel::devel, "stub_con async_read_at_least");
|
||||
handler(make_error_code(error::not_implemented), 0);
|
||||
}
|
||||
|
||||
/// Asyncronous Transport Write
|
||||
/**
|
||||
* Write len bytes in buf to the output stream. Call handler to report
|
||||
* success or failure. handler may or may not be called during async_write,
|
||||
* but it must be safe for this to happen.
|
||||
*
|
||||
* Will return 0 on success.
|
||||
*
|
||||
* @param buf buffer to read bytes from
|
||||
* @param len number of bytes to write
|
||||
* @param handler Callback to invoke with operation status.
|
||||
*/
|
||||
void async_write(char const * buf, size_t len, write_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"stub_con async_write");
|
||||
handler(make_error_code(error::not_implemented));
|
||||
}
|
||||
|
||||
/// Asyncronous Transport Write (scatter-gather)
|
||||
/**
|
||||
* Write a sequence of buffers to the output stream. Call handler to report
|
||||
* success or failure. handler may or may not be called during async_write,
|
||||
* but it must be safe for this to happen.
|
||||
*
|
||||
* Will return 0 on success.
|
||||
*
|
||||
* @param bufs vector of buffers to write
|
||||
* @param handler Callback to invoke with operation status.
|
||||
*/
|
||||
void async_write(std::vector<buffer> const & bufs, write_handler handler) {
|
||||
m_alog.write(log::alevel::devel,"stub_con async_write buffer list");
|
||||
handler(make_error_code(error::not_implemented));
|
||||
}
|
||||
|
||||
/// Set Connection Handle
|
||||
/**
|
||||
* @param hdl The new handle
|
||||
*/
|
||||
void set_handle(connection_hdl hdl) {}
|
||||
|
||||
/// Call given handler back within the transport's event system (if present)
|
||||
/**
|
||||
* Invoke a callback within the transport's event system if it has one. If
|
||||
* it doesn't, the handler will be invoked immediately before this function
|
||||
* returns.
|
||||
*
|
||||
* @param handler The callback to invoke
|
||||
*
|
||||
* @return Whether or not the transport was able to register the handler for
|
||||
* callback.
|
||||
*/
|
||||
lib::error_code dispatch(dispatch_handler handler) {
|
||||
handler();
|
||||
return lib::error_code();
|
||||
}
|
||||
|
||||
/// Perform cleanup on socket shutdown_handler
|
||||
/**
|
||||
* @param h The `shutdown_handler` to call back when complete
|
||||
*/
|
||||
void async_shutdown(shutdown_handler handler) {
|
||||
handler(lib::error_code());
|
||||
}
|
||||
private:
|
||||
// member variables!
|
||||
alog_type & m_alog;
|
||||
elog_type & m_elog;
|
||||
};
|
||||
|
||||
|
||||
} // namespace stub
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_STUB_CON_HPP
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 WEBSOCKETPP_TRANSPORT_STUB_HPP
|
||||
#define WEBSOCKETPP_TRANSPORT_STUB_HPP
|
||||
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
#include <websocketpp/logger/levels.hpp>
|
||||
|
||||
#include <websocketpp/transport/base/endpoint.hpp>
|
||||
#include <websocketpp/transport/stub/connection.hpp>
|
||||
|
||||
namespace websocketpp {
|
||||
namespace transport {
|
||||
namespace stub {
|
||||
|
||||
template <typename config>
|
||||
class endpoint {
|
||||
public:
|
||||
/// Type of this endpoint transport component
|
||||
typedef endpoint type;
|
||||
/// Type of a pointer to this endpoint transport component
|
||||
typedef lib::shared_ptr<type> ptr;
|
||||
|
||||
/// Type of this endpoint's concurrency policy
|
||||
typedef typename config::concurrency_type concurrency_type;
|
||||
/// Type of this endpoint's error logging policy
|
||||
typedef typename config::elog_type elog_type;
|
||||
/// Type of this endpoint's access logging policy
|
||||
typedef typename config::alog_type alog_type;
|
||||
|
||||
/// Type of this endpoint transport component's associated connection
|
||||
/// transport component.
|
||||
typedef stub::connection<config> transport_con_type;
|
||||
/// Type of a shared pointer to this endpoint transport component's
|
||||
/// associated connection transport component
|
||||
typedef typename transport_con_type::ptr transport_con_ptr;
|
||||
|
||||
// generate and manage our own io_service
|
||||
explicit endpoint()
|
||||
{
|
||||
//std::cout << "transport::iostream::endpoint constructor" << std::endl;
|
||||
}
|
||||
|
||||
/// Set whether or not endpoint can create secure connections
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* Setting this value only indicates whether or not the endpoint is capable
|
||||
* of producing and managing secure connections. Connections produced by
|
||||
* this endpoint must also be individually flagged as secure if they are.
|
||||
*
|
||||
* @since 0.3.0-alpha4
|
||||
*
|
||||
* @param value Whether or not the endpoint can create secure connections.
|
||||
*/
|
||||
void set_secure(bool value) {}
|
||||
|
||||
/// Tests whether or not the underlying transport is secure
|
||||
/**
|
||||
* TODO: docs
|
||||
*
|
||||
* @return Whether or not the underlying transport is secure
|
||||
*/
|
||||
bool is_secure() const {
|
||||
return false;
|
||||
}
|
||||
protected:
|
||||
/// Initialize logging
|
||||
/**
|
||||
* The loggers are located in the main endpoint class. As such, the
|
||||
* transport doesn't have direct access to them. This method is called
|
||||
* by the endpoint constructor to allow shared logging from the transport
|
||||
* component. These are raw pointers to member variables of the endpoint.
|
||||
* In particular, they cannot be used in the transport constructor as they
|
||||
* haven't been constructed yet, and cannot be used in the transport
|
||||
* destructor as they will have been destroyed by then.
|
||||
*
|
||||
* @param a A pointer to the access logger to use.
|
||||
* @param e A pointer to the error logger to use.
|
||||
*/
|
||||
void init_logging(alog_type * a, elog_type * e) {}
|
||||
|
||||
/// Initiate a new connection
|
||||
/**
|
||||
* @param tcon A pointer to the transport connection component of the
|
||||
* connection to connect.
|
||||
* @param u A URI pointer to the URI to connect to.
|
||||
* @param cb The function to call back with the results when complete.
|
||||
*/
|
||||
void async_connect(transport_con_ptr tcon, uri_ptr u, connect_handler cb) {
|
||||
cb(make_error_code(error::not_implemented));
|
||||
}
|
||||
|
||||
/// Initialize a connection
|
||||
/**
|
||||
* Init is called by an endpoint once for each newly created connection.
|
||||
* It's purpose is to give the transport policy the chance to perform any
|
||||
* transport specific initialization that couldn't be done via the default
|
||||
* constructor.
|
||||
*
|
||||
* @param tcon A pointer to the transport portion of the connection.
|
||||
* @return A status code indicating the success or failure of the operation
|
||||
*/
|
||||
lib::error_code init(transport_con_ptr tcon) {
|
||||
return make_error_code(error::not_implemented);
|
||||
}
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
} // namespace stub
|
||||
} // namespace transport
|
||||
} // namespace websocketpp
|
||||
|
||||
#endif // WEBSOCKETPP_TRANSPORT_STUB_HPP
|
||||
Reference in New Issue
Block a user