3 \;;�@s�dgZddlZddlZddlZejd�Zejd�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.6/wsgiref/validate.pyrysrcGs|s t|��dS)N)�AssertionError)Zcond�argsrrr�assert_~sr cCs(t|�tkr|Stdj|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 requiredzNo keyword arguments allowedcs�tt|�dkpt|�dkd|f�t| d�|d}|d}t|�dkrV|d}nd}t|�t|�t||�t|��jd�t�|��S)Nr�zInvalid number of arguments: %szNo keyword arguments allowedr�)r �len� check_status� check_headers�check_content_type�check_exc_info�append� WriteWrapper)r �kw�status�headers�exc_info)�start_response�start_response_startedrr�start_response_wrapper�s      z;validator..lint_app..start_response_wrapperz wsgi.inputz 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)� application)r!r"r�lint_app�s  zvalidator..lint_appr)r+r,r)r+rr�s )c@s<eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd S)r%cCs ||_dS)N)�input)�self� wsgi_inputrrr�__init__�szInputWrapper.__init__cGs0tt|�dk�|jj|�}tt|�tk�|S)Nr)r rr-�readr �bytes)r.r �vrrrr1�s zInputWrapper.readcGs0tt|�dk�|jj|�}tt|�tk�|S)Nr)r rr-�readliner r2)r.r r3rrrr4�s zInputWrapper.readlinecGsNtt|�dk�|jj|�}tt|�tk�x|D]}tt|�tk�q2W|S)Nr)r rr-� readlinesr �listr2)r.r �lines�linerrrr5�s   zInputWrapper.readlinesccs x|j�}|sdS|VqWdS)N)r4)r.r8rrr�__iter__�s zInputWrapper.__iter__cCstdd�dS)Nrz input.close() must not be called)r )r.rrr�close�szInputWrapper.closeN) rrrr0r1r4r5r9r:rrrrr%�s r%c@s4eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd S) r&cCs ||_dS)N)�errors)r.� wsgi_errorsrrrr0�szErrorWrapper.__init__cCs tt|�tk�|jj|�dS)N)r r r r;�write)r.�srrrr=�szErrorWrapper.writecCs|jj�dS)N)r;�flush)r.rrrr?�szErrorWrapper.flushcCsx|D]}|j|�qWdS)N)r=)r.�seqr8rrr� writelines�s zErrorWrapper.writelinescCstdd�dS)Nrz!errors.close() must not be called)r )r.rrrr:�szErrorWrapper.closeN)rrrr0r=r?rAr:rrrrr&�s r&c@seZdZdd�Zdd�ZdS)rcCs ||_dS)N)�writer)r.Z wsgi_writerrrrr0�szWriteWrapper.__init__cCstt|�tk�|j|�dS)N)r r r2rB)r.r>rrr�__call__�szWriteWrapper.__call__N)rrrr0rCrrrrr�src@seZdZdd�Zdd�ZdS)�PartialIteratorWrappercCs ||_dS)N)r*)r.� wsgi_iteratorrrrr0szPartialIteratorWrapper.__init__cCs t|jd�S)N)r(r*)r.rrrr9szPartialIteratorWrapper.__iter__N)rrrr0r9rrrrrD�srDc@s4eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd S) r(cCs ||_t|�|_d|_||_dS)NF)�original_iterator�iterr*�closed�check_start_response)r.rErIrrrr0 s zIteratorWrapper.__init__cCs|S)Nr)r.rrrr9szIteratorWrapper.__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 rH�nextr*r r2rI)r.r3rrr�__next__s   zIteratorWrapper.__next__cCs d|_t|jd�r|jj�dS)NTr:)rH�hasattrrFr:)r.rrrr:s zIteratorWrapper.closecCs"|jstjjd�t|jd�dS)Nz/Iterator garbage collected without being closed)rH�sys�stderrr=r )r.rrr�__del__#s zIteratorWrapper.__del__N)rrrr0r9rKr:rOrrrrr(s  r(c Cs�tt|�tkdt|�|f�x d,D]}t||kd |f�q$Wx*d-D]"}t||kd||dd�f�qFWd|kr�tjdt�xF|j�D]:}d|kr�q�tt||�tkd|t||�||f�q�Wtt|d�tkd|df�t|dd.kd|d�t |d�t |d�|dd/k�ros,  7#  #A