§
    ç·jù:  ã                   óH  — d Z dgZddlZddlZddlZ ej        d¦  «        Z ej        d¦  «        Z G d„ de¦  «        Z	d„ Z
d	„ Zd
„ Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )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                   ó   — e Zd ZdZdS )ÚWSGIWarningz:
    Raised in response to WSGI-spec-related warnings
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú'/usr/lib/python3.11/wsgiref/validate.pyr   r   y   s   € € € € € ðð ð ð r   r   c                 ó   — | s	t          |Ž ‚d S ©N)ÚAssertionError)ÚcondÚargss     r   Úassert_r   ~   s   € Øð $Ý˜dÐ#Ð#ð$ð $r   c                 ó’   — t          | ¦  «        t          u r| S t          d                     |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ð Hr   c                 ó   ‡ — ˆ fd„}|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                  óŠ  •‡‡— t          t          | ¦  «        dk    d¦  «         t          | d¦  «         | \  }Št          |¦  «         g Šˆˆfd„}t          |d         ¦  «        |d<   t	          |d         ¦  «        |d<    ‰||¦  «        }t          |d uo|dk    d¦  «         t          |¦  «         t          |‰¦  «        S )	Né   zTwo arguments requiredúNo keyword arguments allowedc                  ó¸  •— t          t          | ¦  «        dk    pt          | ¦  «        dk    d| ›�¦  «         t          | d¦  «         | d         }| d         }t          | ¦  «        dk    r	| d         }nd }t          |¦  «         t          |¦  «         t	          ||¦  «         t          |¦  «         ‰                     d ¦  «         t           ‰| Ž ¦  «        S )Nr   é   zInvalid number of arguments: r   r   é   )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)r   r"   Úcheck_environÚInputWrapperÚErrorWrapperÚcheck_iteratorÚIteratorWrapper)r   r)   Úenvironr/   Úiteratorr-   r.   Úapplications        @@€r   Úlint_appzvalidator.<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Ð)?Ñ@Ô@Ð@r   r
   )r9   r:   s   ` r   r   r   ˆ   s)   ø€ ð'Að 'Að 'Að 'Að 'AðR €Or   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r3   c                 ó   — || _         d S r   )Úinput)ÚselfÚ
wsgi_inputs     r   Ú__init__zInputWrapper.__init__Á   s   € ØˆŒ
ˆ
ˆ
r   c                 óª   — t          t          |¦  «        dk    ¦  «          | j        j        |Ž }t          t	          |¦  «        t
          u ¦  «         |S ©Nr!   )r   r"   r=   Úreadr   Úbytes©r>   r   Úvs      r   rC   zInputWrapper.readÄ   sH   € Ý•�D‘	”	˜Q’ÑÔÐØˆDŒJŒO˜TÐ"ˆÝ•�Q‘”�5Ð Ñ!Ô!Ð!Øˆr   c                 óª   — t          t          |¦  «        dk    ¦  «          | j        j        |Ž }t          t	          |¦  «        t
          u ¦  «         |S rB   )r   r"   r=   Úreadliner   rD   rE   s      r   rH   zInputWrapper.readlineÊ   sI   € Ý•�D‘	”	˜Q’ÑÔÐØˆDŒJÔ Ð&ˆÝ•�Q‘”�5Ð Ñ!Ô!Ð!Øˆr   c                 óú   — t          t          |¦  «        dk    ¦  «          | j        j        |Ž }t          t	          |¦  «        t
          u ¦  «         |D ]%}t          t	          |¦  «        t          u ¦  «         Œ&|S rB   )r   r"   r=   Ú	readlinesr   ÚlistrD   )r>   r   ÚlinesÚlines       r   rJ   zInputWrapper.readlinesÐ   st   € Ý•�D‘	”	˜Q’ÑÔÐØ$�”
Ô$ dÐ+ˆÝ•�U‘”�tÐ#Ñ$Ô$Ð$Øð 	)ð 	)ˆDÝ•D˜‘J”J¥%Ð'Ñ(Ô(Ð(Ð(Øˆr   c              #   óB   K  — 	 |                       ¦   «         }|sd S |V — Œr   )rH   )r>   rM   s     r   Ú__iter__zInputWrapper.__iter__Ø   s3   è è € ð	Ø—=’=‘?”?ˆDØð Ø�ØˆJˆJˆJð		r   c                 ó&   — t          dd¦  «         d S )Nr   z input.close() must not be called©r   ©r>   s    r   ÚclosezInputWrapper.closeß   s   € Ý�Ð5Ñ6Ô6Ð6Ð6Ð6r   N)	r   r   r   r@   rC   rH   rJ   rO   rS   r
   r   r   r3   r3   ¿   sn   € € € € € ð ð  ð  ðð ð ðð ð ðð ð ðð ð ð7ð 7ð 7ð 7ð 7r   r3   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r4   c                 ó   — || _         d S r   )Úerrors)r>   Úwsgi_errorss     r   r@   zErrorWrapper.__init__ä   ó   € Ø!ˆŒˆˆr   c                 ó€   — t          t          |¦  «        t          u ¦  «         | j                             |¦  «         d S r   )r   r   r   rV   Úwrite©r>   Úss     r   rZ   zErrorWrapper.writeç   s6   € Ý•�Q‘”�3�ÑÔÐØŒ×Ò˜!ÑÔÐÐÐr   c                 ó8   — | j                              ¦   «          d S r   )rV   ÚflushrR   s    r   r^   zErrorWrapper.flushë   s   € ØŒ×ÒÑÔÐÐÐr   c                 ó:   — |D ]}|                       |¦  «         Œd S r   )rZ   )r>   ÚseqrM   s      r   Ú
writelineszErrorWrapper.writelinesî   s0   € Øð 	ð 	ˆDØ�JŠJ�tÑÔÐÐð	ð 	r   c                 ó&   — t          dd¦  «         d S )Nr   z!errors.close() must not be calledrQ   rR   s    r   rS   zErrorWrapper.closeò   s   € Ý�Ð6Ñ7Ô7Ð7Ð7Ð7r   N)r   r   r   r@   rZ   r^   ra   rS   r
   r   r   r4   r4   â   s_   € € € € € ð"ð "ð "ðð ð ðð ð ðð ð ð8ð 8ð 8ð 8ð 8r   r4   c                   ó   — e Zd Zd„ Zd„ ZdS )r(   c                 ó   — || _         d S r   )Úwriter)r>   Úwsgi_writers     r   r@   zWriteWrapper.__init__÷   rX   r   c                 óv   — t          t          |¦  «        t          u ¦  «         |                      |¦  «         d S r   )r   r   rD   re   r[   s     r   Ú__call__zWriteWrapper.__call__ú   s.   € Ý•�Q‘”�5Ð Ñ!Ô!Ð!Ø�Š�A‰Œˆˆˆr   N)r   r   r   r@   rh   r
   r   r   r(   r(   õ   s2   € € € € € ð"ð "ð "ðð ð ð ð r   r(   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚPartialIteratorWrapperc                 ó   — || _         d S r   ©r8   )r>   Úwsgi_iterators     r   r@   zPartialIteratorWrapper.__init__   s   € Ø%ˆŒˆˆr   c                 ó,   — t          | j        d ¦  «        S r   )r6   r8   rR   s    r   rO   zPartialIteratorWrapper.__iter__  s   € å˜tœ}¨dÑ3Ô3Ð3r   N)r   r   r   r@   rO   r
   r   r   rj   rj   þ   s2   € € € € € ð&ð &ð &ð4ð 4ð 4ð 4ð 4r   rj   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r6   c                 óX   — || _         t          |¦  «        | _        d| _        || _        d S )NF)Úoriginal_iteratorÚiterr8   ÚclosedÚcheck_start_response)r>   rm   rt   s      r   r@   zIteratorWrapper.__init__	  s.   € Ø!.ˆÔÝ˜]Ñ+Ô+ˆŒØˆŒØ$8ˆÔ!Ð!Ð!r   c                 ó   — | S r   r
   rR   s    r   rO   zIteratorWrapper.__iter__  s   € Øˆr   c                 óô   — t          | j         d¦  «         t          | j        ¦  «        }t	          |¦  «        t
          urt          dd|›d�¦  «         | j        �t          | j        d¦  «         d | _        |S )NzIterator 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)r   rs   Únextr8   r   rD   rt   )r>   rF   s     r   Ú__next__zIteratorWrapper.__next__  s‰   € Ý�D”K�Ø(ñ	*ô 	*ð 	*å�”ÑÔˆÝ�‰7Œ7�%ÐÐÝ�E�EÀQÀQÀQÐHÑIÔIÐIØÔ$Ð0Ý�DÔ-Ø|ñ~ô ~ð ~à(,ˆDÔ%Øˆr   c                 ót   — d| _         t          | j        d¦  «        r| j                             ¦   «          d S d S )NTrS   )rs   Úhasattrrq   rS   rR   s    r   rS   zIteratorWrapper.close  sC   € ØˆŒÝ�4Ô)¨7Ñ3Ô3ð 	+ØÔ"×(Ò(Ñ*Ô*Ð*Ð*Ð*ð	+ð 	+r   c                 ó|   — | j         st          j                             d¦  «         t	          | j         d¦  «         d S )Nz/Iterator garbage collected without being closed)rs   ÚsysÚstderrrZ   r   rR   s    r   Ú__del__zIteratorWrapper.__del__#  sP   € ØŒ{ð 	CÝŒJ×ÒØAñCô Cð Cå�”Ø=ñ	?ô 	?ð 	?ð 	?ð 	?r   N)r   r   r   r@   rO   ry   rS   r   r
   r   r   r6   r6     s_   € € € € € ð9ð 9ð 9ðð ð ð
ð 
ð 
ð+ð +ð +ð
?ð ?ð ?ð ?ð ?r   r6   c                 ó¢  — t          t          | ¦  «        t          u dt          | ¦  «        ›d| ›d�¦  «         dD ]}t          || v d|›�¦  «         ŒdD ]#}t          || vd|›d|d	d …         ›d
�¦  «         Œ$d| vrt          j        dt
          ¦  «         |                      ¦   «         D ]T}d|v rŒt          t          | |         ¦  «        t          u d|›dt          | |         ¦  «        ›d| |         ›d�¦  «         ŒUt          t          | d         ¦  «        t          u d| d         ›d�¦  «         t          | d         dv d| d         z  ¦  «         t          | d         ¦  «         t          | d         ¦  «         | d         dvr#t          j        d| d         z  t
          ¦  «         t          |                      d¦  «         p| d                              d¦  «        d| d         z  ¦  «         t          |                      d¦  «         p| d                              d¦  «        d| d         z  ¦  «         |                      d ¦  «        r0t          t          | d          ¦  «        d!k    d"| d          z  ¦  «         |                      d¦  «        st          d| v d#¦  «         t          |                      d¦  «        dk    d$¦  «         d S )%Nz&Environment is not of the right type: z (environment: rw   )	ÚREQUEST_METHODÚSERVER_NAMEÚSERVER_PORTúwsgi.versionr0   r1   zwsgi.multithreadzwsgi.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ú.zEnvironmental variable z is not a string: z	 (value: r„   z wsgi.version should be a tuple (zwsgi.url_scheme)ÚhttpÚhttpszwsgi.url_scheme unknown: %rr0   r1   r�   )ÚGETÚHEADÚPOSTÚOPTIONSÚPATCHÚPUTÚDELETEÚTRACEzUnknown REQUEST_METHOD: %rÚSCRIPT_NAMEú/z$SCRIPT_NAME doesn't start with /: %rÚ	PATH_INFOz"PATH_INFO doesn't start with /: %rÚCONTENT_LENGTHr   zInvalid 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)r7   Úkeys     r   r2   r2   *  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˜Ñ&Ô&¨#Ò-ð	"ñ#ô #ð #ð #ð #r   c                 óX   — dD ]&}t          t          | |¦  «        d| ›d|›�¦  «         Œ'd S )N)rC   rH   rJ   rO   zwsgi.input (ú) doesn't have the attribute ©r   r{   )r?   Úattrs     r   r�   r�   k  sQ   € Ø=ð "ð "ˆÝ•˜
 DÑ)Ô)Ð)àˆzˆz˜4˜4ð!ñ	"ô 	"ð 	"ð 	"ð"ð "r   c                 óX   — dD ]&}t          t          | |¦  «        d| ›d|›�¦  «         Œ'd S )N)r^   rZ   ra   zwsgi.errors (r¤   r¥   )rW   r¦   s     r   rž   rž   q  sQ   € Ø0ð #ð #ˆÝ•˜ TÑ*Ô*Ð*àˆ{ˆ{˜D˜Dð"ñ	#ô 	#ð 	#ð 	#ð#ð #r   c                 ón  — t          | d¦  «        } |                      d d¦  «        d         }t          t          |¦  «        dk    d|z  ¦  «         t	          |¦  «        }t          |dk    d|z  ¦  «         t          | ¦  «        dk     s| d         d	k    rt          j        d
| z  t          ¦  «         d S d S )NÚStatusr!   r   r    z)Status codes must be three characters: %réd   zStatus 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"   r¡   r™   rš   r   )r*   Ústatus_codeÚ
status_ints      r   r#   r#   w  sÑ   € Ý˜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àñå!ñ	#ô 	#ð 	#ð 	#ð 	#ð +Ð*r   c           
      ó†  — t          t          | ¦  «        t          u d| ›dt          | ¦  «        ›�¦  «         | D �]…}t          t          |¦  «        t          u d|›dt          |¦  «        ›�¦  «         t          t	          |¦  «        dk    ¦  «         |\  }}t          |d¦  «        }t          |d¦  «        }t          |                     ¦   «         dk    d	|z  ¦  «         t          d
|vod|vd|z  ¦  «         t          t                               |¦  «        d|z  ¦  «         t          | 	                    d¦  «         o| 	                    d¦  «         d|z  ¦  «         t                               |¦  «        rBt          dd|›dt                               |¦  «                             d¦  «        ›d�¦  «         �Œ‡d S )Nz	Headers (z) must be of type list: zIndividual 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': %rzBad header name: %rú-Ú_z#Names may not end in '-' or '_': %rr   zBad header value: z (bad char: rw   )r   r   rK   rœ   r"   r   ÚlowerÚ	header_reÚsearchÚendswithÚbad_header_value_reÚgroup)r+   ÚitemÚnamer   s       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ð Cr   c                 óB  — t          | d¦  «        } t          |                      d d¦  «        d         ¦  «        }d}|D ]G\  }}t          |d¦  «        }|                     ¦   «         dk    r||vr d S t	          dd|z  ¦  «         ŒH||vrt	          dd|z  ¦  «         d S d S )	Nr©   r!   r   )éÌ   i0  r±   zcontent-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))r   r¡   r­   r¶   r   )r*   r+   ÚcodeÚNO_MESSAGE_BODYr½   r   s         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ð #Ð"r   c           	      ó|   — t          | d u pt          | ¦  «        t          u d| ›dt          | ¦  «        ›�¦  «         d S )Nz
exc_info (z) is not a tuple: )r   r   rœ   )r,   s    r   r&   r&   ®  sO   € ÝˆH˜ÐÐ7¥ X¡¤µ%Ð 7øØ.6¨h¨h½¸X¹¼¸ÐGñIô Ið Ið Ið Ir   c                 ó\   — t          t          | t          t          f¦  «         d¦  «         d S )NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r   Ú
isinstancer   rD   rl   s    r   r5   r5   ³  s>   € õ •
˜8¥c­5 \Ñ2Ô2Ð2ð	EñFô Fð Fð Fð Fr   )r	   Ú__all__Úrer}   r™   Úcompiler·   rº   ÚWarningr   r   r   r   r3   r4   r(   rj   r6   r2   r�   rž   r#   r$   r%   r&   r5   r
   r   r   ú<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ðF8ð 8ð 8ð 8ð 8ñ 8ô 8ð 8ð&ð ð ð ð ñ ô ð ð4ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ð!?ð !?ð !?ð !?ð !?ñ !?ô !?ð !?ðF?#ð ?#ð ?#ðB"ð "ð "ð#ð #ð #ð#ð #ð #ðCð Cð Cð2Mð Mð Mð Ið Ið Ið
Fð Fð Fð Fð Fr   