U '7`Z @sddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl mZddlmZmZmZmZmZmZmZmZddlZdd lmZmZdd lmZdd lmZm Z dd l m!Z!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(ddl)m*Z*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5m6Z6dZ7erJddl8m9Z9ee$e+dedge3fZ:ee3gee6fZ;e$dde#iiddddeZ?Gddde>Z@Gd ddeZAdS)!N)deque)suppress)escape) HTTPStatus)Logger) TYPE_CHECKINGAny AwaitableCallableOptionalTupleTypecast)AbstractAccessLoggerAbstractStreamWriter) BaseProtocol) CeilTimeout current_task)HttpProcessingErrorHttpRequestParser HttpVersion10RawRequestMessage StreamWriter) access_logger server_logger) EMPTY_PAYLOAD StreamReader) tcp_keepalive) HTTPException) AccessLogger) BaseRequest)ResponseStreamResponse)RequestHandlerRequestPayloadErrorPayloadAccessError)Serverr$zasyncio.Task[None]ZUNKNOWN/TFc@seZdZdZdS)r%zPayload parsing error.N__name__ __module__ __qualname____doc__r.r.G/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/web_protocol.pyr%9sr%c@seZdZdZdS)r&z-Payload was accessed after response was sent.Nr)r.r.r.r/r&=sr&cseZdZdZdZdZddeeeej ddddd d d d e j e e eeeeee eeee ed fddZedddZee dddZdHee ddddZe jddfdd Zeeddfdd Zedd d!d"Zddd#d$Ze dd%d&d'Z!e dd(d)d*Z"ddd+d,Z#ddd-d.Z$e%e&e dd/d0d1Z'eedd2d3d4Z(eedd2d5d6Z)ddd7d8Z*e%e e+e&e fd9d:d;Z,dddd?d@Z.dIe%eeeeee&dBdCdDZ/dJe0eeeeeddEdFdGZ1Z2S)Kr$aHTTP protocol implementation. RequestHandler handles incoming HTTP request. It reads request line, request headers and request payload and calls handle_request() method. By default it always returns with 404 response. RequestHandler handles errors in incoming request, like bad status line, bad headers or incomplete payload. If any error occurs, connection gets closed. :param keepalive_timeout: number of seconds before closing keep-alive connection :type keepalive_timeout: int or None :param bool tcp_keepalive: TCP keep-alive is on, default is on :param bool debug: enable debug mode :param logger: custom logger object :type logger: aiohttp.log.server_logger :param access_log_class: custom class for access_logger :type access_log_class: aiohttp.abc.AbstractAccessLogger :param access_log: custom logging object :type access_log: aiohttp.log.server_logger :param str access_log_format: access log format string :param loop: Optional event loop :param int max_line_size: Optional maximum header line size :param int max_field_size: Optional maximum header field size :param int max_headers: Optional maximum header size r)_request_count _keepalive_manager_request_handler_request_factory_tcp_keepalive_keepalive_time_keepalive_handle_keepalive_timeout_lingering_time _messages _message_tail_waiter_error_handler _task_handler_upgrade_payload_parser_request_parserZ_reading_pausedloggerdebug access_logr_close _force_close_current_requestgR@TFiig$@i) keepalive_timeoutrrBaccess_log_classrDaccess_log_formatrC max_line_size max_headersmax_field_sizelingering_time read_bufsizer')managerlooprHrrBrIrDrJrCrKrLrMrNrOc  st|d|_d|_d|_||_|j|_|j|_ ||_ d|_ d|_ ||_ t| |_t|_d|_d|_d|_d|_d|_d|_t|||| | | td|_||_| |_||_|r||||_nd|_d|_d|_ dS)NrFg)rKrMrLZpayload_exception)!super__init__r0r1rGr2Zrequest_handlerr3Zrequest_factoryr4r5r6r7r8floatr9rr:r;r<r=r>r?r@rr%rArBrCrDrrErF)selfrPrQrHrrBrIrDrJrCrKrLrMrNrO __class__r.r/rTsR   zRequestHandler.__init__)returncCsd|jj|jdk rdndS)Nz<{} {}>Z connectedZ disconnected)formatrXr* transportrVr.r.r/__repr__szRequestHandler.__repr__cCs|jSN)r8r\r.r.r/rHsz RequestHandler.keepalive_timeout.@N)timeoutrYc sd|_|jdk r|j|jr*|jttjtjzt||j d`|j dk rj|j sj|j IdH|j dk r|j t|jdk r|j s|jIdHW5QRXW5QRX|jdk r|j|jdk r|jd|_dS)zWorker process is about to exit, we need cleanup everything and stop accepting requests. It is especially important for keep-alive connections.TNrQ)rFr7cancelr<rasyncioCancelledError TimeoutErrorr_loopr=donerG_cancelr>r[close)rVr`r.r.r/shutdowns$          zRequestHandler.shutdown)r[rYcsJt|ttj|}|jr&t||j| |_ |j ||dSr^) rSconnection_maderrcZ Transportr5rrf create_taskstartr>r2)rVr[Zreal_transportrWr.r/rks   zRequestHandler.connection_made)excrYcs|jdkrdS|j||t|d|_d|_d|_d|_d|_|jdk rZ|j|j dk r|dkrtt d}|j ||j dk r|j |j dk r|j |jdk r|jd|_ |jdk r|jd|_dS)NTzConnection lost)r2connection_lostrSrFr4r3rAr7rbrGConnectionResetErrorrhr=r>r<r@Zfeed_eof)rVrnrWr.r/ros2              zRequestHandler.connection_lost)parserrYcCs$||_|jr |j|jd|_dS)NrR)r@r; feed_data)rVrqr.r.r/ set_parser&szRequestHandler.set_parsercCsdSr^r.r\r.r.r/ eof_received0szRequestHandler.eof_received)datarYc Cs|js |jrdS|jdkrB|jsBz|j|\}}}Wntk r}z0|j| t ||jd||j |_ | W5d}~XYntk r}z,|j| t ||jd||_ | W5d}~XYnpX|r(|D]&\}}|jd7_|j||fq|j}|dk r(|s(|d||_|r|r||_nN|jdkrl|jrl|rl|j|7_n$|r|j|\} }| r| dS)Nir)rFrEr@r?rArrrrfrlhandle_parse_errorrmessager=ri Exceptionr0r:appendr<rgZ set_resultr;) rVruZmessagesZupgradedtailrnmsgpayloadZwaitereofr.r.r/ data_received3sJ       zRequestHandler.data_received)valrYcCs ||_|jr|jd|_dS)zMSet keep-alive connection mode. :param bool val: new state. N)r1r7rb)rVrr.r.r/ keep_aliveds zRequestHandler.keep_alivecCsd|_|jr|jdS)ziStop accepting new pipelinig messages and close connection when handlers done processing messagesTN)rEr<rbr\r.r.r/rinszRequestHandler.closecCs4d|_|jr|j|jdk r0|jd|_dS)zForce close connectionTN)rFr<rbr[rir\r.r.r/ force_closeus    zRequestHandler.force_close)requestresponsetimerYcCs(|jdk r$|j|||j|dSr^)rlogrfr)rVrrrr.r.r/ log_access~s zRequestHandler.log_access)argskwrYcOs|jr|jj||dSr^)rCrBrVrrr.r.r/ log_debugszRequestHandler.log_debugcOs|jj||dSr^)rBZ exceptionrr.r.r/ log_exceptionszRequestHandler.log_exceptioncCsT|js |jsdS|j|j}|jr<|j|kr<|dS|j|j |j |_ dSr^) rFr1r6r8r<rfrrZ call_laterKEEPALIVE_RESCHEDULE_DELAY_process_keepaliver7)rVnextr.r.r/rs  z!RequestHandler._process_keepalive)r start_timerYc s>z(z||_||IdH}W5d|_XWntk rv}z0t|j|j|j|jd}||||IdH}W5d}~XYnt j k rYnt j k r}z2|j d|d| |d}||||IdH}W5d}~XYnZtk r }z&| |d|}||||IdH}W5d}~XYnX||||IdH}||fS)N)statusreasontextheaderszRequest handler timed out.exc_infoirv)rGr3rr"rrrrfinish_responsercrdrer handle_errorry)rVrrresprnresetr.r.r/_handle_requests0 $ $&zRequestHandler._handle_requestc s|j}|j}|j}|j}d}|jsb|jstz@z||_|jIdHWn tj k rfYWqbYnXW5d|_X|j \}}| }|j d7_ t ||} ||||| |} dz$zv|j|| |} z| IdH\}} Wn6tj tfk r|dYWWqbYnXt|ddr6tdt~ | rV|dWWqbt|j|_| s$|j!}|js|r|d || } | |}t"tj#tj P| s| |krt$|| |d |%IdHW5QRX| } qW5QRX| s$|js$|d |&|'t(Wntj k r`|d YWqbYnzt)k r}z"|j*r|j+d |d|,W5d}~XYn:t-k r}z|j+d|d|,W5d}~XYnXW5|jdkr|dk r|dn\|js\|jrT|jsT|dk r\|j } | |_|jdkr\|| ||j|_nqbXq|jsd|_|jdk r|j.dkr|j&dS)a_Process incoming request. It reads request line, request headers and request payload, then calls handle_request() method. Subclass has to override handle_request(). start() handles various exceptions in request or response handling. Connection is being closed always unless keep_alive(True) specified. Nrz'Ignored premature client disconnection.z&Ignored premature client disconnectionZ__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception insteadz(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.razUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionrzUnhandled exception)/rfr>r2r8rFr:r<Z create_futurercrdpopleftrZrequests_countrr4r[rr1rEr6r7Zcall_atrrlrConnectionErrorgetattrwarningswarnDeprecationWarningboolrZis_eofr9rrerZreadanyriZ set_exceptionr& RuntimeErrorrCrrryr=)rVrQZhandlerrPrHrrxr}rmwriterrZnowtaskrrNZend_trnr.r.r/rms              zRequestHandler.start)rrrrYcs|jdk r6|jdd|_|jr6|j|jd|_z |j}Wn4tk rt|dkrbtdntd|YnXz ||IdH| IdHWn$t k r| |||YdSX| |||dSdS)a Prepare the response and write_eof, then log access. This has to be called within the context of any exception so the access logger can get exception information. Returns True if the client disconnects prematurely. NFrRz+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T) rAZ set_upgradedr?r;rrprepareAttributeErrorrrZ write_eofrr)rVrrrZ prepare_methr.r.r/r4s0     zRequestHandler.finish_responserv)rrrnrxrYc Cs|jd|dd}|tjkrdtj}tjj}d}|jrVttt }W5QRXd|j ddkr|rt |}d |d }d j||d }d}n|r|}|d |}t |||d} | |jjdks|jdkr|| S)zHandle errors. Returns HTTP response with specific status code. Logs additional information. It always closes current connection.zError handling requestrz text/plainz{0.value} {0.phrase}Nz text/htmlZAcceptz

