ზ3በંવવხްុլRxስសلçໂH℅૩/opt/alt/python311/lib64/python3.11/wsgiref/__pycache__/
Current File : //opt/alt/python311/lib64/python3.11/wsgiref/__pycache__/validate.cpython-311.opt-1.pyc
�
�/�g�:��H�dZdgZddlZddlZddlZejd��Zejd��ZGd�de��Z d�Z
d �Zd
�ZGd�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` rrr�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 rrCzInputWrapper.read�sH����D� � �Q������D�J�O�T�"����Q���5� �!�!�!��rc��tt|��dk��|jj|�}tt |��t
u��|SrB)rr"r=�readlinerrDrEs rrHzInputWrapper.readline�sI����D� � �Q������D�J���&����Q���5� �!�!�!��rc��tt|��dk��|jj|�}tt |��t
u��|D]%}tt |��tu���&|SrB)rr"r=� readlinesr�listrD)r>r�lines�lines rrJzInputWrapper.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
rrr3r3�sn������ � � �������������7�7�7�7�7rr3c�,�eZdZd�Zd�Zd�Zd�Zd�ZdS)r4c��||_dSr)�errors)r>�wsgi_errorss rr@zErrorWrapper.__init__��
��!����rc��tt|��tu��|j�|��dSr)rrrrV�write�r>�ss rrZzErrorWrapper.write�s6����Q���3���������!�����rc�8�|j���dSr)rV�flushrRs rr^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 rrSzErrorWrapper.close�s����6�7�7�7�7�7rN)rrrr@rZr^rarSr
rrr4r4�s_������"�"�"����������8�8�8�8�8rr4c��eZdZd�Zd�ZdS)r(c��||_dSr)�writer)r>�wsgi_writers rr@zWriteWrapper.__init__�rXrc�v�tt|��tu��|�|��dSr)rrrDrer[s r�__call__zWriteWrapper.__call__�s.����Q���5� �!�!�!����A�����rN)rrrr@rhr
rrr(r(�s2������"�"�"�����rr(c��eZdZd�Zd�ZdS)�PartialIteratorWrapperc��||_dSr�r8)r>�
wsgi_iterators rr@zPartialIteratorWrapper.__init__s
��%��
�
�
rc�,�t|jd��Sr)r6r8rRs rrOzPartialIteratorWrapper.__iter__s���t�}�d�3�3�3rN)rrrr@rOr
rrrjrj�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 rr@zIteratorWrapper.__init__ s.��!.����]�+�+��
����$8��!�!�!rc��|Srr
rRs rrOzIteratorWrapper.__iter__s���rc���t|jd��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 rrSzIteratorWrapper.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
rrr6r6s_������9�9�9����
�
�
�+�+�+�
?�?�?�?�?rr6c��tt|��tudt|���d|�d���dD]}t||vd|�����dD]#}t||vd|�d|d d��d
����$d|vrtjdt
��|���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 rr2r2*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)rCrHrJrOzwsgi.input (�) doesn't have the attribute �rr{)r?�attrs rr�r�ksQ��=�"�"����
�D�)�)�)��z�z�4�4�
!� "� "� "� "�"�"rc�X�dD]&}tt||��d|�d|�����'dS)N)r^rZraz
wsgi.errors (r�r�)rWr�s rr�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 rr#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 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 '_': %rrzBad header value: z (bad char: rw)rrrKr�r"r�lower� header_re�search�endswith�bad_header_value_re�group)r+�item�namers rr$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�zcontent-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 rr%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 rr&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 rr5r5�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