рд╣рдо RESTinio рдореЗрдВ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЪреМрдереА рдордВрдЬрд┐рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ?

Restinio рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдЬреЛ C ++ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP рд╕рд░реНрд╡рд░ рд╣реИред рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реНрдпрд╛рдкрдХ рд╣реИ, рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рджреЛрдиреЛрдВ рдореЗрдВред


RESTinio рдореЗрдВ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрддрдиреА рд╕рдХреНрд░рд┐рдпрддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣реЗрдмрд░ рдкрд░ Restinio рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреЛ " рдорд╛рдирд╡ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбреЗрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреАрди-рдХрд╣рд╛рдиреА C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ " рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред


рддреАрди-рдХрд╣рд╛рдиреА рдЯреЗрдореНрдкрд▓реЗрдЯред рдФрд░ рдпрд╣, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рднрд╛рд╖рдг рдХрд╛ рдПрдХ рдЖрдВрдХрдбрд╝рд╛ рдирд╣реАрдВ рдерд╛ред


рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд░реЗрд╕реНрдЯреАрдирд┐рдпреЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 0.5.1 рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА "рд╕рдВрдЦреНрдпрд╛рдУрдВ" рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рддреЛ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ RESTinio рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд╛рд░-рдХрд╣рд╛рдиреА рд╣реИред



рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рд╣рдордиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛, рддреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд░рд╣реЗрдВ, рдХрдЯ рдХреЗ рддрд╣рдд рдХреБрдЫ рд╡рд┐рд╡рд░рдг рд╣реЛрдВрдЧреЗред Inveterate C ++ рдЧреБрд░реБрдУрдВ рдХреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирдпрд╛ рдкрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рдЙрдиреНрдирдд C ++ рдЙрдкрдирд╛рдо рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ / рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рдЧрднрдЧ рдЬрдВрдЧрд▓реА рдореЗрдВред


рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╢реНрд░реЛрддрд╛


рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг 0.5.1 рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдХрд┐ HTTP рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ "рдЧрд┐рд░ рдЧрдпрд╛" рдФрд░ рдЗрд╕рдиреЗ рдЗрд╕ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрдирд╛ рджрд┐рдпрд╛ рдЬреЛ рдЕрднреА рднреА рд▓рд╛рдЗрди рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рд╣рдореЗрдВ рдХрднреА-рдХрднреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдЬрд╛рддрд╛ рдерд╛ рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рд╣рд╛рде рдЗрд╕рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рддрдХ рдкрд╣реБрдВрдЪ рдЧрдПред рд▓реЗрдХрд┐рди рдХрдм рд╕реЗ рдпрджрд┐ рд╕рднреА рдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкреВрдЫрд╛, рддреЛ рдпрд╣ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рджреЗрдВ, рдФрд░ рдмрд╛рдХреА рд╕рднреА рдХреЛ RESTINIO рдореЗрдВ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдФрд░ рдЪреВрдВрдХрд┐ Restinio рдореЗрдВ HTTP рд╕рд░реНрд╡рд░ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ "рд▓рдХреНрд╖рдг" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╕реБрдирдиреЗ рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ?


рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреАрди рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред


рдЪрд░рдг # 1: рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╕реЗ рдЧреИрд░-рд╕реНрдерд┐рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


void state_changed( const restinio::connection_state::notice_t & notice) noexcept; 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 class my_state_listener { std::mutex lock_; ... public: void state_changed(const restinio::connection_state::notice_t & notice) noexcept { std::lock_guard<std::mutex> l{lock_}; .... } ... }; 

рдЪрд░рдг # 2: рд╕рд░реНрд╡рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЕрдВрджрд░, рдЖрдкрдХреЛ рдПрдХ рдЯрд╛рдЗрдкрдбрд┐рдл рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХрдиреЗрдХреНрд╢рди_рд╕реНрдЯреИрдЯ_рд▓рд┐рд╕реНрдЯрдирд░_рдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ connection_state_listener_t , рдЬрд┐рд╕реЗ рдЪрд░рдг # 1 рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


 struct my_traits : public restinio::default_traits_t { using connection_state_listener_t = my_state_listener; }; 

