
рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ,
рд╣рдордиреЗ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЪрд┐рдВрд░рд╛рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА , рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ
Restinio рдФрд░
SObjectizer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЭреАрдВрдЧрд╛ рдПрдХ рдЫреЛрдЯрд╛ C ++ 17 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЬреЛ Restinio рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЗрдореЗрдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП HTTP рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ SObjectizer рдФрд░ ImageMagick ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрд▓реАред рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдФрд░ рд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЗ рдЧреБрд▓реНрд▓рдХ рдиреЗ рдХрд╛рдлреА рдмрджрд▓реА рд╣реИред рдХреБрдЫ рдРрд╕рд╛ рднреА рдЬрд┐рд╕реЗ
рд╣рд╛рд▓ рд╣реА рдХреЗ Restinio-0.4.7 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдиреНрдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЭреАрдВрдЧрд╛ рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдпрд╛ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдЗрд╕ рджреМрд░рд╛рди рд╣рдордиреЗ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ: рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдордиреЗ рд╕рдорд╛рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛, рдХреИрд╕реЗ рд╣рдордиреЗ рдЙрддреНрдХреГрд╖реНрдЯ рд╕реНрдкреИрдбрд▓реЙрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЭреАрдВрдЧрд╛ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛, рдФрд░ рдмрджрд▓ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдХреИрд╢ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рднреА рдмрдирд╛рдпрд╛ред
v0.3: рд╕рдорд╛рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЭреАрдВрдЧрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рд╕рд░рд▓реАрдХрд░рдг рд╢рд╛рдорд┐рд▓ рдерд╛: рдЗрд╕ рдмрд╛рдд рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рдерд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕реА рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдЭреАрдВрдЧрд╛ рдХреЛ "/demo.jpg?op=resize&max=1024" рдлрд╝реЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИред рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЫрд╡рд┐ рдХреИрд╢ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЫрд╡рд┐ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕реМ рдорд┐рд▓реАрд╕реЗрдХрдВрдбред
рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЭреАрдВрдЧрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз "/demo.jpg?op=resize&max=1024" рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдЧреНрд░рд╛рд╣рдХ рд╕реЗред рдХреИрд╢ рдореЗрдВ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░рд┐рдгрд╛рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рднреА рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рди рддреЛ рдкрд╣рд▓рд╛ рдФрд░ рди рд╣реА рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЭреАрдВрдЧрд╛ рдлрд┐рд░ рд╕реЗ рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ "/demo.jpg?op=resize&max=1024"ред рдФрд░ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдкрд░ рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рди рдЪрд┐рддреНрд░ рдХреЛ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдЪрд┐рдВрд░рд╛рдЯ рдкрд░ рддрдп рдХреА рдереА, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧрдВрднреАрд░ рдЬрд╛рдо рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереАред рд╣рдордиреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо_рдордирдЬрд░ рдПрдЬреЗрдВрдЯ рдореЗрдВ рджреЛ рдореБрд╢реНрдХрд┐рд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рдХрд┐рдпрд╛ред рдкрд╣рд▓рд╛ рдХрдВрдЯреЗрдирд░ рдореБрдлреНрдд рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдПрдХ рдХрддрд╛рд░ рд╣реИред рдпрд╣ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо m_pending_requests рд╣реИред рджреВрд╕рд░реЗ рдХрдВрдЯреЗрдирд░ рд╕реНрдЯреЛрд░ рдЕрдиреБрд░реЛрдз рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ (рдпрд╛рдиреА рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рдереЗ)ред рдпрд╣ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо m_inprogress_requests рд╣реИред
рдЬрдм рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдо_рдордирдЧрд░ рдХреЛ рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреА рдХреИрд╢ рдореЗрдВ рддреИрдпрд╛рд░ рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЪрд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ m_inprogress_requests рдФрд░ m_pending_requests рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдЗрди рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреЛ m_pending_requests рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛
рд╣реИ :
void a_transform_manager_t::handle_not_transformed_image( transform::resize_request_key_t request_key, sobj_shptr_t<resize_request_t> cmd ) { const auto store_to = [&](auto & queue) { queue.insert( std::move(request_key), std::move(cmd) ); }; if( m_inprogress_requests.has_key( request_key ) ) {
рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ m_inprogress_requests рдФрд░ m_pending_requests рдореБрд╢реНрдХрд┐рд▓ рдХрдВрдЯреЗрдирд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЪрд╛рд▓ рдХреНрдпрд╛ рд╣реИ?
рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рдХрдВрдЯреЗрдирд░ рдПрдХ рдирд┐рдпрдорд┐рдд FIFO рдХрддрд╛рд░ (рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ) рдФрд░ рдорд▓реНрдЯреАрдореИрдк, рдпрд╛рдиреА рджреЛрдиреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХрдВрдЯреЗрдирд░ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рдХреБрдВрдЬреА рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ m_pending_requests рдореЗрдВ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪрдиреЗ рдФрд░ m_pending_requests рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡реЛрдВ рддрдХ рдкреНрд░рднрд╛рд╡реА рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рддрд╛рдХрд┐ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЭреАрдВрдЧрд╛ рдореЗрдВ, рд╣рдордиреЗ
рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдХрд┐рд▓ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЭреАрдВрдЧрд╛ рдореЗрдВ рдмреВрд╕реНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ Boost.MultiIndex рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░, рд╢рд╛рдпрдж, рд╕рдордп рдХреЗ рд╕рд╛рде, m_pending_requests рдореЗрдВ рдПрдХ рдкреНрд░рднрд╛рд╡реА рдЦреЛрдЬ рдХреЛ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдлрд┐рд░ рдЪрд┐рдВрд░рд╛рдЯ рдореЗрдВ Boost.MultiIndex рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
v0.4: spdlog рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рдВрдЧ
рд╣рдордиреЗ рд╢реНрд░рд┐рдВрдк рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдХрд┐рд╕ рд╡рдЬрд╣ рд╕реЗ, рдЪрд┐рдВрд░рд╛рдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЖрдо рддреМрд░ рдкрд░ред
рдПрдХ рдУрд░, рдЗрд╕рдиреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЪрд┐рдВрд░рд╛рдЯ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╣реИред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рд▓реЙрдЧрд┐рдВрдЧ рдХреА рдХрдореА рдЪрд┐рдВрд░рд╛рдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рджреЛрдиреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ рд╣рд╛рде
рдбрд╛рд▓рддреЗ рд╣реИрдВ , рд╣рдо рддреБрд░рдВрдд рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЖрдзреБрдирд┐рдХ рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЭреАрдВрдЧрд╛ рдореЗрдВ рдЦреАрдВрдЪ
рд▓реЗрддреЗ рд╣реИрдВ -
рд╕реНрдкреИрдВрдЧрд▓ ред рд╕рд╛рдБрд╕ рд▓реЗрдирд╛ рддреБрд░рдВрдд рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХрд╛ рдХреЛрдб рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрдврд╝ рдЧрдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде handle_not_transformed_image () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреБрдЫ
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддрд╛ рд╣реИ:
void a_transform_manager_t::handle_not_transformed_image( transform::resize_request_key_t request_key, sobj_shptr_t<resize_request_t> cmd ) { const auto store_to = [&](auto & queue) { queue.insert( std::move(request_key), std::move(cmd) ); }; if( m_inprogress_requests.has_key( request_key ) ) {
Spdlog рд▓реЙрдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдЪрд┐рдВрд░рд╛рдЯ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХрдВрд╕реЛрд▓ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ)ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╢реНрд░рд┐рдВрдк рдореЗрдВ рдХреЗрд╡рд▓ spd-logger рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдиреА рдХреЛрдИ
stdout_color_mt (рдпрд╛
stdout_logger_mt ) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд▓реЙрдЧрд░ рдХреЛ Shrimp рдореЗрдВ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЧрдП: рд╣рдордиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдмрдирд╛рдпрд╛ рд╕рд┐рдВрдХ (рдпрд╛рдиреА рд╡рд╣ рдЪреИрдирд▓ рдЬрд╣рд╛рдВ spdlog рдЙрддреНрдкрдиреНрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛), рдФрд░ рдЭреАрдВрдЧрд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд╕рд┐рдВрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрд▓рдЧ рд▓реЙрдЧрд░ рдмрдирд╛рдПред
рд╕реНрдкреЙрдбрд▓ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реИ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЯреНрд░реЗрд╕ рдФрд░ рдбрд┐рдмрдЧ рдЧрдВрднреАрд░ рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рдордп рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореЗрдХ_рд▓реЙрдЧрд░ рдореЗрдВ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯреНрд░реЗрд╕ / рдбреАрдмрдЧ рд╕рд╣рд┐рдд рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЭреАрдВрдЧрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХрд╛ рдЕрдкрдирд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЙрдЧ рдореЗрдВ рдХреМрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

Spblog рдХреЗ рд╕рд╛рде Trabing SObjectizer
рд▓реЙрдЧрд┐рдВрдЧ рдмрд╛рд░, рдЬреЛ рдХрд┐ SObjectizer рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдПрдЬреЗрдВрдЯ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдЬреЗрдВрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, SObjectizer рдореЗрдВ рдирд┐рд░реНрдорд┐рдд msg_tracing рддрдВрддреНрд░ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд╣рдордиреЗ
рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдд рдХреА рдереА)ред рд▓реЗрдХрд┐рди SObjectizer рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ msg_tracing рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ, spdlog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡рдпрдВ рдЭреАрдВрдЧрд╛ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ:
class spdlog_sobj_tracer_t : public so_5::msg_tracing::tracer_t { std::shared_ptr<spdlog::logger> m_logger; public: spdlog_sobj_tracer_t( std::shared_ptr<spdlog::logger> logger ) : m_logger{ std::move(logger) } {} virtual void trace( const std::string & what ) noexcept override { m_logger->trace( what ); } [[nodiscard]] static so_5::msg_tracing::tracer_unique_ptr_t make( spdlog::sink_ptr sink ) { return std::make_unique<spdlog_sobj_tracer_t>( make_logger( "sobjectizer", std::move(sink) ) ); } };
рдпрд╣рд╛рдБ рд╣рдо рд╡рд┐рд╢реЗрд╖ SObjectizer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ tracer_t рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд рд╡рд░реНрдЪреБрдЕрд▓ рдЯреНрд░реЗрд╕ () рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ Spdlog рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SObjectizer рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд░реЗрдЦрдг рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди SObjectizer рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЯреНрд░реИрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
so_5::wrapped_env_t sobj{ [&]( so_5::environment_t & env ) {...}, [&]( so_5::environment_params_t & params ) { if( sobj_tracing_t::on == sobj_tracing ) params.message_delivery_tracer( spdlog_sobj_tracer_t::make( logger_sink ) ); } };
рд░рд┐рд╕реНрдЯрд┐рдирд┐рдпреЛ рдЯреНрд░реЗрд╕рд▓реЙрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
SObjectizer рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Restinio рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдХрдИ рдмрд╛рд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЭреАрдВрдЧрд╛ рдХреЗ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЯреНрд░реЗрд╕ рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдЯреНрд░реЗрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ Restinio рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
class http_server_logger_t { public: http_server_logger_t( std::shared_ptr<spdlog::logger> logger ) : m_logger{ std::move( logger ) } {} template< typename Builder > void trace( Builder && msg_builder ) { log_if_enabled( spdlog::level::trace, std::forward<Builder>(msg_builder) ); } template< typename Builder > void info( Builder && msg_builder ) { log_if_enabled( spdlog::level::info, std::forward<Builder>(msg_builder) ); } template< typename Builder > void warn( Builder && msg_builder ) { log_if_enabled( spdlog::level::warn, std::forward<Builder>(msg_builder) ); } template< typename Builder > void error( Builder && msg_builder ) { log_if_enabled( spdlog::level::err, std::forward<Builder>(msg_builder) ); } private: template< typename Builder > void log_if_enabled( spdlog::level::level_enum lv, Builder && msg_builder ) { if( m_logger->should_log(lv) ) { m_logger->log( lv, msg_builder() ); } } std::shared_ptr<spdlog::logger> m_logger; };
рдпрд╣ рд╡рд░реНрдЧ рдХреБрдЫ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реЗрд╕реНрдЯреАрдирд┐рдпреЛ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рддрдВрддреНрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рди рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ред рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ
рд▓реЙрдЧрдЬреАрдЖрдИ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЬрдм рд╣рдордиреЗ
Restinio рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рддреЛ рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ
рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ )ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ HTTP рд╕рд░реНрд╡рд░ http_server_logger_t рд╡рд░реНрдЧ рдХреЛ рдЕрдкрдиреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдКрдкрд░ рджрд┐рдЦрд╛рдПрдЧреАред рдпрд╣ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
struct http_server_traits_t : public restinio::default_traits_t { using logger_t = http_server_logger_t; using request_handler_t = http_req_router_t; };
рдареАрдХ рд╣реИ, рдлрд┐рд░ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ - spd-logger рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЛ рдмрдирд╛рдП рдЧрдП HTTP рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреЗрдВ:
auto restinio_logger = make_logger( "restinio", logger_sink, restinio_tracing_t::off == restinio_tracing ? spdlog::level::off : log_level ); restinio::run( asio_io_ctx, shrimp::make_http_server_settings( thread_count.m_io_threads, params, std::move(restinio_logger), manager_mbox_promise.get_future().get() ) );
v0.5: рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫрд╡рд┐ рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд░реАрд╕реЗрдЯ
рдЪрд┐рдВрд░рд╛рдЯ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪреАрдЬ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА рдЬреЛ рдереЛрдбрд╝реА рдкрд░реЗрд╢рд╛рди рдереА: рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЫрд╡рд┐ рдХреИрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлреНрд▓рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдЭреАрдВрдЧрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдкреНрд░рд┐рдпред
рдпрджрд┐ рдпрд╣ рдЕрдкреНрд░рд┐рдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдХрдореА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Shrimp рдореЗрдВ рдПрдХ рдФрд░ URL рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЖрдк HTTP DELETE рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: "/ рдХреИрд╢"ред рддрджрдиреБрд╕рд╛рд░, рд╣рдо рдЗрд╕ URL рдкрд░ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдВрдЧреЗ:
std::unique_ptr< http_req_router_t > make_router( const app_params_t & params, so_5::mbox_t req_handler_mbox ) { auto router = std::make_unique< http_req_router_t >(); add_transform_op_handler( params, *router, req_handler_mbox ); add_delete_cache_handler( *router, req_handler_mbox ); return router; }
рдЬрд╣рд╛рдБ add_delete_cache_handler () рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
void add_delete_cache_handler( http_req_router_t & router, so_5::mbox_t req_handler_mbox ) { router.http_delete( "/cache", [req_handler_mbox]( auto req, auto ) { const auto qp = restinio::parse_query( req->header().query() ); auto token = qp.get_param( "token"sv ); if( !token ) { return do_403_response( req, "No token provided\r\n" ); }
рдереЛрдбрд╝реА рд╕реА рдХреНрд░рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдХреНрд╡реЗрд░реА рдХреЗ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рди рд╡рд╛рд▓рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдХреЗрд╡рд▓ рдХреИрд╢реЗ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЯреЛрдХрди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЯреЛрдХрди рдореВрд▓реНрдп рдЙрд╕ рд╕рдордп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдЭреАрдВрдЧрд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдХреЛрдИ рдЯреЛрдХрди рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЯреЛрдХрди рд╣реИ, рддреЛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо_рдордирдЧрд░ рдПрдЬреЗрдВрдЯ, рдЬреЛ рдХреИрд╢ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдорд╛рдВрдб рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо_рдордирдЧрд░ рдПрдЬреЗрдВрдЯ рд╕реНрд╡рдпрдВ HTTP рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛ред
рджреВрд╕рд░реЗ, рд╣рдо рдирдП рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ delete_cache_request_t рдХреЛ transform_manager_t рдПрдЬреЗрдВрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
void a_transform_manager_t::on_delete_cache_request( mutable_mhood_t<delete_cache_request_t> cmd ) { m_logger->warn( "delete cache request received; " "connection_id={}, token={}", cmd->m_http_req->connection_id(), cmd->m_token ); const auto delay_response = [&]( std::string response_text ) { so_5::send_delayed< so_5::mutable_msg<negative_delete_cache_response_t> >( *this, std::chrono::seconds{7}, std::move(cmd->m_http_req), std::move(response_text) ); }; if( const char * env_token = std::getenv( "SHRIMP_ADMIN_TOKEN" );
рдпрд╣рд╛рдВ рджреЛ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
On_delete_cache_request () рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рд╕реНрд╡рдпрдВ рдЯреЛрдХрди рдореВрд▓реНрдп рдХрд╛ рд╕рддреНрдпрд╛рдкрди рд╣реИред рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЯреЛрдХрди SHRIMP_ADMIN_TOKEN рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЪрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорд╛рди HTTP DELETE рдЕрдиреБрд░реЛрдз рдХреЗ рдЯреЛрдХрди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдФрд░ on_delete_cache_request () рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ HTTP DELETE рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╡рд┐рд▓рдВрдм рд╣реИред рдпрджрд┐ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЯреЛрдХрди рдХрд╛ рдЧрд▓рдд рдореВрд▓реНрдп рдЖ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ HTTP DELETE рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдХреНрд░реВрд░ рдмрд▓ рджреНрд╡рд╛рд░рд╛ рдЯреЛрдХрди рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рди рд╣реЛред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрд░реА рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЖрдЦрд┐рд░рдХрд╛рд░, std :: thread :: sleep_for () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ SObjectizer рдХреЗ рд▓рдВрдмрд┐рдд рд╕рдВрджреЗрд╢ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред рддреБрд░рдВрдд on_delete_cache_request () рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, transform_manager рдПрдЬреЗрдВрдЯ рдХреЗрд╡рд▓ рдЦреБрдж рдХреЛ рд▓рдВрдмрд┐рдд negative_delete_cache_response_t рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред SObjectizer рдЯрд╛рдЗрдорд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рджреЗрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдЬреЗрдВрдЯ рдХреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рджреЗрдЧрд╛ред рдФрд░ рдЕрдм negative_delete_cache_response_t рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА HTTP DELETE рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
void a_transform_manager_t::on_negative_delete_cache_response( mutable_mhood_t<negative_delete_cache_response_t> cmd ) { m_logger->debug( "send negative response to delete cache request; " "connection_id={}", cmd->m_http_req->connection_id() ); do_403_response( std::move(cmd->m_http_req), std::move(cmd->m_response_text) ); }
рдпрд╛рдиреА рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
- HTTP рд╕рд░реНрд╡рд░ HTTP DELETE рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ delete_cache_request_t рд╕рдВрджреЗрд╢ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ_manager рдПрдЬреЗрдВрдЯ;
- transform_manager рдПрдЬреЗрдВрдЯ, delete_cache_request_t рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╛ рддреЛ рддреБрд░рдВрдд рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЦреБрдж рдХреЛ рдПрдХ рд▓рдВрдмрд┐рдд negative_delete_cache_response_t рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ;
- transform_manager рдХреЛ рдПрдХ negative_delete_cache_response_t рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рддреБрд░рдВрдд HTTP DELETE рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЕрдВрдд
рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ: "рдЖрдЧреЗ рдХреНрдпрд╛?"
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрднрд╡рддрдГ рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рджреВрд╕рд░рд╛ рдЕрдкрдбреЗрдЯ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХ рдЫрд╡рд┐ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд╣рддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдкрд░, рдЫрд╡рд┐ jpg рдореЗрдВ рд╣реИ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡реЗрдмрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЭреАрдВрдЧрд╛ рдХреЗ рдХрд╛рдо рдкрд░ рд╡рд░реНрддрдорд╛рди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ "рдкреГрд╖реНрда" рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд┐рд░реНрдл рдЙрддреНрд╕реБрдХ рд╣реИред рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреГрд╖реНрда рдХреЛ рдЪрд┐рдВрд░рд╛рдЯ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкрд╛рд╕ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдореИрдВ рдЭреАрдВрдЧрд╛ рдореЗрдВ рдпрд╛ рд╢реНрд░рд┐рдореНрдк рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ рдЭреАрдВрдЧрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдкрд╣рд▓реВ рдХреЛ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдкрд░рд╕реНрдкрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рд╣реИ рдЬрдм рдПрдХ рджреВрд╕рд░реЗ рдФрд░ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИ - рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рддрдп рд╕рдордп рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рд╕реБрдирд╛ рдФрд░ рдПрд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк Restinio рдпрд╛ SObjectizer рдореЗрдВ рдХреБрдЫ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рд╣рдо рдЕрдЪреНрдЫреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВред
рдЦреИрд░, рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕рдордп рд▓рд┐рдпрд╛ рдФрд░ рдЭреАрдВрдЧрд╛ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдЬреЛ рдХрд┐ рдпрд╣рд╛рдВ рд╣реИрдмреЗ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...