관리-도구
편집 파일: validate.cpython-39.opt-1.pyc
a �����DOg�:����������������������@���s����d�Z�dgZddlZddlZddlZe�d�Ze�d�ZG�dd��de�Z dd ��Z d d��Zdd��ZG�d d��d�Z G�dd��d�ZG�dd��d�ZG�dd��d�ZG�dd��d�Zdd��Zdd��Zdd��Zdd��Zdd ��Zd!d"��Zd#d$��Zd%d&��ZdS�)'a&�� Middleware to check for obedience to the WSGI specification. Some of the things this checks: * Signature of the application and start_response (including that keyword arguments are not used). * Environment checks: - Environment is a dictionary (and not a subclass). - That all the required keys are in the environment: REQUEST_METHOD, SERVER_NAME, SERVER_PORT, wsgi.version, wsgi.input, wsgi.errors, wsgi.multithread, wsgi.multiprocess, wsgi.run_once - That HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH are not in the environment (these headers should appear as CONTENT_LENGTH and CONTENT_TYPE). - Warns if QUERY_STRING is missing, as the cgi module acts unpredictably in that case. - That CGI-style variables (that don't contain a .) have (non-unicode) string values - That wsgi.version is a tuple - That wsgi.url_scheme is 'http' or 'https' (@@: is this too restrictive?) - Warns if the REQUEST_METHOD is not known (@@: probably too restrictive). - That SCRIPT_NAME and PATH_INFO are empty or start with / - That at least one of SCRIPT_NAME or PATH_INFO are set. - That CONTENT_LENGTH is a positive integer. - That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should be '/'). - That wsgi.input has the methods read, readline, readlines, and __iter__ - That wsgi.errors has the methods flush, write, writelines * The status is a string, contains a space, starts with an integer, and that integer is in range (> 100). * That the headers is a list (not a subclass, not another kind of sequence). * That the items of the headers are tuples of strings. * That there is no 'status' header (that is used in CGI, but not in WSGI). * That the headers don't contain newlines or colons, end in _ or -, or contain characters codes below 037. * That Content-Type is given if there is content (CGI often has a default content type, but WSGI does not). * That no Content-Type is given when there is no content (@@: is this too restrictive?) * That the exc_info argument to start_response is a tuple or None. * That all calls to the writer are with strings, and no other methods on the writer are accessed. * That wsgi.input is used properly: - .read() is called with exactly one argument - That it returns a string - That readline, readlines, and __iter__ return strings - That .close() is not called - No other methods are provided * That wsgi.errors is used properly: - .write() and .writelines() is called with a string - That .close() is not called, and no other methods are provided. * The response iterator: - That it is not a string (it should be a list of a single string; a string will work, but perform horribly). - That .__next__() returns a string - That the iterator is not iterated over until start_response has been called (that can signal either a server or application error). - That .close() is called (doesn't raise exception, only prints to sys.stderr, because we only know it isn't called when the object is garbage collected). � validator�����Nz^[a-zA-Z][a-zA-Z0-9\-_]*$z[\000-\037]c�������������������@���s���e�Zd�ZdZdS�)�WSGIWarningz: Raised in response to WSGI-spec-related warnings N)�__name__� __module__�__qualname__�__doc__��r���r����(/usr/lib64/python3.9/wsgiref/validate.pyr���y���s���r���c�����������������G���s���|�st�|���d�S��N)�AssertionError)�cond�argsr���r���r ����assert_~���s����r���c�����������������C���s(���t�|��tu�r|�S�td�|t|�����d�S�)Nz!{0} must be of type str (got {1}))�type�strr����format�repr)�value�titler���r���r ����check_string_type����s �����r���c��������������������s�����fdd�}|S�)a��� When applied between a WSGI server and a WSGI application, this middleware will check for WSGI compliance on a number of levels. This middleware does not modify the request or response in any way, but will raise an AssertionError if anything seems off (except for a failure to close the application iterator, which will be printed to stderr -- there's no way to raise an exception at that point). c���������������������s����t�t|��dkd��t�|�d��|�\}��t|��g�����fdd�}t|d��|d<�t|d��|d<��||�}t�|d�uoz|dkd ��t|��t|��S�) N����zTwo arguments required�No keyword arguments allowedc���������������������s����t�t|��dkpt|��dkd|�f���t�|�d��|�d�}|�d�}t|��dkrV|�d�}nd�}t|��t|��t||��t|����d���t��|����S�)Nr�������zInvalid number of arguments: %sr���r�������)r����len�check_status� check_headers�check_content_type�check_exc_info�append�WriteWrapper)r ����kw�status�headers�exc_info�Zstart_responseZstart_response_startedr���r ����start_response_wrapper����s����� z;validator.<locals>.lint_app.<locals>.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.<locals>.lint_appr���)r1���r2���r���r0���r ���r�������s����)c�������������������@���s<���e�Zd�Zdd��Zdd��Zdd��Zdd��Zd d ��Zdd��Zd S�)r*���c�����������������C���s ���||�_�d�S�r ���)�input)�self� wsgi_inputr���r���r ����__init__����s����zInputWrapper.__init__c�����������������G���s0���t�t|�dk��|�jj|��}t�t|�tu���|S��Nr���)r���r���r3����readr����bytes�r4���r ����vr���r���r ���r8�������s����zInputWrapper.readc�����������������G���s0���t�t|�dk��|�jj|��}t�t|�tu���|S�r7���)r���r���r3����readliner���r9���r:���r���r���r ���r<�������s����zInputWrapper.readlinec�����������������G���sJ���t�t|�dk��|�jj|��}t�t|�tu���|D�]}t�t|�tu���q0|S�r7���)r���r���r3���� readlinesr����listr9���)r4���r ����lines�liner���r���r ���r=�������s����zInputWrapper.readlinesc�����������������c���s���|�����}|sd�S�|V��q�d�S�r ���)r<���)r4���r@���r���r���r ����__iter__����s����zInputWrapper.__iter__c�����������������C���s���t�dd��d�S�)Nr���z input.close() must not be called�r����r4���r���r���r ����close����s����zInputWrapper.closeN) r���r���r���r6���r8���r<���r=���rA���rD���r���r���r���r ���r*�������s���r*���c�������������������@���s4���e�Zd�Zdd��Zdd��Zdd��Zdd��Zd d ��ZdS�)r+���c�����������������C���s ���||�_�d�S�r ���)�errors)r4����wsgi_errorsr���r���r ���r6�������s����zErrorWrapper.__init__c�����������������C���s ���t�t|�tu���|�j�|��d�S�r ���)r���r���r���rE����write�r4����sr���r���r ���rG�������s����zErrorWrapper.writec�����������������C���s���|�j�����d�S�r ���)rE����flushrC���r���r���r ���rJ�������s����zErrorWrapper.flushc�����������������C���s���|D�]}|���|��qd�S�r ���)rG���)r4����seqr@���r���r���r ���� writelines����s����zErrorWrapper.writelinesc�����������������C���s���t�dd��d�S�)Nr���z!errors.close() must not be calledrB���rC���r���r���r ���rD�������s����zErrorWrapper.closeN)r���r���r���r6���rG���rJ���rL���rD���r���r���r���r ���r+�������s ���r+���c�������������������@���s���e�Zd�Zdd��Zdd��ZdS�)r ���c�����������������C���s ���||�_�d�S�r ���)�writer)r4���Zwsgi_writerr���r���r ���r6�������s����zWriteWrapper.__init__c�����������������C���s���t�t|�tu���|��|��d�S�r ���)r���r���r9���rM���rH���r���r���r ����__call__����s����zWriteWrapper.__call__N)r���r���r���r6���rN���r���r���r���r ���r �������s���r ���c�������������������@���s���e�Zd�Zdd��Zdd��ZdS�)�PartialIteratorWrapperc�����������������C���s ���||�_�d�S�r ����r/���)r4���� wsgi_iteratorr���r���r ���r6������s����zPartialIteratorWrapper.__init__c�����������������C���s���t�|�jd��S�r ���)r-���r/���rC���r���r���r ���rA�����s����zPartialIteratorWrapper.__iter__N)r���r���r���r6���rA���r���r���r���r ���rO�������s���rO���c�������������������@���s4���e�Zd�Zdd��Zdd��Zdd��Zdd��Zd d ��ZdS�)r-���c�����������������C���s ���||�_�t|�|�_d|�_||�_d�S�)NF)�original_iterator�iterr/����closed�check_start_response)r4���rQ���rU���r���r���r ���r6��� ��s���� zIteratorWrapper.__init__c�����������������C���s���|�S�r ���r���rC���r���r���r ���rA�����s����zIteratorWrapper.__iter__c�����������������C���sT���t�|�j�d��t|�j�}t|�tur4t�dd|f���|�jd�urPt�|�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���rT����nextr/���r���r9���rU���)r4���r;���r���r���r ����__next__��s����� �zIteratorWrapper.__next__c�����������������C���s ���d|�_�t|�jd�r|�j����d�S�)NTrD���)rT����hasattrrR���rD���rC���r���r���r ���rD�����s����zIteratorWrapper.closec�����������������C���s"���|�j�stj�d��t|�j�d��d�S�)Nz/Iterator garbage collected without being closed)rT����sys�stderrrG���r���rC���r���r���r ����__del__#��s������zIteratorWrapper.__del__N)r���r���r���r6���rA���rW���rD���r[���r���r���r���r ���r-�����s ���r-���c�����������������C���s���t�t|��tu�dt|��|�f���dD�]}t�||�v�d|f���q"dD�]"}t�||�vd||dd���f���q@d|�vrxt�dt��|����D�]:}d |v�r�q�t�t|�|��tu�d |t|�|��|�|�f���q�t�t|�d��tu�d|�d�f���t�|�d �dv�d|�d ����t |�d���t |�d���|�d�dv�r0t�d|�d��t��t�|��d���pL|�d��d�d|�d����t�|��d���pv|�d��d�d|�d����|��d��r�t�t |�d��dkd|�d����|��d��s�t�d|�v�d��t�|��d�dkd��d�S�)Nz:Environment is not of the right type: %r (environment: %r)) �REQUEST_METHODZSERVER_NAMEZSERVER_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)����ZQUERY_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: %rZSCRIPT_NAME�/z$SCRIPT_NAME doesn't start with /: %rZ PATH_INFOz"PATH_INFO doesn't start with /: %rZCONTENT_LENGTHr���zInvalid 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.����keyr���r���r ���r)���*��sx���� ��������� � � � � ���r)���c�����������������C���s&���dD�]}t�t|�|�d|�|f���qd�S�)N)r8���r<���r=���rA���z-wsgi.input (%r) doesn't have the attribute %s�r���rX���)r5����attrr���r���r ���rj���k��s���� ��rj���c�����������������C���s&���dD�]}t�t|�|�d|�|f���qd�S�)N)rJ���rG���rL���z.wsgi.errors (%r) doesn't have the attribute %srp���)rF���rq���r���r���r ���rk���q��s���� ��rk���c�����������������C���sv���t�|�d�}�|��d�d�d�}tt|�dkd|���t|�}t|dkd|���t|��dk�sb|�d�d krrt�d |��t��d�S�)N�Statusr���r���r���z)Status codes must be three characters: %r�d���zStatus 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���r���rn���rf���rg���r���)r"���Zstatus_codeZ status_intr���r���r ���r���w��s���� ���r���c�����������������C���s��t�t|��tu�d|�t|��f���|�D�]�}t�t|�tu�d|t|�f���t�t|�dk��|\}}t|d�}t|d�}t�|���dkd|���t�d|vo�d |vd |���t�t�|�d|���t�|� d��o�|� d ��d|���t �|�r"t�dd|t �|��d�f���q"d�S�)Nz%Headers (%r) must be of type list: %rz1Individual headers (%r) must be of type tuple: %rr����Header namezHeader 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 '_': %rr���z#Bad header value: %r (bad char: %r))r���r���r>���ri���r���r����lower� header_re�search�endswith�bad_header_value_re�group)r#����item�namer���r���r���r ���r������s>���� �� �� ���� �r���c�����������������C���s|���t�|�d�}�t|��d�d�d��}d}|D�]:\}}t�|d�}|���dkr&||vrR�d�S�tdd|���q&||vrxtdd|���d�S�) Nrr���r���r���)�����i0��rw���zcontent-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))r���rn���rv���r|���r���)r"���r#����codeZNO_MESSAGE_BODYr����r���r���r���r ���r������s���� �r���c�����������������C���s*���t�|�d�u�pt|��tu�d|�t|��f���d�S�)Nz exc_info (%r) is not a tuple: %r)r���r���ri���)r$���r���r���r ���r������s�����r���c�����������������C���s���t�t|�ttf��d��d�S�)NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r���� isinstancer���r9���rP���r���r���r ���r,������s�����r,���)r����__all__�rerY���rf����compiler}���r�����Warningr���r���r���r���r*���r+���r ���rO���r-���r)���rj���rk���r���r���r���r���r,���r���r���r���r ����<module>���s.���j 7# #A