рддрджрдиреБрд╕рд╛рд░, HTTP рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЗрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


 restinio::run(restinio::on_thread_pool<my_traits>(8)...); 

рдЪрд░рдг # 3: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд░реНрд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 restinio::run( restinio::on_thread_pool<my_traits>(8) .port(8080) .address("localhost") .request_handler(...) .connection_state_listener(std::make_shared<my_state_listener>(...)) ) ); 

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ connection_state_listener рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ HTTP рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдЙрддреНрддрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╢реНрд░реЛрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред


рдФрд░ рдЕрдЧрд░ рдЖрдк рдХрдиреЗрдХреНрд╢рди_рд╕реНрдЯреИрдЯ_рд▓рд┐рд╕реНрдЯрд░_t рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ?


рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡рд░ рдЧреБрдгреЛрдВ рдореЗрдВ connection_state_listener_t рдирд╛рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕рд░реНрд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП connection_state_listener рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ connection_state_listener_t рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, connection_state_listener_t рдирд╛рдо рдЕрднреА рднреА рд╕рд░реНрд╡рд░ рдЧреБрдгреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╛рдо рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ restinio::connection_state::noop_listener_t рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ restinio::connection_state::noop_listener_t ред


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рдореНрди рд╣реЛрддрд╛ рд╣реИ: Restinio рдореЗрдВ, рдЬрдм рдирд┐рдпрдорд┐рдд рд▓рдХреНрд╖рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдХрдиреЗрдХреНрд╢рди_state_listener_t рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:


 namespace restinio { struct default_traits_t { using time_manager_t = asio_time_manager_t; using logger_t = null_logger_t; ... using connection_state_listener_t = connection_state::noop_listener_t; }; } /* namespace restinio */ 

рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ restinio::default_traits_t рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ connection_state_listener_t рдХреА рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд╛ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рдореЗрдВ рдирдпрд╛ рдирд╛рдо connection_state_listener_t рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 struct my_traits : public restinio::default_traits_t { using connection_state_listener_t = my_state_listener; ... }; 

рдлрд┐рд░ рдирдпрд╛ рдирд╛рдо рдХрдиреЗрдХреНрд╢рди_рд╕реНрдЯреИрдЯ_рд▓рд┐рд╕реНрдЯрдирд░_ рдЯреА рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдирдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреБрд░рд╛рдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред


рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрд╢рди_рд╕реНрдЯреИрдЯ_рд▓рд┐рд╕реНрдЯрд░_ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ RESTINIO рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди, noop_listener_t рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ Restinio рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


  • RESTINIO рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ connection_state_listener_t рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, connection_state_listener рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдирд┐рд╖рд┐рджреНрдз рд╣реИ (рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓ рд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА);
  • Restinio рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдмрд╕ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред


рдпрд╣ RESTINIO рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?


рддреЛ, RESTINIO рдХреЛрдб рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ connection_state_listener_t рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░:


  • рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ connecton_state_listener_t рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ;
  • HTTP рд╕рд░реНрд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП connection_state_listener рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдпрд╛ рд░реЛрдХреЗрдВ;
  • HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ connection_state_listener_t type_state_listener_t рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП;
  • рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ state_changed рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ рдпрд╛ рди рдХрд░реЗрдВред

рдпрд╣ рд╕реАрдорд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Restinio рдЕрднреА рднреА C ++ 14 рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ C ++ 17 рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдк рд╡рд╣реА)ред


