Werkzeug: рдЦрдВрдбрд┐рдд рдЕрдиреБрд░реЛрдз рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЬреБрд▓ре░ 2017  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/werkzeug

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

рдореИрдВ рдПрдХ рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрдВрдбрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ Werkzeug (рд╡рд░реНрддрдорд╛рди рдЧрд┐рдЯ рдорд╛рд╕реНрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред get_input_stream LimitedStream(wsgi.input, min(content_length, max_content_length)) рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЦрдВрдбрд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ min(content_length, max_content_length) рд╣рдореЗрд╢рд╛ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдореИрдВрдиреЗ LimitedStream(stream, content_length or max_content_length) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ ClientDisconnected рдЕрдкрд╡рд╛рдж рдорд┐рд▓ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЦрдВрдбрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рдЬреИрд╕рд╛ рдХрд┐ wsgi.input.read() рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ 0-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕рд╛ wsgi input_terminated рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ? рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрд░ рдкреВрд░реЗ рджрд┐рди рдЬрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдЦрд╛рд▓реА рдХреНрдпреЛрдВ рд╣реИ, рдлрд┐рд░ рд╕реНрдЯреНрд░реАрдо рдЦрд╛рд▓реА рдХреНрдпреЛрдВ рд╣реИ, рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдЦрдВрдбрд┐рдд рд╕реНрдЯреНрд░реАрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЕрдм рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ: /

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ min рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдмрдЧ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП max_content_length рд╕реЗ рдХрдо рд╣реЛрдиреЗ рдкрд░ Werkzeug рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде wsgi.input.read(max_content_length) рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ред рдпрд╛ Gunicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рдкреВрд░реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдкрд╛рд░реНрд╕ рдФрд░ рдмрдлрд░ рдХрд░рдХреЗ рднрд╛рдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓рдВрдмрд╛рдИ max_content_length рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП LimitedStream рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Django рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдХреБрдЫ рдЕрдЬреАрдм рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рдзрд╛рд░рд╛ рднреА рджреЗрдЦрддрд╛ рд╣реИред

рдЖрдЧреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬреЛ environ['wsgi.input_terminated'] рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦрдВрдбрд┐рдд рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕рд╛ wsgi input_terminated рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ? рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрд░ рдкреВрд░реЗ рджрд┐рди рдЬрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдЦрд╛рд▓реА рдХреНрдпреЛрдВ рд╣реИ, рдлрд┐рд░ рд╕реНрдЯреНрд░реАрдо рдЦрд╛рд▓реА рдХреНрдпреЛрдВ рд╣реИ, рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдЦрдВрдбрд┐рдд рд╕реНрдЯреНрд░реАрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЕрдм рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ: /

environ.get('wsgi.input_terminated') рдЬрд╛рдБрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╣рдореЗрдВ environ.get('HTTP_TRANSFER_ENCODING') == 'chunked' рднреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рдЕрд▓рд┐рдЦрд┐рдд рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реАрдзреЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг curl -H 'Transfer-Encoding: chunked' ... рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рд▓реМрдЯрд╛рдиреЗ рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рддрд┐ RFC2616

4.4.2
рдпрджрд┐ рдПрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб (рд╕реЗрдХреНрд╢рди резрек.рекрез) рдореМрдЬреВрдж рд╣реИ рдФрд░
"рдкрд╣рдЪрд╛рди" рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рд▓рдВрдмрд╛рдИ рд╣реИ
"рдЦрдВрдбрд┐рдд" рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдХреЛрдбрд┐рдВрдЧ (рдзрд╛рд░рд╛ 3.6) рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд,
рдЬрдм рддрдХ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

4.4.3
рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝реАрд▓реНрдб (рдЦрдВрдб резрек.резрей) рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛
OCTETs рдореЗрдВ рджрд╢рдорд▓рд╡ рдорд╛рди рдЗрдХрд╛рдИ-рд▓рдВрдмрд╛рдИ рдФрд░ рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рд▓рдВрдмрд╛рдИред рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдпрджрд┐ рдпреЗ рджреЛ рд▓рдВрдмрд╛рдИ рдЕрд▓рдЧ рд╣реИрдВ (рдпрд╛рдиреА, рдпрджрд┐ рдПрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ
рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб рдореМрдЬреВрдж рд╣реИ)ред рдпрджрд┐ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ a
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╝реАрд▓реНрдб рдФрд░ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╝реАрд▓реНрдб,
рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

... рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Transfer-Encoding рдХрд╛ chunked рдорд╛рдВрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА Content-Length рд╣реЗрдбрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдИ рд╕реНрдЯреНрд░реАрдо-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддрдм рддрдХ рд╣реИ рдЬрдм рддрдХ wsgi.input_terminated рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10 рдмрд╛рдЗрдЯ JSON рдкреЗрд▓реЛрдб рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЦрдВрдбрд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП wsgi.input_terminated рд╕реЗрдЯ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