Your IP : 3.146.255.161


Current Path : /opt/alt/python311/lib64/python3.11/wsgiref/__pycache__/
Upload File :
Current File : //opt/alt/python311/lib64/python3.11/wsgiref/__pycache__/validate.cpython-311.opt-1.pyc

�

c��f�:��H�dZdgZddlZddlZddlZejd��Zejd��ZGd�de��Z	d�Z
d	�Zd
�ZGd�d��Z
Gd
�d��ZGd�d��ZGd�d��ZGd�d��Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�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��eZdZdZdS)�WSGIWarningz:
    Raised in response to WSGI-spec-related warnings
    N)�__name__�
__module__�__qualname__�__doc__���7/opt/alt/python311/lib64/python3.11/wsgiref/validate.pyrrys���������rrc��|s	t|��dS�N)�AssertionError)�cond�argss  r�assert_r~s���$��d�#�#�$�$rc��t|��tur|Std�|t	|�������)Nz!{0} must be of type str (got {1}))�type�strr�format�repr)�value�titles  r�check_string_typer�sF���U�|�|�s�����
�+�2�2�5�$�u�+�+�F�F�H�H�Hrc����fd�}|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�����tt|��dkd��t|d��|\}�t|��g���fd�}t|d��|d<t	|d��|d<�||��}t|duo|dkd��t|��t
|���S)	N�zTwo arguments required�No keyword arguments allowedc���tt|��dkpt|��dkd|����t|d��|d}|d}t|��dkr	|d}nd}t|��t|��t	||��t|����d��t�|���S)Nr�zInvalid number of arguments: rr�)r�len�check_status�
check_headers�check_content_type�check_exc_info�append�WriteWrapper)r�kw�status�headers�exc_info�start_response�start_response_starteds     ��r�start_response_wrapperz;validator.<locals>.lint_app.<locals>.start_response_wrapper�s�����C��I�I��N�4�c�$�i�i�1�n��59�T�;�
>�
>�
>���F�:�;�;�;��!�W�F��1�g�G��4�y�y�A�~�~���7������� � � ��'�"�"�"��v�w�/�/�/��8�$�$�$�"�)�)�$�/�/�/����� 5�6�6�6r�
wsgi.input�wsgi.errorsFz>The application must return an iterator, if only an empty list)rr"�
check_environ�InputWrapper�ErrorWrapper�check_iterator�IteratorWrapper)rr)�environr/�iteratorr-r.�applications     @@�r�lint_appzvalidator.<locals>.lint_app�s��������D�	�	�Q�� 8�9�9�9��B��6�7�7�7�"&�����g����"$��	7�	7�	7�	7�	7�	7�&!-�W�\�-B� C� C����!-�g�m�.D�!E�!E��
���;�w�(>�?�?�����$�:��U�):�L�	N�	N�	N�	�x� � � ��x�)?�@�@�@rr
)r9r:s` rrr�s)���'A�'A�'A�'A�'A�R�Orc�2�eZdZd�Zd�Zd�Zd�Zd�Zd�ZdS)r3c��||_dSr)�input)�self�
wsgi_inputs  r�__init__zInputWrapper.__init__�s
����
�
�
rc��tt|��dk��|jj|�}tt	|��t
u��|S�Nr!)rr"r=�readr�bytes�r>r�vs   rrCzInputWrapper.read�sH����D�	�	�Q������D�J�O�T�"����Q���5� �!�!�!��rc��tt|��dk��|jj|�}tt	|��t
u��|SrB)rr"r=�readlinerrDrEs   rrHzInputWrapper.readline�sI����D�	�	�Q������D�J���&����Q���5� �!�!�!��rc��tt|��dk��|jj|�}tt	|��t
u��|D]%}tt	|��tu���&|SrB)rr"r=�	readlinesr�listrD)r>r�lines�lines    rrJzInputWrapper.readlines�st����D�	�	�Q�����$��
�$�d�+����U���t�#�$�$�$��	)�	)�D��D��J�J�%�'�(�(�(�(��rc#�BK�	|���}|sdS|V��r)rH)r>rMs  r�__iter__zInputWrapper.__iter__�s3����	��=�=�?�?�D��
����J�J�J�		rc�&�tdd��dS)Nrz input.close() must not be called�r�r>s r�closezInputWrapper.close�s����5�6�6�6�6�6rN)	rrrr@rCrHrJrOrSr
rrr3r3�sn������ � � �������������7�7�7�7�7rr3c�,�eZdZd�Zd�Zd�Zd�Zd�ZdS)r4c��||_dSr)�errors)r>�wsgi_errorss  rr@zErrorWrapper.__init__��
��!����rc��tt|��tu��|j�|��dSr)rrrrV�write�r>�ss  rrZzErrorWrapper.write�s6����Q���3���������!�����rc�8�|j���dSr)rV�flushrRs rr^zErrorWrapper.flush�s����������rc�:�|D]}|�|���dSr)rZ)r>�seqrMs   r�
writelineszErrorWrapper.writelines�s0���	�	�D��J�J�t�����	�	rc�&�tdd��dS)Nrz!errors.close() must not be calledrQrRs rrSzErrorWrapper.close�s����6�7�7�7�7�7rN)rrrr@rZr^rarSr
rrr4r4�s_������"�"�"����������8�8�8�8�8rr4c��eZdZd�Zd�ZdS)r(c��||_dSr)�writer)r>�wsgi_writers  rr@zWriteWrapper.__init__�rXrc�v�tt|��tu��|�|��dSr)rrrDrer[s  r�__call__zWriteWrapper.__call__�s.����Q���5� �!�!�!����A�����rN)rrrr@rhr
rrr(r(�s2������"�"�"�����rr(c��eZdZd�Zd�ZdS)�PartialIteratorWrapperc��||_dSr�r8)r>�
wsgi_iterators  rr@zPartialIteratorWrapper.__init__s
��%��
�
�
rc�,�t|jd��Sr)r6r8rRs rrOzPartialIteratorWrapper.__iter__s���t�}�d�3�3�3rN)rrrr@rOr
rrrjrj�s2������&�&�&�4�4�4�4�4rrjc�,�eZdZd�Zd�Zd�Zd�Zd�ZdS)r6c�X�||_t|��|_d|_||_dS)NF)�original_iterator�iterr8�closed�check_start_response)r>rmrts   rr@zIteratorWrapper.__init__	s.��!.����]�+�+��
����$8��!�!�!rc��|Srr
rRs rrOzIteratorWrapper.__iter__s���rc���t|jd��t|j��}t	|��t
urtdd|�d���|j�t|jd��d|_|S)NzIterator read after closedFz!Iterator yielded non-bytestring (�)zjThe application returns and we started iterating over its body, but start_response has not yet been called)rrs�nextr8rrDrt)r>rFs  r�__next__zIteratorWrapper.__next__s����D�K��(�	*�	*�	*���������7�7�%����E�E�Q�Q�Q�H�I�I�I��$�0��D�-�|�
~�
~�
~�(,�D�%��rc�t�d|_t|jd��r|j���dSdS)NTrS)rs�hasattrrqrSrRs rrSzIteratorWrapper.closesC������4�)�7�3�3�	+��"�(�(�*�*�*�*�*�	+�	+rc�|�|jstj�d��t	|jd��dS)Nz/Iterator garbage collected without being closed)rs�sys�stderrrZrrRs r�__del__zIteratorWrapper.__del__#sP���{�	C��J���A�
C�
C�
C����=�	?�	?�	?�	?�	?rN)rrrr@rOryrSrr
rrr6r6s_������9�9�9����
�
�
�+�+�+�
?�?�?�?�?rr6c��tt|��tudt|���d|�d���dD]}t||vd|�����dD]#}t||vd|�d|d	d��d
����$d|vrtjdt
��|���D]T}d
|vr�tt||��tud|�dt||���d||�d����Utt|d��tud|d�d���t|ddvd|dz��t|d��t|d��|ddvr#tjd|dzt
��t|�d��p|d�d��d|dz��t|�d��p|d�d��d|dz��|�d ��r0tt|d ��d!kd"|d z��|�d��std|vd#��t|�d��dkd$��dS)%Nz&Environment is not of the right type: z (environment: rw)	�REQUEST_METHOD�SERVER_NAME�SERVER_PORT�wsgi.versionr0r1zwsgi.multithreadzwsgi.multiprocessz
wsgi.run_oncez"Environment missing required key: )�HTTP_CONTENT_TYPE�HTTP_CONTENT_LENGTHz%Environment should not have the key: z (use �z	 instead)�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�.zEnvironmental variable z is not a string: z	 (value: r�z wsgi.version should be a tuple (zwsgi.url_scheme)�http�httpszwsgi.url_scheme unknown: %rr0r1r�)�GET�HEAD�POST�OPTIONS�PATCH�PUT�DELETE�TRACEzUnknown REQUEST_METHOD: %r�SCRIPT_NAME�/z$SCRIPT_NAME doesn't start with /: %r�	PATH_INFOz"PATH_INFO doesn't start with /: %r�CONTENT_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 '/')rr�dict�warnings�warnr�keysr�tuple�check_input�check_errors�get�
startswith�int)r7�keys  rr2r2*s����D��M�M�T�!�!���=�=�=�=�'�'�'�	#�$�$�$�!�=�=��	��w���69�c�;�	=�	=�	=�	=�<�1�1����7�"�"�"%�#�#�s�1�2�2�w�w�w�
0�	1�	1�	1�	1��W�$�$��
�
4�
�		�	�	��|�|�~�~�7�7���#�:�:����W�S�\�"�"�c�)�)��s�s�D����&�&�&�&������
6�	7�	7�	7�	7��D���(�)�)�U�2�2�18��1H�1H�1H�J�L�L�L��G�%�&�*;�;�%��0A�(B�B�D�D�D����%�&�&�&����'�(�(�(��� �)M�M�M��
�(�7�3C�+D�D��	�	�	�����M�*�*�*�
6��}�%�0�0��5�5�.���1G�G�I�I�I�����K�(�(�(�
4��{�#�.�.�s�3�3�,�w�{�/C�C�E�E�E��{�{�#�$�$�F���G�,�-�.�.�!�3�(�7�3C�+D�D�	F�	F�	F��;�;�}�%�%�?���w�&�
>�	?�	?�	?��G�K�K�
�&�&�#�-�	"�#�#�#�#�#rc�X�dD]&}tt||��d|�d|�����'dS)N)rCrHrJrOzwsgi.input (�) doesn't have the attribute �rr{)r?�attrs  rr�r�ksQ��=�"�"����
�D�)�)�)��z�z�4�4�
!�	"�	"�	"�	"�"�"rc�X�dD]&}tt||��d|�d|�����'dS)N)r^rZraz
wsgi.errors (r�r�)rWr�s  rr�r�qsQ��0�#�#�����T�*�*�*��{�{�D�D�
"�	#�	#�	#�	#�#�#rc�n�t|d��}|�dd��d}tt|��dkd|z��t	|��}t|dkd|z��t|��dks|dd	krtjd
|zt��dSdS)N�Statusr!rr z)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�splitrr"r�r�r�r)r*�status_code�
status_ints   rr#r#ws���
�v�x�
0�
0�F��,�,�t�Q�'�'��*�K��C�����!�3�k�A�C�C�C��[�!�!�J��J�#��;�j�H�I�I�I�
�6�{�{�Q���&��)�s�*�*��
�
B��
�!�	#�	#�	#�	#�	#�+�*rc
��tt|��tud|�dt|������|D�]�}tt|��tud|�dt|������tt	|��dk��|\}}t|d��}t|d��}t|���dkd	|z��td
|vod|vd|z��tt�|��d
|z��t|�	d��o|�	d��d|z��t�|��rBtdd|�dt�|���d���d������dS)Nz	Headers (z) must be of type list: zIndividual headers (z) must be of type tuple: r�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 '_': %rrzBad header value: z (bad char: rw)rrrKr�r"r�lower�	header_re�search�endswith�bad_header_value_re�group)r+�item�namers    rr$r$�s����D��M�M�T�!�!��7�7�D��M�M�M�	#�$�$�$��C�C����T�
�
�e�#�#��t�t�T�$�Z�Z�Z�
!�	"�	"�	"�	��D�	�	�Q��������e� ��}�5�5��!�%��8�8����
�
����(�
�"�
#�	$�	$�	$�	��D� �4�S��_�;�d�B�	D�	D�	D��	� � ��&�&�(=��(D�E�E�E��D�M�M�#�&�&�&�A�t�}�}�S�/A�/A�+A�1�D�8�	:�	:�	:��%�%�e�,�,�	C��A�A��u�u�)�0�0��7�7�=�=�a�@�@�@�@�B�
C�
C�
C��%C�Crc�B�t|d��}t|�dd��d��}d}|D]G\}}t|d��}|���dkr||vrdSt	dd|z���H||vrt	dd|z��dSdS)	Nr�r!r)��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))rr�r�r�r)r*r+�code�NO_MESSAGE_BODYr�rs      rr%r%�s���
�v�x�
0�
0�F��v�|�|�D�!�$�$�Q�'�(�(�D�!�O��B�B���e� ��}�5�5���:�:�<�<�>�)�)��?�*�*�����A�9�<@�A�
B�
B�
B���?�"�"���A�G�K�L�L�L�L�L�#�"rc	�|�t|dupt|��tud|�dt|������dS)Nz
exc_info (z) is not a tuple: )rrr�)r,s rr&r&�sO���H���7��X���%� 7��.6�h�h��X����G�I�I�I�I�Irc�\�tt|ttf��d��dS)NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r�
isinstancerrDrls rr5r5�s>���
�8�c�5�\�2�2�2�	E�F�F�F�F�Fr)r	�__all__�rer}r��compiler�r��Warningrrrrr3r4r(rjr6r2r�r�r#r$r%r&r5r
rr�<module>r�s��
i�i�T�-��
�	�	�	�
�
�
�
������B�J�3�4�4�	� �b�j��0�0�������'����
$�$�$�H�H�H�5�5�5�n!7�!7�!7�!7�!7�!7�!7�!7�F8�8�8�8�8�8�8�8�&��������4�4�4�4�4�4�4�4�!?�!?�!?�!?�!?�!?�!?�!?�F?#�?#�?#�B"�"�"�#�#�#�#�#�#�C�C�C�2M�M�M� I�I�I�
F�F�F�F�Fr

?>