Traceback:

z
zV{title}

{title}

{msg} )titler|z )rrZ content_typer)rrZINTERNAL_SERVER_ERRORrZ descriptionrCrry traceback format_excrget html_escaper"rrZ output_sizer[) rVrrrnrxZctrr|tbrr.r.r/rXs6      zRequestHandler.handle_error)rrrnrxrYcsft}ttt||||j}|||||}||IdH|IdH|jdk r\|j d|_ dSr^) rr!ERRORrrfrrrr[rir=)rVrrrnrxrrrr.r.r/rws  z!RequestHandler.handle_parse_error)r_)rvNN)NN)3r*r+r,r-r __slots__rr rZ LOG_FORMATrcZAbstractEventLooprUrrr rstrintrTr]propertyrHr rjZ BaseTransportrk BaseExceptionrorrsrtbytesrrrirr!r#rrrrr rrmrrrrw __classcell__r.r.rWr/r$As'"G  " 1    y ' 3)BrcZasyncio.streamsrr collectionsr contextlibrZhtmlrrZhttprZloggingrtypingrrr r r r r rZyarlabcrrZ base_protocolrZhelpersrrrrrrrrrrZstreamsrrZ tcp_helpersrZweb_exceptionsrZweb_logr Z web_requestr!Z web_responser"r#__all__Z web_serverr'Z_RequestFactoryZ_RequestHandlerZURLrryr%r&r$r.r.r.r/sd     (