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[rYcsXt|ttj|}|jr&t||j| |_ |j dk sFt |j ||dSr^) rSconnection_maderrcZ Transportr5rrf create_taskstartr>r2AssertionError)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)rVrorWr.r/rps2              zRequestHandler.connection_lost)parserrYcCs2|jdkst||_|jr.|j|jd|_dS)NrR)r@rnr; feed_data)rVrrr.r.r/ set_parser&s zRequestHandler.set_parsercCsdSr^r.r\r.r.r/ eof_received0szRequestHandler.eof_received)datarYc Cs|js |jrdS|jdkrP|jsP|jdk s2tz|j|\}}}Wntk r}z0|j | t ||jd||j |_ |W5d}~XYntk r}z,|j | t ||jd||_ |W5d}~XYnpX|r6|D]&\}}|jd7_|j||fq|j}|dk r6|s6|d||_|r|r||_nN|jdkrz|jrz|rz|j|7_n$|r|j|\} }| r|dS)Nir)rFrEr@r?rArnrsrrfrlhandle_parse_errorrmessager=ri Exceptionr0r:appendr<rgZ set_resultr;) rVrvZmessagesZupgradedtailromsgpayloadZwaitereofr.r.r/ data_received3sL       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 sL|jdk stz(z||_||IdH}W5d|_XWntk r}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_infoirw)r3rnrGrr"rrrrfinish_responsercrdrer handle_errorrz)rVrrresproresetr.r.r/_handle_requests2 $ $&zRequestHandler._handle_requestc s|j}|j}|dk st|j}|dk s*t|j}d}|jdk sBt|jdk sPt|js|jsz@z| |_ |j IdHWn t j k rYWqYnXW5d|_ X|j \}}|}|jd7_t||} ||||| |} dz$zv|j|| |} z| IdH\}} Wn6t j tfk rN|dYWWqYnXt|ddrjtdt~ | r|dWWqt |j!|_|"sX|j#}|js4|r4|d ||} | |}t$t j%t j P|"s*| |kr*t&|| |d |'IdHW5QRX|} qW5QRX|"sX|jsX|d |(|)t*Wnt j k r|d YWqYnzt+k r}z"|j,r|j-d |d|.W5d}~XYn:t/k r }z|j-d|d|.W5d}~XYnXW5|jdkr4|dk r4|dn\|js|jr|js|dk r|j} | |_|jdkr|| ||j|_nqXqP|jsd|_|jdk r|j0dkr|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)1rfr>rnr2r8r4r3rFr:r<Z create_futurercrdpopleftrZrequests_countrr[rr1rEr6r7Zcall_atrrlrConnectionErrorgetattrwarningswarnDeprecationWarningboolrZis_eofr9rrerZreadanyriZ set_exceptionr& RuntimeErrorrCrrrzr=)rVrQZhandlerrPrHrryr~rmwriterrZnowtaskrrNZend_tror.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;rsprepareAttributeErrorrrZ write_eofrr)rVrrrZ prepare_methr.r.r/r4s0     zRequestHandler.finish_responserw)rrroryrYc 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 descriptionrCrrz traceback format_excrget html_escaper"rrZ output_sizer[) rVrrroryZctrr}tbrr.r.r/rXs6      zRequestHandler.handle_error)rrroryrYcsrt}|dk stttt||||j}|||||}||IdH|IdH|j dk rh|j d|_ dSr^) rrnr!ERRORrrfrrrr[rir=)rVrrroryrrrr.r.r/rxs    z!RequestHandler.handle_parse_error)r_)rwNN)NN)3r*r+r,r-r __slots__rr rZ LOG_FORMATrcZAbstractEventLooprUrrr rstrintrTr]propertyrHr rjZ BaseTransportrk BaseExceptionrprrtrubytesrrrirr!r#rrrrr rrmrrrrx __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_RequestHandlerZURLrrzr%r&r$r.r.r.r/sd     (