B `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]UNKNOWN/TFc@seZdZdZdS)r%zPayload parsing error.N)__name__ __module__ __qualname____doc__r.r.o/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/web_protocol.pyr%9sr%c@seZdZdZdS)r&z-Payload was accessed after response was sent.N)r*r+r,r-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/rTsH    zRequestHandler.__init__)returncCsd|jj|jdk rdndS)Nz<{} {}> connectedZ disconnected)formatrWr* transport)rVr.r.r/__repr__szRequestHandler.__repr__cCs|jS)N)r8)rVr.r.r/rHsz RequestHandler.keepalive_timeout.@N)timeoutrXc sd|_|jdk r|j|jr*|jttjtjzt||j d`|j dk rj|j sj|j IdH|j dk r|j t|jdk r|j s|jIdHWdQRXWdQRX|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.TN)rQ)rFr7cancelr<rasyncioCancelledError TimeoutErrorr_loopr=donerG_cancelr>r[close)rVr^r.r.r/shutdowns$          zRequestHandler.shutdown)r[rXcsXt|ttj|}|jr&t||j| |_ |j dk sFt |j ||dS)N) rSconnection_maderr` Transportr5rrc create_taskstartr>r2AssertionError)rVr[Zreal_transport)rWr.r/rhs  zRequestHandler.connection_made)excrXcs|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_lostrSrFr4r3rAr7r_rGConnectionResetErrorrer=r>r<r@Zfeed_eof)rVrm)rWr.r/rns2              zRequestHandler.connection_lost)parserrXcCs2|jdkst||_|jr.|j|jd|_dS)NrR)r@rlr; feed_data)rVrpr.r.r/ set_parser&s zRequestHandler.set_parsercCsdS)Nr.)rVr.r.r/ eof_received0szRequestHandler.eof_received)datarXc Cs|js |jrdS|jdkrT|jsT|jdk s2ty|j|\}}}Wntk r}z0|j | t ||jd||j |_ |Wdd}~XYntk r}z,|j | t ||jd||_ |Wdd}~XYntX|r:x.|D]&\}}|jd7_|j||fqW|j}|dk r:|s:|d||_|r|r||_nN|jdkr~|jr~|r~|j|7_n$|r|j|\} }| r|dS)Niir)rFrEr@r?rArlrqrrcrjhandle_parse_errorrmessager=rf Exceptionr0r:appendr<rdZ set_resultr;) rVrtmessagesZupgradedtailrmmsgpayloadwaitereofr.r.r/ data_received3s@     zRequestHandler.data_received)valrXcCs ||_|jr|jd|_dS)zMSet keep-alive connection mode. :param bool val: new state. N)r1r7r_)rVrr.r.r/ keep_aliveds zRequestHandler.keep_alivecCsd|_|jr|jdS)ziStop accepting new pipelinig messages and close connection when handlers done processing messagesTN)rEr<r_)rVr.r.r/rfnszRequestHandler.closecCs4d|_|jr|j|jdk r0|jd|_dS)zForce close connectionTN)rFr<r_r[rf)rVr.r.r/ force_closeus    zRequestHandler.force_close)requestresponsetimerXcCs(|jdk r$|j|||j|dS)N)rlogrcr)rVrrrr.r.r/ log_access~s zRequestHandler.log_access)argskwrXcOs|jr|jj||dS)N)rCrB)rVrrr.r.r/ log_debugszRequestHandler.log_debugcOs|jj||dS)N)rB exception)rVrrr.r.r/ log_exceptionszRequestHandler.log_exceptioncCsT|js |jsdS|j|j}|jr<|j|kr<|dS|j|j |j |_ dS)N) rFr1r6r8r<rcrrZ call_laterKEEPALIVE_RESCHEDULE_DELAY_process_keepaliver7)rVnextr.r.r/rs  z!RequestHandler._process_keepalive)r start_timerXc sL|jdk sty(z||_||IdH}Wdd|_XWntk r}z0t|j|j|j|jd}| |||IdH}Wdd}~XYnt j k rYnt j k r}z2|j d|d||d}| |||IdH}Wdd}~XYnZtk r.}z&||d|}| |||IdH}Wdd}~XYnX| |||IdH}||fS)N)statusreasontextheaderszRequest handler timed out.)exc_infoii)r3rlrGrr"rrrrfinish_responser`rarbr handle_errorrw)rVrrresprmresetr.r.r/_handle_requests* $ $&zRequestHandler._handle_requestc s|j}|j}|dk st|j}|dk s*t|j}d}|jdk sBt|jdk sPtx|jsh|jsz8y| |_ |j IdHWnt j k rPYnXWdd|_ X|j \}}|}|jd7_t||} ||||| |} zy`|j|| |} y| IdH\}} Wn(t j tfk r:|dPYnXt|ddrVtdt~ | rj|dPt|j|_|s<|j} |js| r|d| |}|| }tt jt j TxL|s ||kr t |||d |!IdHWdQRX|}qWWdQRX|s<|js<|d |"|#t$Wnt j k rn|d PYnzt%k r}z"|j&r|j'd |d |(Wdd}~XYn:t)k r}z|j'd|d |(Wdd}~XYnXWd|j*dkr|dk r|dnV|jsd|jrb|j+sb|dk rd|j}||_,|j-dkrd|.|||j/|_-nPXqTW|jsd|_|j*dk 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 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.)rQzUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exception)rzUnhandled exceptionz'Ignored premature client disconnection.)1rcr>rlr2r8r4r3rFr:Z create_futurer<r`rapopleftrZrequests_countrrjrConnectionErrorrgetattrwarningswarnDeprecationWarningboolrr1Zis_eofr9rrbrZreadanyrfZ set_exceptionr& RuntimeErrorrCrrrwr[rEr6r7Zcall_atrr=)rVrQhandlerrPrHrrvr|rkwriterrtaskrrNnowZend_trmr.r.r/rks                 zRequestHandler.start)rrrrXcs|jdk r6|jdd|_|jr6|j|jd|_y |j}Wn4tk rt|dkrbtdntd|YnXy ||IdH| IdHWn"t k r| |||dSX| |||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;rqprepareAttributeErrorrrZ write_eofrr)rVrrrZ prepare_methr.r.r/r4s,    zRequestHandler.finish_response)rrrmrvrXc Cs|jd|dd}|tjkrdtj}tjj}d}|jrVttt }WdQRXd|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 request)rz text/plainz{0.value} {0.phrase}Nz text/htmlAcceptz