рдпрд╣ рд╕рдм рд╕рд╛рдзрд╛рд░рдг рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: restinio::connection_state::noop_listener_t рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ restinio::connection_state::noop_listener_t рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ restinio::connection_state::noop_listener_t ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ type рдХрдиреЗрдХреНрд╢рди_state_listener_t рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рднрд╛рдЧ рдПрдХ:


 template< typename Listener > struct connection_state_listener_holder_t { ... //  compile-time . std::shared_ptr< Listener > m_connection_state_listener; static constexpr bool has_actual_connection_state_listener = true; void check_valid_connection_state_listener_pointer() const { if( !m_connection_state_listener ) throw exception_t{ "connection state listener is not specified" }; } }; template<> struct connection_state_listener_holder_t< connection_state::noop_listener_t > { static constexpr bool has_actual_connection_state_listener = false; void check_valid_connection_state_listener_pointer() const { // Nothing to do. } }; 

рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмрд╕ noop_listener_t рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИред


рдФрд░ рднрд╛рдЧ рджреЛ:


 template<typename Derived, typename Traits> class basic_server_settings_t : public socket_type_dependent_settings_t< Derived, typename Traits::stream_socket_t > , protected connection_state_listener_holder_t< typename Traits::connection_state_listener_t > , protected ip_blocker_holder_t< typename Traits::ip_blocker_t > { ... }; 

HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЛ рдХрдиреЗрдХреНрд╢рди_state_listener_holder_t рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рддреЛ type_state_listener_t рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ, рдпрд╛ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рднрдВрдбрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдпрд╛ рди рдХрд░рдирд╛ рдлреВрд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмреЗрд░реАрдЬрд╝ рддрдм рдЧрдП рдЬрдм noop_listener_t рдореЗрдВ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдпрджрд┐ рдХреЗрд╡рд▓ noop_listener_t , noop_listener_t рд╕реЗ noop_listener_t ред


рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ "рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рджреЗрдЦрдирд╛" рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП std::enable_if рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рддрдирд╛ рджреА рдЧрдИ рдереАред рдЗрд╕рд▓рд┐рдП, рдпрд╣ static_asser рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдерд╛:


 Derived & connection_state_listener( std::shared_ptr< typename Traits::connection_state_listener_t > listener ) & { static_assert( has_actual_connection_state_listener, "connection_state_listener(listener) can't be used " "for the default connection_state::noop_listener_t" ); this->m_connection_state_listener = std::move(listener); return reference_to_derived(); } Derived && connection_state_listener( std::shared_ptr< typename Traits::connection_state_listener_t > listener ) && { return std::move(this->connection_state_listener(std::move(listener))); } const std::shared_ptr< typename Traits::connection_state_listener_t > & connection_state_listener() const noexcept { static_assert( has_actual_connection_state_listener, "connection_state_listener() can't be used " "for the default connection_state::noop_listener_t" ); return this->m_connection_state_listener; } void ensure_valid_connection_state_listener() { this->check_valid_connection_state_listener_pointer(); } 

рдПрдХ рдФрд░ рдХреНрд╖рдг рдерд╛ рдЬрдм рдореБрдЭреЗ рдкрдЫрддрд╛рд╡рд╛ рд╣реБрдЖ рдХрд┐ рд╕реА ++ рдореЗрдВ рдЕрдЧрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдбреАред рдФрд░ C ++ 14 рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ :(


рдпрд╣рд╛рдВ рдЖрдк ensure_valid_connection_state_listener рдкрджреНрдзрддрд┐ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рдиреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ http_server_t рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:


 template<typename D> http_server_t( io_context_holder_t io_context, basic_server_settings_t< D, Traits > && settings ) : m_io_context{ io_context.giveaway_context() } , m_cleanup_functor{ settings.giveaway_cleanup_func() } { // Since v.0.5.1 the presence of custom connection state // listener should be checked before the start of HTTP server. settings.ensure_valid_connection_state_listener(); ... 

рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, ensure_valid_connection_state_listener рд▓рд┐рдП check_valid_connection_state_listener_pointer , рдЬрд┐рд╕реЗ ensure_valid_connection_state_listener рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИ, рдпрд╛ рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреЗрдХ рдирд╣реАрдВ рд╣реИред


рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ state_changed рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдФрд░ state_listener_holder_t рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 namespace connection_settings_details { template< typename Listener > struct state_listener_holder_t { std::shared_ptr< Listener > m_connection_state_listener; template< typename Settings > state_listener_holder_t( const Settings & settings ) : m_connection_state_listener{ settings.connection_state_listener() } {} template< typename Lambda > void call_state_listener( Lambda && lambda ) const noexcept { m_connection_state_listener->state_changed( lambda() ); } }; template<> struct state_listener_holder_t< connection_state::noop_listener_t > { template< typename Settings > state_listener_holder_t( const Settings & ) { /* nothing to do */ } template< typename Lambda > void call_state_listener( Lambda && /*lambda*/ ) const noexcept { /* nothing to do */ } }; } /* namespace connection_settings_details */ 

рдХрдиреЗрдХреНрд╢рди_рд╕реНрдЯреИрдЯ_рд▓рд┐рд╕реНрдЯрд░_рд╣реЛрд▓реНрдбрд░_рдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╛рдиреА, рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ basic_server_settings_t ), рдпрд╣ state_listener_holder_t рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд╣реАрдВред рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА:


 template < typename Traits > struct connection_settings_t final : public std::enable_shared_from_this< connection_settings_t< Traits > > , public connection_settings_details::state_listener_holder_t< typename Traits::connection_state_listener_t > { using connection_state_listener_holder_t = connection_settings_details::state_listener_holder_t< typename Traits::connection_state_listener_t >; ... 

рдпрд╣рд╛рдВ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, state_listener_holder_t рдкреНрд░рд╛рд░рдВрдн state_listener_holder_t ред рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ рднреА рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ state_listener_holder_t рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, state_listener_holder_t рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╕ state_listener_holder_t рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ "рдЦреАрдВрдЪрддрд╛ рд╣реИ", рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:


 template < typename Settings > connection_settings_t( Settings && settings, http_parser_settings parser_settings, timer_manager_handle_t timer_manager ) : connection_state_listener_holder_t{ settings } , m_request_handler{ settings.request_handler() } 

рдФрд░ state_listener_holder_t рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ state_listener_holder_t рдпрд╛ рддреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдмрд╛рдж рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕рдордЭрджрд╛рд░ рдХрдВрдкрд╛рдЗрд▓рд░ state_listener_holder_t рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред


рджреВрд╕рд░реЗ, рдпрд╣ state_listner_holder_t::call_state_listener , рдЬреЛ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдХреЛ рд░рд╛рдЬреНрдп- state_changed рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдирд╣реАрдВ, рдЕрдЧрд░ рдХреЛрдИ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ call_state_listener рд╕реНрдерд╛рдиреЛрдВ рдкрд░ call_state_listener рд╣реИ рдЬрд╣рд╛рдВ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдирд┐рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 void close() { m_logger.trace( [&]{ return fmt::format( "[connection:{}] close", connection_id() ); } ); ... // Inform state listener if it used. m_settings->call_state_listener( [this]() noexcept { return connection_state::notice_t{ this->connection_id(), this->m_remote_endpoint, connection_state::cause_t::closed }; } ); } 

рдПрдХ call_state_listener рдХреЛ call_state_listener рдкрд╛рд╕ рдХрд┐рдпрд╛ call_state_listener , рдЬрд╣рд╛рдБ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ notice_t рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реНрд░реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ state_changed рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдореВрд▓реНрдп state_changed рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдХреЛрдИ рд╢реНрд░реЛрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ call_state_listener рдЦрд╛рд▓реА рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдХреЛрдИ call_state_listener рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рднреА рдХреЙрд▓ рдХреЛ рдПрдХ рдЦрд╛рд▓реА call_state_listener ред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рд╢реНрд░реЛрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛ рд░рд╣реА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдИрдкреА рдЕрд╡рд░реЛрдзрдХ


Restinio-0.5.1 рдореЗрдВ, рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╢реНрд░реЛрддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, IP- рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЪреАрдЬ рдЬреЛрдбрд╝реА рдЧрдИ рдереАред рдпрд╛рдиреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ RESTinio рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП "рдЦреАрдВрдЪ" рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдИрдкреА-рдЕрд╡рд░реЛрдзрдХ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ Restinio рдирдП рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░рдЦрд░рдЦрд╛рд╡ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЕрдиреБрд░реЛрдз рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз-рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐)ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдИрдкреА-рдЕрд╡рд░реЛрдзрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ Restinio рдореВрд░реНрдЦрддрд╛ рд╕реЗ рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рдХреА рддрд░рд╣, рдЖрдИрдкреА-рдмреНрд▓реЙрдХрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред IP рдЕрд╡рд░реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╢реНрд░реЛрддрд╛ рдХреА рддрд░рд╣ред рдФрд░ Restinio рдореЗрдВ IP рдЕрд╡рд░реЛрдзрдХ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдиреНрд╣реАрдВ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ Restinio рдХреЗ рдЕрдВрджрд░ IP-blocker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдИрдкреА рдЕрд╡рд░реЛрдзрдХ рдФрд░ рд░рд╛рдЬреНрдп рд╢реНрд░реЛрддрд╛ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рд╣реИрдВред


рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг ip_blocker рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рд╕рдВрд╕реНрдХрд░рдг 0.5.1 рдореЗрдВ, рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдорд╛рдирдХ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ: ip_blocker ред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХрд▓ рдЖрдИрдкреА рдкрддреЗ рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрд╕рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдПрдХ рдЖрдИрдкреА-рдЕрд╡рд░реЛрдзрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдпрд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЛрддрд╛ рднреАред рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдгреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдЙрд╕реА рд╕рдордп, рдЖрдИрдкреА рдЕрд╡рд░реЛрдзрдХ рдФрд░ рд╢реНрд░реЛрддрд╛ рджреЛрдиреЛрдВ рдХреЛ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдЖрдИрдкреА рдЕрд╡рд░реЛрдзрдХ рдФрд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ рд╣реИред


рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 class blocker_t { std::mutex m_lock; using connections_t = std::map< restinio::asio_ns::ip::address, std::vector< restinio::connection_id_t > >; connections_t m_connections; public: //   IP-blocker-. restinio::ip_blocker::inspection_result_t inspect( const restinio::ip_blocker::incoming_info_t & info ) noexcept {...} //     . void state_changed( const restinio::connection_state::notice_t & notice ) noexcept {...} }; 

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдУрд╡рд░рд░рд╛рдЗрдб рд╕реЗ рдХреЛрдИ рд╡рд┐рд░рд╛рд╕рдд рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИред рд╢реНрд░реЛрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдВрддреБрд╖реНрдЯ рд╣реИред


рдЗрд╕реА рддрд░рд╣, рдПрдХ рдЖрдИрдкреА рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде: рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ inspect рд╡рд┐рдзрд┐ рд╣реИ? рд╡рд╣рд╛рдБ рд╣реИ! рддреЛ рд╕рдм рдареАрдХ рд╣реИред


рддрдм рдпрд╣ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЧреБрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ:


 struct my_traits_t : public restinio::default_traits_t { using logger_t = restinio::shared_ostream_logger_t; //      . using connection_state_listener_t = blocker_t; using ip_blocker_t = blocker_t; }; 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ blocker_t рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ HTTP рд╕рд░реНрд╡рд░ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:


 auto blocker = std::make_shared<blocker_t>(); restinio::run( ioctx, restinio::on_thread_pool<my_traits_t>( std::thread::hardware_concurrency() ) .port( 8080 ) .address( "localhost" ) .connection_state_listener( blocker ) .ip_blocker( blocker ) .max_pipelined_requests( 4 ) .handle_request_timeout( std::chrono::seconds{20} ) .request_handler( [&ioctx](auto req) { return handler( ioctx, std::move(req) ); } ) ); 

рдирд┐рд╖реНрдХрд░реНрд╖


C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рдмрдВрджреВрдХреЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдЗрддрдиреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдзреБрдирд┐рдХ рд╕реА ++ рд╕рдореБрджрд╛рдп рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рдХрдИ рдпреБрджреНрдзрд░рдд рд╢рд┐рд╡рд┐рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рджреВрд░ рд░рд╣рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬрдЯрд┐рд▓ рд╣реИрдВ, рд╡реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЕрдкрдардиреАрдп рдЪрд╛рджрд░реЛрдВ рдХреА рдЕрдкрдардиреАрдп рд▓рдВрдмрд╛рдИ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рдХрд░рддреЗ рд╣реИрдВред рдмреНрд▓реЛрдЯрд┐рдВрдЧ рдХреЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд╣рд░реА рдХрд┐рдВрд╡рджрдВрддрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ред


рджреВрд╕рд░реЗ рд╢рд┐рд╡рд┐рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ (рдореЗрд░реЗ рдЬреИрд╕реЗ) рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реА ++ рдХреЗ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ C ++ рдХреЗ рдХреБрдЫ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕реА ++ рдХрд╛ рднрд╡рд┐рд╖реНрдп рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИред рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ (рдЬреИрд╕реЗ рд▓рдВрдмрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╕рдВрдХрд▓рди рдпрд╛ рдЕрдирдЗрдирдлреЙрд░реНрдореЗрдЯрд┐рд╡ рдПрд░рд░ рдореИрд╕реЗрдЬ) рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд░реНрддрдорд╛рди рдЕрд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Restinio рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди рдЪреБрдиреЗ рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЕрд░реНрдерд╛рддреН рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛, рдЕрднреА рднреА рднреБрдЧрддрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдХреВрд▓рди рдорд┐рд▓рддрд╛ рд╣реИред рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ, рд╣рдо рдЙрд╕ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреВрд╕рд░реА рдУрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрднреА рднреА рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд▓рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рдЖрдк рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВрдЧреЗ рдФрд░ рдЦреБрд▓рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╡рдХреВрдл рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдЫрд┐рдкрд╛рдПрдВ рдпрд╛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред


рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВред рдпрд╣ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдРрд╕реА рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдП рдХрд┐ рдореЗрд░реЗ рдЬреИрд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднреА рд╣рд░ 10-15 рдорд┐рдирдЯ рдореЗрдВ cppreference рдФрд░ stackoverflow рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред


RESTINIO рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ RESTINIO рдХреА рднрд╛рд╡реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдФрд░ рдХреЗрд╡рд▓ Restinio рд╣реА рдирд╣реАрдВ


рдлрд┐рд▓рд╣рд╛рд▓, рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ "рдЬрдм рд╕рдордп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╣реЛрддрд╛ рд╣реИ" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2018 рдХреЗ рдкрддрди рдФрд░ 2019 рдХреА рд╕рд░реНрджрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Restinio рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджрд┐рдП, рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХрд┐рдП, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдереЗред


рд▓реЗрдХрд┐рди 2019 рдХреЗ рдЙрддреНрддрд░рд╛рд░реНрдз рдореЗрдВ, Restinio рдХреЗ рд▓рд┐рдП рд╕рдордп рдерд╛, рдФрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ Restinio 0.5.0 , рдФрд░ рдлрд┐рд░ 0.5.1 рдмрдирд╛рдпрд╛ ред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реА рдФрд░ рджреВрд╕рд░реЛрдВ рдХреА рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рдереАред рдпрд╛рдиреА рд╣рдо рдЦреБрдж RESTINIO рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рд╣рдореЗрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛, рдпрд╣ RESTinio рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИред


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛?


рдФрд░ рдпрд╣рд╛рдБ рдЙрддреНрддрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХреЗрд╡рд▓ рд╡рд╣реА рдЬреЛ рд╣рдореЗрдВ Restinio рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк Restinio рдореЗрдВ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рдХреЛрдИ рдЪреАрдЬрд╝ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдордп рдирд┐рдХрд╛рд▓рдХрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GitHub рдпрд╛ BitBucket рдкрд░ рдореБрджреНрджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рддреЛ Google рд╕рдореВрд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рд╕реАрдзреЗ рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ) ред рдЖрдк рдХреБрдЫ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗ - рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛;)


рджрд░рдЕрд╕рд▓, рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣рдорд╛рд░реЗ рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрд╕рдУрдмреАрдЬреЗрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рдеред рдЙрдирдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЦреИрд░, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрднреА рддрдХ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ: рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ рдореБрдлреНрдд рдореЗрдВ рдЪреЛрдЯ рдирд╣реАрдВ рд▓рдЧреАред рдЕрдЪрд╛рдирдХ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдпрд╣ рд╣рдореЗрдВ Restinio рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi456632/


All Articles