U e5dû:ã@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.8/wsgiref/validate.pyrysrcGs|s t|Ž‚dS©N)ÚAssertionError)ZcondÚargsrrrÚassert_~sr cCs(t|ƒtkr|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|dk oz|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)r/r0rr.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|ƒtkƒ|S©Nr)r rr1Úreadr Úbytes©r2r Úvrrrr6Äs zInputWrapper.readcGs0tt|ƒdkƒ|jj|Ž}tt|ƒtkƒ|Sr5)r rr1Úreadliner r7r8rrrr:Ês zInputWrapper.readlinecGsJtt|ƒdkƒ|jj|Ž}tt|ƒtkƒ|D]}tt|ƒtkƒq0|Sr5)r rr1Ú readlinesr Úlistr7)r2r ÚlinesÚlinerrrr;Ðs  zInputWrapper.readlinesccs| ¡}|sdS|VqdSr )r:)r2r>rrrÚ__iter__ØszInputWrapper.__iter__cCstddƒdS)Nrz input.close() must not be called©r ©r2rrrÚcloseßszInputWrapper.closeN) rrrr4r6r:r;r?rBrrrrr(¿s r(c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) r)cCs ||_dSr )Úerrors)r2Ú wsgi_errorsrrrr4äszErrorWrapper.__init__cCs tt|ƒtkƒ|j |¡dSr )r r rrCÚwrite©r2ÚsrrrrEçszErrorWrapper.writecCs|j ¡dSr )rCÚflushrArrrrHëszErrorWrapper.flushcCs|D]}| |¡qdSr )rE)r2Úseqr>rrrÚ writelinesîszErrorWrapper.writelinescCstddƒdS)Nrz!errors.close() must not be calledr@rArrrrBòszErrorWrapper.closeN)rrrr4rErHrJrBrrrrr)âs r)c@seZdZdd„Zdd„ZdS)rcCs ||_dSr )Úwriter)r2Z wsgi_writerrrrr4÷szWriteWrapper.__init__cCstt|ƒtkƒ| |¡dSr )r r r7rKrFrrrÚ__call__úszWriteWrapper.__call__N)rrrr4rLrrrrrõsrc@seZdZdd„Zdd„ZdS)ÚPartialIteratorWrappercCs ||_dSr ©r-)r2Ú wsgi_iteratorrrrr4szPartialIteratorWrapper.__init__cCs t|jdƒSr )r+r-rArrrr?szPartialIteratorWrapper.__iter__N)rrrr4r?rrrrrMþsrMc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) r+cCs ||_t|ƒ|_d|_||_dS)NF)Úoriginal_iteratorÚiterr-ÚclosedÚcheck_start_response)r2rOrSrrrr4 s zIteratorWrapper.__init__cCs|Sr rrArrrr?szIteratorWrapper.__iter__cCsTt|j dƒt|jƒ}t|ƒtk r4tdd|fƒ|jdk rPt|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 rRÚnextr-r r7rS)r2r9rrrÚ__next__sÿ   ÿzIteratorWrapper.__next__cCs d|_t|jdƒr|j ¡dS)NTrB)rRÚhasattrrPrBrArrrrBs zIteratorWrapper.closecCs"|jstj d¡t|jdƒdS)Nz/Iterator garbage collected without being closed)rRÚsysÚstderrrEr rArrrÚ__del__#sÿÿzIteratorWrapper.__del__N)rrrr4r?rUrBrYrrrrr+s  r+cCsàtt|ƒtkdt|ƒ|fƒdD]}t||kd|fƒq"dD]"}t||kd||dd…fƒq@d|krxt dt¡| ¡D]:}d |krŽq€tt||ƒtkd |t||ƒ||fƒq€tt|d ƒtkd |d fƒt|d dkd|d ƒt |dƒt |dƒ|ddk�r0t 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|kdƒ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)ZhttpZhttpszwsgi.url_scheme unknown: %rr%r&rZ)ZGETZHEADZPOSTZOPTIONSZPATCHZPUTZDELETEZTRACEzUnknown 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)r6r:r;r?z-wsgi.input (%r) doesn't have the attribute %s©r rV)r3Úattrrrrrdks  ÿÿrdcCs&dD]}tt||ƒd||fƒqdS)N)rHrErJz.wsgi.errors (%r) doesn't have the attribute %srj)rDrkrrrreqs  ÿÿrecCsvt|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 rrhr`rar)r Z status_codeZ status_intrrrrws  ÿþýrcCstt|ƒtkd|t|ƒfƒ|D]Ü}tt|ƒtkd|t|ƒfƒtt|ƒdkƒ|\}}t|dƒ}t|dƒ}t| ¡dkd|ƒtd|ko–d |kd |ƒ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 r r<rcrrÚ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&||krRdStdd|ƒq&||krxtdd|ƒdS) Nrlrr)éÌi0rqz content-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))rrhrprvr )r r!ÚcodeZNO_MESSAGE_BODYr}rrrrržs    ÿrcCs*t|dkpt|ƒtkd|t|ƒfƒdS)Nz exc_info (%r) is not a tuple: %r)r r rc)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 Ú isinstancerr7rNrrrr*³sÿr*)Ú__all__ÚrerWr`ÚcompilerwrzÚWarningrr rrr(r)rrMr+r'rdrerrrrr*rrrrÚos,  7#  #A