1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588 |
- #ifndef BOOST_BEAST_CORE_BASIC_STREAM_HPP
- #define BOOST_BEAST_CORE_BASIC_STREAM_HPP
- #include <boost/beast/core/detail/config.hpp>
- #include <boost/beast/core/detail/stream_base.hpp>
- #include <boost/beast/core/error.hpp>
- #include <boost/beast/core/rate_policy.hpp>
- #include <boost/beast/core/role.hpp>
- #include <boost/beast/core/stream_traits.hpp>
- #include <boost/asio/async_result.hpp>
- #include <boost/asio/basic_stream_socket.hpp>
- #include <boost/asio/connect.hpp>
- #include <boost/asio/executor.hpp>
- #include <boost/asio/is_executor.hpp>
- #include <boost/core/empty_value.hpp>
- #include <boost/config/workaround.hpp>
- #include <boost/enable_shared_from_this.hpp>
- #include <boost/shared_ptr.hpp>
- #include <chrono>
- #include <limits>
- #include <memory>
- #if ! BOOST_BEAST_DOXYGEN
- namespace boost {
- namespace asio {
- namespace ssl {
- template<typename> class stream;
- }
- }
- }
- #endif
- namespace boost {
- namespace beast {
- template<
- class Protocol,
- class Executor = net::any_io_executor,
- class RatePolicy = unlimited_rate_policy
- >
- class basic_stream
- #if ! BOOST_BEAST_DOXYGEN
- : private detail::stream_base
- #endif
- {
- public:
-
- using socket_type =
- net::basic_stream_socket<Protocol, Executor>;
-
- using executor_type = beast::executor_type<socket_type>;
-
- template<class Executor1>
- struct rebind_executor
- {
-
- using other = basic_stream<
- Protocol, Executor1, RatePolicy>;
- };
-
- using protocol_type = Protocol;
-
- using endpoint_type = typename Protocol::endpoint;
- private:
- using op_state = basic_op_state<Executor>;
- static_assert(
- net::is_executor<Executor>::value || net::execution::is_executor<Executor>::value,
- "Executor type requirements not met");
- struct impl_type
- : boost::enable_shared_from_this<impl_type>
- , boost::empty_value<RatePolicy>
- {
-
- net::basic_stream_socket<
- Protocol, Executor> socket;
- op_state read;
- op_state write;
- net::basic_waitable_timer<
- std::chrono::steady_clock,
- net::wait_traits<
- std::chrono::steady_clock>,
- Executor> timer;
- int waiting = 0;
- impl_type(impl_type&&) = default;
- template<class... Args>
- explicit
- impl_type(std::false_type, Args&&...);
- template<class RatePolicy_, class... Args>
- explicit
- impl_type(std::true_type,
- RatePolicy_&& policy, Args&&...);
- impl_type& operator=(impl_type&&) = delete;
- beast::executor_type<socket_type>
- ex() noexcept
- {
- return this->socket.get_executor();
- }
- RatePolicy&
- policy() noexcept
- {
- return this->boost::empty_value<RatePolicy>::get();
- }
- RatePolicy const&
- policy() const noexcept
- {
- return this->boost::empty_value<RatePolicy>::get();
- }
- template<class Executor2>
- void on_timer(Executor2 const& ex2);
- void reset();
- void close() noexcept;
- };
-
-
-
-
- boost::shared_ptr<impl_type> impl_;
- template<class Executor2>
- struct timeout_handler;
- struct ops;
- #if ! BOOST_BEAST_DOXYGEN
-
-
- template<class>
- friend class boost::asio::ssl::stream;
-
- using lowest_layer_type = socket_type;
-
- lowest_layer_type&
- lowest_layer() noexcept
- {
- return impl_->socket;
- }
-
- lowest_layer_type const&
- lowest_layer() const noexcept
- {
- return impl_->socket;
- }
- #endif
- public:
-
- ~basic_stream();
-
- #if BOOST_BEAST_DOXYGEN
- template<class... Args>
- explicit
- basic_stream(Args&&... args);
- #else
- template<class Arg0, class... Args,
- class = typename std::enable_if<
- ! std::is_constructible<RatePolicy, Arg0>::value>::type>
- explicit
- basic_stream(Arg0&& argo, Args&&... args);
-
- template<class Executor_>
- explicit
- basic_stream(basic_stream<Protocol, Executor_, RatePolicy> && other);
- template<typename, typename, typename>
- friend class basic_stream;
- #endif
-
- #if BOOST_BEAST_DOXYGEN
- template<class RatePolicy_, class... Args>
- explicit
- basic_stream(RatePolicy_&& policy, Args&&... args);
- #else
- template<class RatePolicy_, class Arg0, class... Args,
- class = typename std::enable_if<
- std::is_constructible<
- RatePolicy, RatePolicy_>::value>::type>
- basic_stream(
- RatePolicy_&& policy, Arg0&& arg, Args&&... args);
- #endif
-
- basic_stream(basic_stream&& other);
-
- basic_stream& operator=(basic_stream&&) = delete;
-
- socket_type&
- socket() noexcept
- {
- return impl_->socket;
- }
-
- socket_type const&
- socket() const noexcept
- {
- return impl_->socket;
- }
-
- socket_type
- release_socket();
-
-
- RatePolicy&
- rate_policy() noexcept
- {
- return impl_->policy();
- }
-
- RatePolicy const&
- rate_policy() const noexcept
- {
- return impl_->policy();
- }
-
- void
- expires_after(
- net::steady_timer::duration expiry_time);
-
- void
- expires_at(net::steady_timer::time_point expiry_time);
-
- void
- expires_never();
-
- void
- cancel();
-
- void
- close();
-
-
- executor_type
- get_executor() noexcept
- {
- return impl_->ex();
- }
-
- void
- connect(endpoint_type const& ep)
- {
- socket().connect(ep);
- }
-
- void
- connect(endpoint_type const& ep, error_code& ec)
- {
- socket().connect(ep, ec);
- }
-
- template<class EndpointSequence
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- #endif
- >
- typename Protocol::endpoint
- connect(EndpointSequence const& endpoints)
- {
- return net::connect(socket(), endpoints);
- }
-
- template<class EndpointSequence
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- #endif
- >
- typename Protocol::endpoint
- connect(
- EndpointSequence const& endpoints,
- error_code& ec
- )
- {
- return net::connect(socket(), endpoints, ec);
- }
-
- template<class Iterator>
- Iterator
- connect(
- Iterator begin, Iterator end)
- {
- return net::connect(socket(), begin, end);
- }
-
- template<class Iterator>
- Iterator
- connect(
- Iterator begin, Iterator end,
- error_code& ec)
- {
- return net::connect(socket(), begin, end, ec);
- }
-
- template<
- class EndpointSequence, class ConnectCondition
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- #endif
- >
- typename Protocol::endpoint
- connect(
- EndpointSequence const& endpoints,
- ConnectCondition connect_condition
- )
- {
- return net::connect(socket(), endpoints, connect_condition);
- }
-
- template<
- class EndpointSequence, class ConnectCondition
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- #endif
- >
- typename Protocol::endpoint
- connect(
- EndpointSequence const& endpoints,
- ConnectCondition connect_condition,
- error_code& ec)
- {
- return net::connect(socket(), endpoints, connect_condition, ec);
- }
-
- template<
- class Iterator, class ConnectCondition>
- Iterator
- connect(
- Iterator begin, Iterator end,
- ConnectCondition connect_condition)
- {
- return net::connect(socket(), begin, end, connect_condition);
- }
-
- template<
- class Iterator, class ConnectCondition>
- Iterator
- connect(
- Iterator begin, Iterator end,
- ConnectCondition connect_condition,
- error_code& ec)
- {
- return net::connect(socket(), begin, end, connect_condition, ec);
- }
-
- template<
- BOOST_BEAST_ASYNC_TPARAM1 ConnectHandler =
- net::default_completion_token_t<executor_type>
- >
- BOOST_BEAST_ASYNC_RESULT1(ConnectHandler)
- async_connect(
- endpoint_type const& ep,
- ConnectHandler&& handler =
- net::default_completion_token_t<
- executor_type>{});
-
- template<
- class EndpointSequence,
- BOOST_ASIO_COMPLETION_TOKEN_FOR(
- void(error_code, typename Protocol::endpoint))
- RangeConnectHandler =
- net::default_completion_token_t<executor_type>
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- ,class = typename std::enable_if<
- !net::is_connect_condition<RangeConnectHandler,
- decltype(std::declval<const EndpointSequence&>().begin())>::value
- >::type
- #endif
- >
- BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(
- RangeConnectHandler,
- void(error_code, typename Protocol::endpoint))
- async_connect(
- EndpointSequence const& endpoints,
- RangeConnectHandler&& handler =
- net::default_completion_token_t<executor_type>{});
-
- template<
- class EndpointSequence,
- class ConnectCondition,
- BOOST_ASIO_COMPLETION_TOKEN_FOR(
- void(error_code, typename Protocol::endpoint))
- RangeConnectHandler =
- net::default_completion_token_t<executor_type>
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_endpoint_sequence<
- EndpointSequence>::value>::type
- ,class = typename std::enable_if<
- net::is_connect_condition<ConnectCondition,
- decltype(std::declval<const EndpointSequence&>().begin())>::value
- >::type
- #endif
- >
- BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(
- RangeConnectHandler,
- void(error_code, typename Protocol::endpoint))
- async_connect(
- EndpointSequence const& endpoints,
- ConnectCondition connect_condition,
- RangeConnectHandler&& handler =
- net::default_completion_token_t<
- executor_type>{});
-
- template<
- class Iterator,
- BOOST_ASIO_COMPLETION_TOKEN_FOR(
- void(error_code, Iterator))
- IteratorConnectHandler =
- net::default_completion_token_t<executor_type>
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- !net::is_connect_condition<IteratorConnectHandler, Iterator>::value
- >::type
- #endif
- >
- BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(
- IteratorConnectHandler,
- void(error_code, Iterator))
- async_connect(
- Iterator begin, Iterator end,
- IteratorConnectHandler&& handler =
- net::default_completion_token_t<executor_type>{});
-
- template<
- class Iterator,
- class ConnectCondition,
- BOOST_ASIO_COMPLETION_TOKEN_FOR(
- void(error_code, Iterator))
- IteratorConnectHandler =
- net::default_completion_token_t<executor_type>
- #if ! BOOST_BEAST_DOXYGEN
- ,class = typename std::enable_if<
- net::is_connect_condition<ConnectCondition, Iterator>::value
- >::type
- #endif
- >
- BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(
- IteratorConnectHandler,
- void(error_code, Iterator))
- async_connect(
- Iterator begin, Iterator end,
- ConnectCondition connect_condition,
- IteratorConnectHandler&& handler =
- net::default_completion_token_t<executor_type>{});
-
-
- template<class MutableBufferSequence>
- std::size_t
- read_some(MutableBufferSequence const& buffers)
- {
- return impl_->socket.read_some(buffers);
- }
-
- template<class MutableBufferSequence>
- std::size_t
- read_some(
- MutableBufferSequence const& buffers,
- error_code& ec)
- {
- return impl_->socket.read_some(buffers, ec);
- }
-
- template<
- class MutableBufferSequence,
- BOOST_BEAST_ASYNC_TPARAM2 ReadHandler =
- net::default_completion_token_t<executor_type>
- >
- BOOST_BEAST_ASYNC_RESULT2(ReadHandler)
- async_read_some(
- MutableBufferSequence const& buffers,
- ReadHandler&& handler =
- net::default_completion_token_t<executor_type>{}
- );
-
- template<class ConstBufferSequence>
- std::size_t
- write_some(ConstBufferSequence const& buffers)
- {
- return impl_->socket.write_some(buffers);
- }
-
- template<class ConstBufferSequence>
- std::size_t
- write_some(
- ConstBufferSequence const& buffers,
- error_code& ec)
- {
- return impl_->socket.write_some(buffers, ec);
- }
-
- template<
- class ConstBufferSequence,
- BOOST_BEAST_ASYNC_TPARAM2 WriteHandler =
- net::default_completion_token_t<Executor>
- >
- BOOST_BEAST_ASYNC_RESULT2(WriteHandler)
- async_write_some(
- ConstBufferSequence const& buffers,
- WriteHandler&& handler =
- net::default_completion_token_t<Executor>{});
- };
- }
- }
- #include <boost/beast/core/impl/basic_stream.hpp>
- #endif
|