1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642 |
- #ifndef WEBSOCKETPP_CONNECTION_HPP
- #define WEBSOCKETPP_CONNECTION_HPP
- #include <websocketpp/close.hpp>
- #include <websocketpp/error.hpp>
- #include <websocketpp/frame.hpp>
- #include <websocketpp/logger/levels.hpp>
- #include <websocketpp/processors/processor.hpp>
- #include <websocketpp/transport/base/connection.hpp>
- #include <websocketpp/http/constants.hpp>
- #include <websocketpp/common/connection_hdl.hpp>
- #include <websocketpp/common/cpp11.hpp>
- #include <websocketpp/common/functional.hpp>
- #include <queue>
- #include <sstream>
- #include <string>
- #include <vector>
- namespace websocketpp {
- typedef lib::function<void(connection_hdl)> open_handler;
- typedef lib::function<void(connection_hdl)> close_handler;
- typedef lib::function<void(connection_hdl)> fail_handler;
- typedef lib::function<void(connection_hdl)> interrupt_handler;
- typedef lib::function<bool(connection_hdl,std::string)> ping_handler;
- typedef lib::function<void(connection_hdl,std::string)> pong_handler;
- typedef lib::function<void(connection_hdl,std::string)> pong_timeout_handler;
- typedef lib::function<bool(connection_hdl)> validate_handler;
- typedef lib::function<void(connection_hdl)> http_handler;
- typedef lib::function<void(lib::error_code const & ec, size_t bytes_transferred)> read_handler;
- typedef lib::function<void(lib::error_code const & ec)> write_frame_handler;
- #ifdef _WEBSOCKETPP_INITIALIZER_LISTS_
-
-
- static std::vector<int> const versions_supported = {0,7,8,13};
- #else
-
- static int const helper[] = {0,7,8,13};
-
-
- static std::vector<int> const versions_supported(helper,helper+4);
- #endif
- namespace session {
- namespace state {
-
- enum value {
- connecting = 0,
- open = 1,
- closing = 2,
- closed = 3
- };
- }
- namespace fail {
- namespace status {
- enum value {
- GOOD = 0,
- SYSTEM = 1,
- WEBSOCKET = 2,
- UNKNOWN = 3,
- TIMEOUT_TLS = 4,
- TIMEOUT_WS = 5
- };
- }
- }
- namespace internal_state {
-
-
-
- enum value {
- USER_INIT = 0,
- TRANSPORT_INIT = 1,
- READ_HTTP_REQUEST = 2,
- WRITE_HTTP_REQUEST = 3,
- READ_HTTP_RESPONSE = 4,
- WRITE_HTTP_RESPONSE = 5,
- PROCESS_HTTP_REQUEST = 6,
- PROCESS_CONNECTION = 7
- };
- }
- namespace http_state {
-
- enum value {
- init = 0,
- deferred = 1,
- headers_written = 2,
- body_written = 3,
- closed = 4
- };
- }
- }
- template <typename config>
- class connection
- : public config::transport_type::transport_con_type
- , public config::connection_base
- {
- public:
-
- typedef connection<config> type;
-
- typedef lib::shared_ptr<type> ptr;
-
- typedef lib::weak_ptr<type> weak_ptr;
-
- typedef typename config::concurrency_type concurrency_type;
-
- typedef typename config::alog_type alog_type;
-
- typedef typename config::elog_type elog_type;
-
- typedef typename config::transport_type::transport_con_type
- transport_con_type;
-
- typedef typename transport_con_type::ptr transport_con_ptr;
- typedef lib::function<void(ptr)> termination_handler;
- typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
- typedef typename concurrency_type::mutex_type mutex_type;
- typedef typename config::request_type request_type;
- typedef typename config::response_type response_type;
- typedef typename config::message_type message_type;
- typedef typename message_type::ptr message_ptr;
- typedef typename config::con_msg_manager_type con_msg_manager_type;
- typedef typename con_msg_manager_type::ptr con_msg_manager_ptr;
-
- typedef typename config::rng_type rng_type;
- typedef processor::processor<config> processor_type;
- typedef lib::shared_ptr<processor_type> processor_ptr;
-
- typedef lib::function<void(connection_hdl,message_ptr)> message_handler;
-
- typedef typename transport_con_type::timer_ptr timer_ptr;
-
- typedef session::internal_state::value istate_type;
- private:
- enum terminate_status {
- failed = 1,
- closed,
- unknown
- };
- public:
- explicit connection(bool p_is_server, std::string const & ua, const lib::shared_ptr<alog_type>& alog,
- const lib::shared_ptr<elog_type>& elog, rng_type & rng)
- : transport_con_type(p_is_server, alog, elog)
- , m_handle_read_frame(lib::bind(
- &type::handle_read_frame,
- this,
- lib::placeholders::_1,
- lib::placeholders::_2
- ))
- , m_write_frame_handler(lib::bind(
- &type::handle_write_frame,
- this,
- lib::placeholders::_1
- ))
- , m_user_agent(ua)
- , m_open_handshake_timeout_dur(config::timeout_open_handshake)
- , m_close_handshake_timeout_dur(config::timeout_close_handshake)
- , m_pong_timeout_dur(config::timeout_pong)
- , m_max_message_size(config::max_message_size)
- , m_state(session::state::connecting)
- , m_internal_state(session::internal_state::USER_INIT)
- , m_msg_manager(new con_msg_manager_type())
- , m_send_buffer_size(0)
- , m_write_flag(false)
- , m_read_flag(true)
- , m_is_server(p_is_server)
- , m_alog(alog)
- , m_elog(elog)
- , m_rng(rng)
- , m_local_close_code(close::status::abnormal_close)
- , m_remote_close_code(close::status::abnormal_close)
- , m_is_http(false)
- , m_http_state(session::http_state::init)
- , m_was_clean(false)
- {
- m_alog->write(log::alevel::devel,"connection constructor");
- }
-
- ptr get_shared() {
- return lib::static_pointer_cast<type>(transport_con_type::get_shared());
- }
-
-
-
-
-
- void set_open_handler(open_handler h) {
- m_open_handler = h;
- }
-
-
- void set_close_handler(close_handler h) {
- m_close_handler = h;
- }
-
-
- void set_fail_handler(fail_handler h) {
- m_fail_handler = h;
- }
-
-
- void set_ping_handler(ping_handler h) {
- m_ping_handler = h;
- }
-
-
- void set_pong_handler(pong_handler h) {
- m_pong_handler = h;
- }
-
-
- void set_pong_timeout_handler(pong_timeout_handler h) {
- m_pong_timeout_handler = h;
- }
-
-
- void set_interrupt_handler(interrupt_handler h) {
- m_interrupt_handler = h;
- }
-
-
- void set_http_handler(http_handler h) {
- m_http_handler = h;
- }
-
-
- void set_validate_handler(validate_handler h) {
- m_validate_handler = h;
- }
-
-
- void set_message_handler(message_handler h) {
- m_message_handler = h;
- }
-
-
-
-
-
- void set_open_handshake_timeout(long dur) {
- m_open_handshake_timeout_dur = dur;
- }
-
-
- void set_close_handshake_timeout(long dur) {
- m_close_handshake_timeout_dur = dur;
- }
-
-
- void set_pong_timeout(long dur) {
- m_pong_timeout_dur = dur;
- }
-
-
- size_t get_max_message_size() const {
- return m_max_message_size;
- }
-
-
-
- void set_max_message_size(size_t new_value) {
- m_max_message_size = new_value;
- if (m_processor) {
- m_processor->set_max_message_size(new_value);
- }
- }
-
-
-
- size_t get_max_http_body_size() const {
- return m_request.get_max_body_size();
- }
-
-
-
- void set_max_http_body_size(size_t new_value) {
- m_request.set_max_body_size(new_value);
- }
-
-
-
-
-
- size_t get_buffered_amount() const;
-
-
- size_t buffered_amount() const {
- return get_buffered_amount();
- }
-
-
-
-
-
- lib::error_code send(std::string const & payload, frame::opcode::value op =
- frame::opcode::text);
-
-
- lib::error_code send(void const * payload, size_t len, frame::opcode::value
- op = frame::opcode::binary);
-
-
- lib::error_code send(message_ptr msg);
-
-
- lib::error_code interrupt();
-
-
- void handle_interrupt();
-
-
-
- lib::error_code pause_reading();
-
- void handle_pause_reading();
-
-
- lib::error_code resume_reading();
-
- void handle_resume_reading();
-
-
- void ping(std::string const & payload);
-
- void ping(std::string const & payload, lib::error_code & ec);
-
- void handle_pong_timeout(std::string payload, lib::error_code const & ec);
-
-
- void pong(std::string const & payload);
-
- void pong(std::string const & payload, lib::error_code & ec);
-
-
- void close(close::status::value const code, std::string const & reason);
-
- void close(close::status::value const code, std::string const & reason,
- lib::error_code & ec);
-
-
-
-
-
- bool get_secure() const;
-
-
- std::string const & get_host() const;
-
-
- std::string const & get_resource() const;
-
-
- uint16_t get_port() const;
-
-
- uri_ptr get_uri() const;
-
-
- void set_uri(uri_ptr uri);
-
-
-
-
-
- std::string const & get_subprotocol() const;
-
-
- std::vector<std::string> const & get_requested_subprotocols() const;
-
-
- void add_subprotocol(std::string const & request, lib::error_code & ec);
-
-
- void add_subprotocol(std::string const & request);
-
-
- void select_subprotocol(std::string const & value, lib::error_code & ec);
-
-
- void select_subprotocol(std::string const & value);
-
-
-
-
-
- std::string const & get_request_header(std::string const & key) const;
-
-
- std::string const & get_request_body() const;
-
-
- std::string const & get_response_header(std::string const & key) const;
-
-
- http::status_code::value get_response_code() const {
- return m_response.get_status_code();
- }
-
-
- std::string const & get_response_msg() const {
- return m_response.get_status_msg();
- }
-
-
-
- void set_status(http::status_code::value code);
-
-
- void set_status(http::status_code::value code, std::string const & msg);
-
-
- void set_body(std::string const & value);
-
-
- void append_header(std::string const & key, std::string const & val);
-
-
- void replace_header(std::string const & key, std::string const & val);
-
-
- void remove_header(std::string const & key);
-
-
- request_type const & get_request() const {
- return m_request;
- }
-
-
-
- response_type const & get_response() const {
- return m_response;
- }
-
-
-
- lib::error_code defer_http_response();
-
-
-
- void send_http_response(lib::error_code & ec);
-
-
- void send_http_response();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- connection_hdl get_handle() const {
- return m_connection_hdl;
- }
-
-
- bool is_server() const {
- return m_is_server;
- }
-
-
- std::string const & get_origin() const;
-
-
- session::state::value get_state() const;
-
-
- close::status::value get_local_close_code() const {
- return m_local_close_code;
- }
-
-
- std::string const & get_local_close_reason() const {
- return m_local_close_reason;
- }
-
-
- close::status::value get_remote_close_code() const {
- return m_remote_close_code;
- }
-
-
- std::string const & get_remote_close_reason() const {
- return m_remote_close_reason;
- }
-
-
- lib::error_code get_ec() const {
- return m_ec;
- }
-
-
- message_ptr get_message(websocketpp::frame::opcode::value op, size_t size)
- const
- {
- return m_msg_manager->get_message(op, size);
- }
-
-
-
-
-
-
- void read_handshake(size_t num_bytes);
- void handle_read_handshake(lib::error_code const & ec,
- size_t bytes_transferred);
- void handle_read_http_response(lib::error_code const & ec,
- size_t bytes_transferred);
-
- void handle_write_http_response(lib::error_code const & ec);
- void handle_send_http_request(lib::error_code const & ec);
- void handle_open_handshake_timeout(lib::error_code const & ec);
- void handle_close_handshake_timeout(lib::error_code const & ec);
- void handle_read_frame(lib::error_code const & ec, size_t bytes_transferred);
- void read_frame();
-
- std::vector<int> const & get_supported_versions() const;
-
-
- void set_termination_handler(termination_handler new_handler);
- void terminate(lib::error_code const & ec);
- void handle_terminate(terminate_status tstat, lib::error_code const & ec);
-
-
- void write_frame();
-
-
- void handle_write_frame(lib::error_code const & ec);
-
-
-
-
- void start();
-
-
- void set_handle(connection_hdl hdl) {
- m_connection_hdl = hdl;
- transport_con_type::set_handle(hdl);
- }
- protected:
- void handle_transport_init(lib::error_code const & ec);
-
-
- lib::error_code initialize_processor();
-
-
- lib::error_code process_handshake_request();
- private:
-
-
- void write_http_response(lib::error_code const & ec);
-
- void send_http_request();
-
- void write_http_response_error(lib::error_code const & ec);
-
-
- void process_control_frame(message_ptr msg);
-
-
- lib::error_code send_close_ack(close::status::value code =
- close::status::blank, std::string const & reason = std::string());
-
-
- lib::error_code send_close_frame(close::status::value code =
- close::status::blank, std::string const & reason = std::string(), bool ack = false,
- bool terminal = false);
-
-
- processor_ptr get_processor(int version) const;
-
-
- void write_push(message_ptr msg);
-
-
- message_ptr write_pop();
-
-
- void log_open_result();
-
-
- void log_close_result();
-
-
- void log_fail_result();
-
-
-
- void log_http_result();
-
- template <typename error_type>
- void log_err(log::level l, char const * msg, error_type const & ec) {
- std::stringstream s;
- s << msg << " error: " << ec << " (" << ec.message() << ")";
- m_elog->write(l, s.str());
- }
-
- read_handler m_handle_read_frame;
- write_frame_handler m_write_frame_handler;
-
- std::string const m_user_agent;
-
- connection_hdl m_connection_hdl;
-
- open_handler m_open_handler;
- close_handler m_close_handler;
- fail_handler m_fail_handler;
- ping_handler m_ping_handler;
- pong_handler m_pong_handler;
- pong_timeout_handler m_pong_timeout_handler;
- interrupt_handler m_interrupt_handler;
- http_handler m_http_handler;
- validate_handler m_validate_handler;
- message_handler m_message_handler;
-
- long m_open_handshake_timeout_dur;
- long m_close_handshake_timeout_dur;
- long m_pong_timeout_dur;
- size_t m_max_message_size;
-
-
- session::state::value m_state;
-
-
- istate_type m_internal_state;
- mutable mutex_type m_connection_state_lock;
-
-
- mutex_type m_write_lock;
-
- char m_buf[config::connection_read_buffer_size];
- size_t m_buf_cursor;
- termination_handler m_termination_handler;
- con_msg_manager_ptr m_msg_manager;
- timer_ptr m_handshake_timer;
- timer_ptr m_ping_timer;
-
-
- std::string m_handshake_buffer;
-
-
- processor_ptr m_processor;
-
-
- std::queue<message_ptr> m_send_queue;
-
-
- size_t m_send_buffer_size;
-
-
- std::vector<transport::buffer> m_send_buffer;
-
-
- std::vector<message_ptr> m_current_msgs;
-
-
- bool m_write_flag;
-
- bool m_read_flag;
-
- request_type m_request;
- response_type m_response;
- uri_ptr m_uri;
- std::string m_subprotocol;
-
-
- std::vector<std::string> m_requested_subprotocols;
- bool const m_is_server;
- const lib::shared_ptr<alog_type> m_alog;
- const lib::shared_ptr<elog_type> m_elog;
- rng_type & m_rng;
-
-
- close::status::value m_local_close_code;
-
- std::string m_local_close_reason;
-
- close::status::value m_remote_close_code;
-
- std::string m_remote_close_reason;
-
- lib::error_code m_ec;
-
-
-
- bool m_is_http;
-
-
-
- session::http_state::value m_http_state;
- bool m_was_clean;
- };
- }
- #include <websocketpp/impl/connection_impl.hpp>
- #endif
|