Traceback:

z
zV{title}

{title}

{msg} )titler{z )rr content_typer)rrINTERNAL_SERVER_ERRORrZ descriptionrCrrw traceback format_excrget html_escaper"rrZ output_sizer[) rVrrrmrvctrr{tbrr.r.r/rXs0       zRequestHandler.handle_error)rrrmrvrXcsrt}|dk stttt||||j}|||||}||IdH|IdH|j dk rh|j d|_ dS)N) rrlr!ERRORrrcrrrr[rfr=)rVrrrmrvrrrr.r.r/rus   z!RequestHandler.handle_parse_error)r])rNN)NN)3r*r+r,r-r __slots__rr rZ LOG_FORMATr`ZAbstractEventLooprUrrr rstrintrTr\propertyrHr rgZ BaseTransportrh BaseExceptionrnrrrrsbytesrrrfrr!r#rrrrr rrkrrrru __classcell__r.r.)rWr/r$AsZ&!87  " 1  y%-)Br`Zasyncio.streamsrr collectionsr contextlibrhtmlrrhttprloggingrtypingrrr r r r r rZyarlabcrrZ base_protocolrZhelpersrrrrrrrrrrZstreamsrrZ tcp_helpersrZweb_exceptionsrZweb_logr Z web_requestr!Z web_responser"r#__all__Z web_serverr'Z_RequestFactoryZ_RequestHandlerURLrrwr%r&r$r.r.r.r/sJ     (