o ?Og:@s dgZddlZddlZddlZedZedZGdddeZddZ d d Z d dZ Gd d d Z GdddZ GdddZGdddZGdddZddZddZddZddZddZd d!Zd"d#Zd$d%ZdS)& validatorNz^[a-zA-Z][a-zA-Z0-9\-_]*$z [\000-\037]c@s eZdZdS) WSGIWarningN)__name__ __module__ __qualname__rr7/opt/alt/python310/lib64/python3.10/wsgiref/validate.pyrysrcGs|st|dSN)AssertionError)Zcondargsrrrassert_~sr cCs$t|tur|Std|t|)Nz!{0} must be of type str (got {1}))typestrr formatrepr)valuetitlerrrcheck_string_types rcs fdd}|S)Ncstt|dkdt| d|\}t|gfdd}t|d|d<t|d|d<||}t|duo=|dkd t|t|S) NzTwo arguments requiredNo keyword arguments allowedcstt|dkp t|dkd|ft| d|d}|d}t|dkr+|d}nd}t|t|t||t|dt|S)NrzInvalid number of arguments: %srr)r len check_status check_headerscheck_content_typecheck_exc_infoappend WriteWrapper)r kwstatusheadersexc_infoZstart_responseZstart_response_startedrrstart_response_wrappers      z;validator..lint_app..start_response_wrapper wsgi.input wsgi.errorsFz>The application must return an iterator, if only an empty list)r r check_environ InputWrapper ErrorWrappercheck_iteratorIteratorWrapper)r renvironr$iterator applicationr#rlint_apps   zvalidator..lint_appr)r/r0rr.rrs )c@s<eZdZddZddZddZddZd d Zd d Zd S)r(cC ||_dSr )input)self wsgi_inputrrr__init__ zInputWrapper.__init__cGs0tt|dk|jj|}tt|tu|SNr)r rr2readr bytesr3r vrrrr8 zInputWrapper.readcGs0tt|dk|jj|}tt|tu|Sr7)r rr2readliner r9r:rrrr=r<zInputWrapper.readlinecGsJtt|dk|jj|}tt|tu|D] }tt|tuq|Sr7)r rr2 readlinesr listr9)r3r lineslinerrrr>s  zInputWrapper.readlinesccs |}|s dS|Vqr )r=)r3rArrr__iter__szInputWrapper.__iter__cCtdddS)Nrz input.close() must not be calledr r3rrrclosezInputWrapper.closeN) rrrr5r8r=r>rBrFrrrrr(s r(c@4eZdZddZddZddZddZd d Zd S) r)cCr1r )errors)r3 wsgi_errorsrrrr5r6zErrorWrapper.__init__cCs tt|tu|j|dSr )r r rrIwriter3srrrrKszErrorWrapper.writecCs|jdSr )rIflushrErrrrNrGzErrorWrapper.flushcCs|D]}||qdSr )rK)r3seqrArrr writeliness zErrorWrapper.writelinescCrC)Nrz!errors.close() must not be calledrDrErrrrFrGzErrorWrapper.closeN)rrrr5rKrNrPrFrrrrr)s  r)c@eZdZddZddZdS)rcCr1r )writer)r3Z wsgi_writerrrrr5r6zWriteWrapper.__init__cCstt|tu||dSr )r r r9rRrLrrr__call__szWriteWrapper.__call__N)rrrr5rSrrrrr rc@rQ)PartialIteratorWrappercCr1r r-)r3 wsgi_iteratorrrrr5r6zPartialIteratorWrapper.__init__cCs t|jdSr )r+r-rErrrrBs zPartialIteratorWrapper.__iter__N)rrrr5rBrrrrrUrTrUc@rH) r+cCs ||_t||_d|_||_dS)NF)original_iteratoriterr-closedcheck_start_response)r3rWr[rrrr5 s  zIteratorWrapper.__init__cCs|Sr rrErrrrBszIteratorWrapper.__iter__cCsTt|j dt|j}t|turtdd|f|jdur(t|jdd|_|S)NzIterator read after closedFz$Iterator yielded non-bytestring (%r)zjThe application returns and we started iterating over its body, but start_response has not yet been called)r rZnextr-r r9r[)r3r;rrr__next__s   zIteratorWrapper.__next__cCs$d|_t|jdr|jdSdS)NTrF)rZhasattrrXrFrErrrrFs zIteratorWrapper.closecCs"|js tjdt|jddS)Nz/Iterator garbage collected without being closed)rZsysstderrrKr rErrr__del__#szIteratorWrapper.__del__N)rrrr5rBr]rFrarrrrr+s  r+cCstt|tudt||fdD] }t||vd|fqdD]}t||vd||ddfq d|vrrBz-wsgi.input (%r) doesn't have the attribute %sr r^)r4attrrrrrlk rlcCrr)N)rNrKrPz.wsgi.errors (%r) doesn't have the attribute %srs)rJrtrrrrmqrurmcCszt|d}|ddd}tt|dkd|t|}t|dkd|t|dks1|dd kr;td |tdSdS) NStatusrrrz)Status codes must be three characters: %rdzStatus code is invalid: %r zjThe status string (%r) should be a three-digit integer followed by a single space and a status explanation)rsplitr rrprhrir)r Z status_codeZ status_intrrrrws  rcCstt|tud|t|f|D]n}tt|tud|t|ftt|dk|\}}t|d}t|d}t|dkd|td|voKd |vd |tt|d |t| d  of| d  d|t |rtdd|t | dfqdS)Nz%Headers (%r) must be of type list: %rz1Individual headers (%r) must be of type tuple: %rr Header namez Header valuer zyThe Status header cannot be used; it conflicts with CGI script, and HTTP status is not given through headers (value: %r). :z,Header names may not contain ':' or '\n': %rzBad header name: %r-_z#Names may not end in '-' or '_': %rrz#Bad header value: %r (bad char: %r)) r r r?rkrrlower header_researchendswithbad_header_value_regroup)r!itemnamerrrrrsB        rcCst|d}t|ddd}d}|D]\}}t|d}|dkr0||vr)dStdd|q||vr>tdd|dSdS) Nrvrr)i0r{z content-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))rrprzrr )r r!codeZNO_MESSAGE_BODYrrrrrrs    rcCs*t|dup t|tud|t|fdS)Nz exc_info (%r) is not a tuple: %r)r r rk)r"rrrrsrcCstt|ttf ddS)NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r isinstancerr9rVrrrr*sr*)__all__rer_rhcompilerrWarningrr rrr(r)rrUr+r'rlrmrrrrr*rrrrs0j  7#  #A