
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдПрдХ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ рдерд╛ рдЬреЛ рдЗрд╕рдХреЗ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдХрдиреЗрдХреНрд╢рди рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ URL рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдХреЛ 200KiB / рд╕реЗрдХрдВрдб рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рджреВрд╕рд░реЗ URL рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдХреЗрд╡рд▓ 30KiB / secред
рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдЗрдиреНрд╣реАрдВ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдХреБрдЫ рджрд┐рдП рдЧрдП рдЧрддрд┐ рд╕реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рджреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 512KiB / secред рддрдм рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 200KiB / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдпрд╣ рдЙрдЪреНрдЪ рдЧрддрд┐ рддрдХ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдРрд╕рд╛ HTTP рд╕рд░реНрд╡рд░ рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓реЗрдЧрд╛?
рдЪреВрдБрдХрд┐ рдореБрдЭреЗ C ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб Restinio HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рдШреБрдЯрдиреЗ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTTP рдЯреЗрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реНрдЯреНрд░реАрдо рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдФрд░ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЙрд╕реА рд╕рдордп, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЦреБрдж рдХреЛ рдзреЛрдЦрд╛ рджреЗ рд░рд╣рд╛ рд╣реВрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдХреЛ Restinio рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ "Restinio рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP рд╕рд░реНрд╡рд░ рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕" ред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЕрд╕рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИ, рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЗ рдЖрд╡реЗрджрди, рддреЛ рдЖрдкрдХреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░
рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ: рдЬрдм рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ HTTP GET рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЯрд╛рдЗрдорд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИред рдЬрдм рдЯрд╛рдЗрдорд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдХрд╛ рдЕрдЧрд▓рд╛ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИ
рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдПрди рдХрд┐рд▓реЛрдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╣рд░ рд╕реЗрдХрдВрдб рднреЗрдЬрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдЬрдорд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╕рдордп, HTTP рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдХреА рддрддреНрдкрд░рддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЬрдм рддрдХ рд╕реЙрдХреЗрдЯ рддреИрдпрд╛рд░ рд╣реИ (рдпрд╛рдиреА, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рдЗрд╕рдореЗрдВ рдЬрдорд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ), рдЖрдк рдПрдХ рдирдпрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реЙрдХреЗрдЯ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рди рдЪрд▓рд╛ рдЬрд╛рдПред
рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди I / O рд╕рдВрдЪрд╛рд▓рди RESTinio рдХреА рдмрд╛рдЗрдмрд┐рд▓ рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ ... рдореИрдВ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдЧрд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?
рдЖрдк рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЖрдлреНрдЯрд░-рд░рд╛рдЗрдЯ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдореЗрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
void request_handler(restinio::request_handle_t req) { req->create_response()
рдЬрдм RESTinio рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реИрдВрдмрдбрд╛ done()
рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рдерд╛, рддреЛ рд▓реИрдореНрдмрдбрд╛ рдХреЛ рддреБрд░рдВрдд рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реЙрдХреЗрдЯ рдЕрдкрдиреА рдЙрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рд╕рднреА рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдЖрдлреНрдЯрд░-рд░рд╛рдЗрдЯ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХрд╛ рддрд░реНрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:
- рдбреЗрдЯрд╛ рдХреЗ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рднреЗрдЬреЗрдВ, рдЙрд╕ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдЬрдм рд╣рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА;
- рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╣реИрдВрдЧ рдХрд░рддреЗ рд╣реИрдВ;
- рдЬрдм рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдЧрд▓рд╛ рдмреИрдЪ рдЖ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдкрд╣рд▓ рдХрд░реЗрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдорд░ рдХреЛ рдХреЙрдХ рдХрд░реЗрдВред
рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдзреАрдорд╛ рд╣реЛрдиреЗ рд▓рдЧреЗрдЧреА, рдирдпрд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрдм рд╕реЙрдХреЗрдЯ рдирдП рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рдФрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓: chunked_output
Restinio HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдзрд┐, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рдХреА рд▓рдЧрднрдЧ рдЕрдВрддрд╣реАрди рд╕реНрдЯреНрд░реАрдо рдЪрд╛рд╣рд┐рдПред рдФрд░ рдРрд╕реА рдзрд╛рд░рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, set_body
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдкрд░ set_body
рдирд╣реАрдВ set_body
рд╕рдХрддреАред
рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрдгрд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рддрдерд╛рдХрдерд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ chunked_output ред рдпрд╛рдиреА рдЙрддреНрддрд░ рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВ Restinio рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрддреНрддрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрдиреЗрдЧрд╛ред рддрдм рдореИрдВ рдмрд╕ рд╕рдордп-рд╕рдордп рдкрд░ append_chunk
рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ append_chunk
рддрд╛рдХрд┐ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдЙрддреНрддрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рд╕рдВрдЪрд┐рдд рднрд╛рдЧреЛрдВ рдХреЛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП flush
рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдФрд░ рдХреЛрдб рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ!
рд╢рд╛рдпрдж рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд╢рдмреНрдж рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдФрд░ рдХреЛрдб рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЖрдЗрдП request_processor
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реИрдз HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЪрд▓рд┐рдП рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ request_processor
рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдлрд┐рд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, request_processor
рдХреЛ рдХреИрд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдиреБрд░реЛрдз_рдкреНрд░реЛрд╕реЗрд╕рд░ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЙрд╕рдХреЗ рд╕рд╣рд╛рдпрдХ
HTTP GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП request_processor
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- Asio-shny io_context рдЬрд┐рд╕ рдкрд░ рд╕рднреА рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрд░реНрдЧрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП);
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЖрдХрд╛рд░ред рдпрд╛рдиреА рдпрджрд┐ рдореБрдЭреЗ 512KiB / рд╕реЗрдХрдВрдб рдХреА рджрд░ рд╕реЗ рдПрдХ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕реНрдЯреНрд░реАрдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ 512KiB рдорд╛рди рдХреЛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдорд╛рдорд▓реЗ рдореЗрдВ рдзрд╛рд░рд╛ рдХреБрдЫ рд╕реАрдорд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк 5 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП 512KiB / рд╕реЗрдХрдВрдб рдХреА рджрд░ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░реАрдо рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди 300 рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (5 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдорд┐рдирдЯ 60 рдмреНрд▓реЙрдХ);
- рдЦреИрд░, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдЦреБрдж рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдПред
request_processor
рдЕрдВрджрд░, рдЕрдиреБрд░реЛрдз рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдмрд╣реБрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
void request_processor( asio_ns::io_context & ctx, std::size_t chunk_size, std::size_t count, restinio::request_handle_t req) { auto data = std::make_shared<response_data>( ctx, chunk_size, req->create_response<output_t>(), count); data->response_ .append_header(restinio::http_field::server, "RESTinio") .append_header_date_field() .append_header( restinio::http_field::content_type, "text/plain; charset=utf-8") .flush(); send_next_portion(data); }
response_data
рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
struct response_data { asio_ns::io_context & io_ctx_; std::size_t chunk_size_; response_t response_; std::size_t counter_; response_data( asio_ns::io_context & io_ctx, std::size_t chunk_size, response_t response, std::size_t counter) : io_ctx_{io_ctx} , chunk_size_{chunk_size} , response_{std::move(response)} , counter_{counter} {} };
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ response_data
рд╕рдВрд░рдЪрдирд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ restinio::response_builder_t<restinio::chunked_output_t>
рдХреА рдПрдХ рд╡рд╕реНрддреБ restinio::response_builder_t<restinio::chunked_output_t>
(рдЕрд░реНрдерд╛рдд, рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдирд╛рдо рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ response_t
) рдПрдХ рдЪрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ (рджреНрд╡рд╛рд░рд╛) std::unique_ptr
рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп std::unique_ptr
)ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд░реНрдл рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддрдм std::function
рдореЗрдВ рдЦреБрдж рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓_рдбреЗрдЯрд╛ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд░рдЦрддреЗ response_data
, рддреЛ reponse_data
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ std::function
рд╕реЗрд╡ рдХрд░реЗрдВред
Send_next_portion рдлрд╝рдВрдХреНрд╢рди
send_next_portion
рдлрд╝рдВрдХреНрд╢рди send_next_portion
рд╣рд░ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рднреЗрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓рдЧрддрд╛ рд╣реИ:
void send_next_portion(response_data_shptr data) { data->response_.append_chunk(make_buffer(data->chunk_size_)); if(1u == data->counter_) { data->response_.flush(); data->response_.done(); } else { data->counter_ -= 1u; data->response_.flush(make_done_handler(data)); } }
рдпрд╛рдиреА рдЕрдЧрд▓рд╛ рднрд╛рдЧ рднреЗрдЬреЗрдВ рдФрд░, рдпрджрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдВрддрд┐рдо рдерд╛, рддреЛ рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ flush
рдХреЛ flush
рд╡рд┐рдзрд┐ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрджред
рдлрдВрдХреНрд╢рди рдореЗрдХ_рдбреЛрди_рд╣реИрдВрдбрд▓рд░
make_done_handler
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдЬреЛ рдХрд┐ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЛ рдПрдХ рдмрд╛рдж рдХреЗ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рд╣реБрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдЧрд▓рд╛ рднрд╛рдЧ рддреБрд░рдВрдд рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрд░реНрдерд╛рдд, рд╕реЙрдХреЗрдЯ рдореЗрдВ "рдмреНрд░реЗрдХ" рдереЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреА рджрд░ рдХреЛ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛), рдпрд╛ рдПрдХ рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рджред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдард╣рд░рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдХреЙрдХрд┐рдВрдЧ рдЯрд╛рдЗрдорд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рдЖрдкрдХреЛ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЕрдВрджрд░ рд▓реИрдореНрдмрдбрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ "рдЖрдзреБрдирд┐рдХ" рд╕реА ++ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрд┐рд╕реЗ рдЖрдзреБрдирд┐рдХ рдХрд╣рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рд╕рд╛рд▓ рдирд╣реАрдВ рд╣реИрдВ;)
auto make_done_handler(response_data_shptr data) { const auto next_timepoint = steady_clock::now() + 1s; return [=](const auto & ec) { if(!ec) { const auto now = steady_clock::now(); if(now < next_timepoint) { auto timer = std::make_shared<asio_ns::steady_timer>(data->io_ctx_); timer->expires_after(next_timepoint - now); timer->async_wait([timer, data](const auto & ec) { if(!ec) send_next_portion(data); }); } else data->io_ctx_.post([data] { send_next_portion(data); }); } }; }
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдЕрд╕рд┐рдпреЛ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рд╕реЗ рдЙрдкрдЬреА рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд┐рдХрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ, рд╡рд╣ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд░рд╛рдЙрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛
рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ request_processor
, send_next_portion
рдФрд░ make_done_handler
send_next_portion
рдореЗрдВ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде 15 рдпрд╛ 20 рдорд┐рдирдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рдЦрд╛рдореА рдереА: рдЗрд╕рдиреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЧрддрд┐ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдзрд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреАред 512KiB / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд - рд╕рднреА 512KiB / рд╕реЗрдХрдВрдб рджреЗрддрд╛ рд╣реИред 20KiB / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рдкреБрдирдГрдкреНрд░рдХрд╛рд╢рд┐рдд - рд╕рднреА рдХреЛ 20KiB / рд╕реЗрдХрдВрдб рджреЗрдЧрд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдХреНрдпрд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди "рдореЛрдЯрд╛рдИ" рдХреЗ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред
рдлрд┐рд░ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд░рд┐рдЯрд░реНрди рдХреА рдЧрддрд┐ рд╕реАрдзреЗ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдорд╛рдВрдЧреА рдЬрд╛рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ localhost:8080/
рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЧрддрд┐ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХреАред рдФрд░ рдЕрдЧрд░ рдЖрдкрдиреЗ localhost:8080/128K
рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ 128KiB / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рдиреА рд╢реБрд░реВ рд╣реЛ рдЧрдИред
рдлрд┐рд░ рд╡рд┐рдЪрд╛рд░ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝ рдЧрдпрд╛: URL рдореЗрдВ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА localhost:8080/128K/3000
рдЕрдиреБрд░реЛрдз localhost:8080/128K/3000
128KiB / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ 3000 рднрд╛рдЧреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред
рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред Restinio рдореЗрдВ ExpressJS рдХреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдмрдиреЗ рдХреНрд╡реЗрд░реА рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдерд╛:
auto make_router(asio_ns::io_context & ctx) { auto router = std::make_unique<router_t>(); router->http_get("/", [&ctx](auto req, auto) { request_processor(ctx, 100u*1024u, 10000u, std::move(req)); return restinio::request_accepted(); }); router->http_get( R"(/:value(\d+):multiplier([MmKkBb]?))", [&ctx](auto req, auto params) { const auto chunk_size = extract_chunk_size(params); if(0u != chunk_size) { request_processor(ctx, chunk_size, 10000u, std::move(req)); return restinio::request_accepted(); } else return restinio::request_rejected(); }); router->http_get( R"(/:value(\d+):multiplier([MmKkBb]?)/:count(\d+))", [&ctx](auto req, auto params) { const auto chunk_size = extract_chunk_size(params); const auto count = restinio::cast_to<std::size_t>(params["count"]); if(0u != chunk_size && 0u != count) { request_processor(ctx, chunk_size, count, std::move(req)); return restinio::request_accepted(); } else return restinio::request_rejected(); }); return router; }
рдпрд╣рд╛рдВ HTTP GET рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ URL рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╣реИрдВ:
- рдлреЙрд░реНрдо
http://localhost/
; http://localhost/<speed>[<U>]/
;- рдлрд╛рд░реНрдо рдХрд╛
http://localhost/<speed>[<U>]/<count>/
рдЬрд╣рд╛рдВ speed
рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЧрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ U
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЧреБрдгрдХ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЗрдХрд╛рдИ рдореЗрдВ рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рддреЛ 128
рдпрд╛ 128
128b
рдЕрд░реНрде рд╣реИ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 128 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЧрддрд┐ред рдФрд░ 128k
рдкреНрд░рддрд┐ рдХрд┐рд▓реЛрдЧреНрд░рд╛рдо 128 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ URL рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд▓рдВрдмрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ, рдпрджрд┐ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП request_processor
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рд╕рд╣рд╛рдпрдХ рд╕рдорд╛рд░реЛрд╣ extract_chunk_size
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
std::size_t extract_chunk_size(const restinio::router::route_params_t & params) { const auto multiplier = [](const auto sv) noexcept -> std::size_t { if(sv.empty() || "B" == sv || "b" == sv) return 1u; else if("K" == sv || "k" == sv) return 1024u; else return 1024u*1024u; }; return restinio::cast_to<std::size_t>(params["value"]) * multiplier(params["multiplier"]); }
рдпрд╣рд╛рдВ, C ++ рд▓рдВрдмреЛрджрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣
рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдЪрд▓рддрд╛ рд╣реИ:
using router_t = restinio::router::express_router_t<>; ... int main() { struct traits_t : public restinio::default_single_thread_traits_t { using logger_t = restinio::single_threaded_ostream_logger_t; using request_handler_t = router_t; }; asio_ns::io_context io_ctx; restinio::run( io_ctx, restinio::on_this_thread<traits_t>() .port(8080) .address("localhost") .write_http_response_timelimit(60s) .request_handler(make_router(io_ctx))); return 0; }
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
- рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдорд┐рдд рд░рд╛рдЙрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рд╕рд╛рд░рд╛ рдХрд╛рдо рдбрд╛рд▓рддрд╛ рд╣реИ), рдореИрдВ рдЕрдкрдиреЗ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдирдХ рдЧреБрдг (рдкреНрд░рдХрд╛рд░
restinio::default_single_thread_traits_t
) restinio::default_single_thread_traits_t
рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ restinio::default_single_thread_traits_t
рдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдЬреИрд╕реЗ рд░рд╛рдЙрдЯрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ HTTP рд╕рд░реНрд╡рд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, null_logger_t
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ null_logger_t
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреЗ рдЕрдВрджрд░ рдЯрд╛рдЗрдорд░ рдХреЛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдореБрдЭреЗ рдПрдХ io_context рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рддрд╛ рд╣реВрдВред рдпрд╣ рдореБрдЭреЗ
make_router
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореЗрд░реЗ io_context рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред - рдпрд╣ рдХреЗрд╡рд▓ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП io_context рдкрд░ рдПрдХ-рдереНрд░реЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
restinio::run
рдлрд╝рдВрдХреНрд╢рди рддрднреА рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдЬрдм рдПрдЪрдЯреАрдЯреАрдкреА рд╕рд░реНрд╡рд░ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓реЗрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдореЗрдВ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБред рдкреВрд░реНрдг рдХреЛрдб, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрдВрдХрдг рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реИ, рдХреБрдЫ рд╣рдж рддрдХ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╣реИред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдпрд╣ 185 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЦреИрд░, рдЗрди 185 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдХреБрд▓ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкрд╕рдВрдж рдЖрдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рд░реНрдп рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЬрд┐рд╕ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рд╡рд╣ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдФрд░ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЗ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдХрдЯ рд╣реБрдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдХрд┐рд╕реА рдФрд░ рдиреЗ Restinio рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреБрдж GitHub рдкрд░ рд░рд╣рддрд╛ рд╣реИ ред рдЖрдк рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рд╕реБрдЭрд╛рд╡ Google рд╕рдореВрд╣ рдореЗрдВ рдпрд╛ рдпрд╣реАрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред