a ´iû:ã@sädgZddlZddlZddlZe d¡Ze d¡ZGdd„deƒZdd„Z d d „Z d d„Z Gd d „d ƒZ Gdd„dƒZ Gdd„dƒZGdd„dƒZGdd„dƒZdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„ZdS)&Ú validatoréNz^[a-zA-Z][a-zA-Z0-9\-_]*$z [\000-\037]c@s eZdZdS)Ú WSGIWarningN)Ú__name__Ú __module__Ú __qualname__©rrú(/usr/lib64/python3.9/wsgiref/validate.pyrysrcGs|s t|Ž‚dS©N)ÚAssertionError)ÚcondÚargsrrrÚassert_~sr cCs(t|ƒtur|Std |t|ƒ¡ƒ‚dS)Nz!{0} must be of type str (got {1}))ÚtypeÚstrr ÚformatÚrepr)ÚvalueÚtitlerrrÚcheck_string_type‚s  ÿrcs‡fdd„}|S)Ncs’tt|ƒdkdƒt| dƒ|\}‰t|ƒg‰‡‡fdd„}t|dƒ|d<t|dƒ|d<ˆ||ƒ}t|duoz|dkd ƒt|ƒt|ˆƒS) NézTwo arguments requiredúNo keyword arguments allowedcs’tt|ƒdkpt|ƒdkd|fƒt| dƒ|d}|d}t|ƒdkrV|d}nd}t|ƒt|ƒt||ƒt|ƒˆ d¡tˆ|ŽƒS)NrézInvalid number of arguments: %srré)r ÚlenÚ check_statusÚ check_headersÚcheck_content_typeÚcheck_exc_infoÚappendÚ WriteWrapper)r ÚkwÚstatusÚheadersÚexc_info©Zstart_responseZstart_response_startedrrÚstart_response_wrapperŸsÿ     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Ú ErrorWrapperÚcheck_iteratorÚIteratorWrapper)r r Úenvironr%Úiterator©Ú applicationr$rÚlint_app”s  ÿzvalidator..lint_appr)r0r1rr/rrˆs )c@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)r)cCs ||_dSr )Úinput)ÚselfÚ wsgi_inputrrrÚ__init__ÁszInputWrapper.__init__cGs0tt|ƒdkƒ|jj|Ž}tt|ƒtuƒ|S©Nr)r rr2ÚreadrÚbytes©r3r Úvrrrr7Äs zInputWrapper.readcGs0tt|ƒdkƒ|jj|Ž}tt|ƒtuƒ|Sr6)r rr2Úreadlinerr8r9rrrr;Ês zInputWrapper.readlinecGsJtt|ƒdkƒ|jj|Ž}tt|ƒtuƒ|D]}tt|ƒtuƒq0|Sr6)r rr2Ú readlinesrÚlistr8)r3r ÚlinesÚlinerrrr<Ðs  zInputWrapper.readlinesccs| ¡}|sdS|VqdSr )r;)r3r?rrrÚ__iter__ØszInputWrapper.__iter__cCstddƒdS)Nrz input.close() must not be called©r ©r3rrrÚcloseßszInputWrapper.closeN) rrrr5r7r;r<r@rCrrrrr)¿s r)c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) r*cCs ||_dSr )Úerrors)r3Ú wsgi_errorsrrrr5äszErrorWrapper.__init__cCs tt|ƒtuƒ|j |¡dSr )r rrrDÚwrite©r3ÚsrrrrFçszErrorWrapper.writecCs|j ¡dSr )rDÚflushrBrrrrIëszErrorWrapper.flushcCs|D]}| |¡qdSr )rF)r3Úseqr?rrrÚ writelinesîszErrorWrapper.writelinescCstddƒdS)Nrz!errors.close() must not be calledrArBrrrrCòszErrorWrapper.closeN)rrrr5rFrIrKrCrrrrr*âs r*c@seZdZdd„Zdd„ZdS)rcCs ||_dSr )Úwriter)r3Z wsgi_writerrrrr5÷szWriteWrapper.__init__cCstt|ƒtuƒ| |¡dSr )r rr8rLrGrrrÚ__call__úszWriteWrapper.__call__N)rrrr5rMrrrrrõsrc@seZdZdd„Zdd„ZdS)ÚPartialIteratorWrappercCs ||_dSr ©r.)r3Ú wsgi_iteratorrrrr5szPartialIteratorWrapper.__init__cCs t|jdƒSr )r,r.rBrrrr@szPartialIteratorWrapper.__iter__N)rrrr5r@rrrrrNþsrNc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) r,cCs ||_t|ƒ|_d|_||_dS)NF)Úoriginal_iteratorÚiterr.ÚclosedÚcheck_start_response)r3rPrTrrrr5 s zIteratorWrapper.__init__cCs|Sr rrBrrrr@szIteratorWrapper.__iter__cCsTt|j dƒt|jƒ}t|ƒtur4tdd|fƒ|jdurPt|jdƒd|_|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 rSÚnextr.rr8rT)r3r:rrrÚ__next__sÿ   ÿzIteratorWrapper.__next__cCs d|_t|jdƒr|j ¡dS)NTrC)rSÚhasattrrQrCrBrrrrCs zIteratorWrapper.closecCs"|jstj d¡t|jdƒdS)Nz/Iterator garbage collected without being closed)rSÚsysÚstderrrFr rBrrrÚ__del__#sÿÿzIteratorWrapper.__del__N)rrrr5r@rVrCrZrrrrr,s  r,cCsàtt|ƒtudt|ƒ|fƒdD]}t||vd|fƒq"dD]"}t||vd||dd…fƒq@d|vrxt dt¡| ¡D]:}d |vrŽq€tt||ƒtud |t||ƒ||fƒq€tt|d ƒtud |d fƒt|d dvd|d ƒt |dƒt |dƒ|ddvr0t d|dt¡t|  d¡ pL|d  d¡d|dƒt|  d¡ pv|d  d¡d|dƒ|  d¡r®tt |dƒdkd|dƒ|  d¡sÈtd|vdƒt|  d¡dkdƒdS)Nz:Environment is not of the right type: %r (environment: %r)) ÚREQUEST_METHODZ SERVER_NAMEZ SERVER_PORTú wsgi.versionr&r'zwsgi.multithreadzwsgi.multiprocessz wsgi.run_oncez$Environment missing required key: %r)ZHTTP_CONTENT_TYPEZHTTP_CONTENT_LENGTHz8Environment should not have the key: %s (use %s instead)éZ QUERY_STRINGz’QUERY_STRING is not in the WSGI environment; the cgi module will use sys.argv when this variable is missing, so application errors are more likelyÚ.z9Environmental variable %s is not a string: %r (value: %r)r\z#wsgi.version should be a tuple (%r)zwsgi.url_scheme)ÚhttpÚhttpszwsgi.url_scheme unknown: %rr&r'r[)ÚGETZHEADZPOSTZOPTIONSZPATCHÚPUTZDELETEZTRACEzUnknown REQUEST_METHOD: %rZ SCRIPT_NAMEú/z$SCRIPT_NAME doesn't start with /: %rZ PATH_INFOz"PATH_INFO doesn't start with /: %rZCONTENT_LENGTHrzInvalid CONTENT_LENGTH: %rzgOne of SCRIPT_NAME or PATH_INFO are required (PATH_INFO should at least be '/' if SCRIPT_NAME is empty)zOSCRIPT_NAME cannot be '/'; it should instead be '', and PATH_INFO should be '/')r rÚdictÚwarningsÚwarnrÚkeysrÚtupleÚ check_inputÚ check_errorsÚgetÚ startswithÚint)r-Úkeyrrrr(*sx  ÿÿÿÿÿü ÿÿ ÿ  ÿ   þ  þ  þ  ÿ ÿÿr(cCs&dD]}tt||ƒd||fƒqdS)N)r7r;r<r@z-wsgi.input (%r) doesn't have the attribute %s©r rW)r4Úattrrrrriks  ÿÿricCs&dD]}tt||ƒd||fƒqdS)N)rIrFrKz.wsgi.errors (%r) doesn't have the attribute %sro)rErprrrrjqs  ÿÿrjcCsvt|dƒ}| dd¡d}tt|ƒdkd|ƒt|ƒ}t|dkd|ƒt|ƒdksb|dd krrt d |t¡dS) NÚStatusrrrz)Status codes must be three characters: %rédzStatus code is invalid: %réú zjThe status string (%r) should be a three-digit integer followed by a single space and a status explanation)rÚsplitr rrmrerfr)r!Z status_codeZ status_intrrrrws  ÿþýrcCstt|ƒtud|t|ƒfƒ|D]Ü}tt|ƒtud|t|ƒfƒtt|ƒdkƒ|\}}t|dƒ}t|dƒ}t| ¡dkd|ƒtd|vo–d |vd |ƒtt |¡d |ƒt|  d ¡ oÌ|  d ¡ d|ƒt  |¡r"tdd|t  |¡  d¡fƒq"dS)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 rr=rhrrÚlowerÚ header_reÚsearchÚendswithÚbad_header_value_reÚgroup)r"ÚitemÚnamerrrrr…s>  ÿÿ  ÿÿ   þÿÿÿ ÿrcCs|t|dƒ}t| dd¡dƒ}d}|D]:\}}t|dƒ}| ¡dkr&||vrRdStdd|ƒq&||vrxtdd|ƒdS) Nrqrr)éÌi0rvz content-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))rrmrur{r )r!r"ÚcodeZNO_MESSAGE_BODYr‚rrrrržs    ÿrcCs*t|dupt|ƒtud|t|ƒfƒdS)Nz exc_info (%r) is not a tuple: %r)r rrh)r#rrrr®sÿrcCstt|ttfƒ dƒdS)NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r Ú isinstancerr8rOrrrr+³sÿr+)Ú__all__ÚrerXreÚcompiler|rÚWarningrr rrr)r*rrNr,r(rirjrrrrr+rrrrÚos,  7#  #A