U
    n5{iMa  ã                   @  s¬   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZ ddlmZmZmZ G dd„ deƒZd	d
dddœdd„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )z(
Tests for L{twisted.web.http_headers}.
é    )Úannotations)ÚSequence)ÚSynchronousTestCaseÚTestCase)ÚHeadersÚInvalidHeaderNameÚ_nameEncoder)ÚbytesLinearWhitespaceComponentsÚsanitizedBytesÚtextLinearWhitespaceComponentsc                   @  s:   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zd
S )ÚNameEncoderTestsz7
    Test L{twisted.web.http_headers._NameEncoder}
    ÚNone©Úreturnc                 C  sÊ   |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d	¡d
¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ dS )zk
        L{_NameEncoder.encode} returns the canonical capitalization for
        the given header.
        ó   testó   Tests
   test-stuffó
   Test-Stuffs   content-md5ó   Content-MD5s   dntó   DNTs   etagó   ETags   p3pó   P3Ps   teó   TEó   www-authenticateó   WWW-Authenticates   WWW-authenticates   Www-Authenticates   x-xss-protectionó   X-XSS-ProtectionN©ÚassertEqualr   Úencode©Úself© r    úF/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/web/test/test_http_headers.pyÚtest_encodeName   s    z NameEncoderTests.test_encodeNamec                 C  sÊ   |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d	¡d
¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ dS )zz
        L{_NameEncoder.encode} returns the canonical capitalization for
        a header name given as a L{str}.
        Útestr   z
test-stuffr   úcontent-md5r   Zdntr   Úetagr   Zp3pr   Úter   úwww-authenticater   zWWW-authenticatezWww-Authenticatezx-xss-protectionr   Nr   r   r    r    r!   Útest_encodeNameStr+   s    z#NameEncoderTests.test_encodeNameStrc                 C  sD   t ƒ }ttjd ƒD ]}| d|› �d¡ q|  ttjƒtj¡ dS )zH
        Only a limited number of HTTP header names get cached.
        éÈ   zhello-ÚvalueN)r   Úranger   Z_MAX_CACHED_HEADERSÚaddRawHeaderr   ÚlenZ_canonicalHeaderCache)r   ÚheadersÚir    r    r!   Útest_maxCachedHeaders<   s     ÿz&NameEncoderTests.test_maxCachedHeadersN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r(   r0   r    r    r    r!   r      s   r   r   zSequence[bytes] | Sequence[str]Úbytesr   )ÚtestCaseÚ
componentsÚexpectedr   c           	      C  sž   d}|D ]�}g }|  t||giƒ¡ tƒ }| ||¡ |  |¡ tƒ }| ||g¡ |  |¡ |D ]4}|  t| ¡ ƒ||gfg¡ |  | |¡|g¡ qbqdS )aÞ  
    Assert that the components are sanitized to the expected value as
    both a header value, across all of L{Header}'s setters and getters.

    @param testCase: A test case.

    @param components: A sequence of values that contain linear
        whitespace to use as header values; see
        C{textLinearWhitespaceComponents} and
        C{bytesLinearWhitespaceComponents}

    @param expected: The expected sanitized form of the component as
        a header value.
    s   NameN)Úappendr   r,   ÚsetRawHeadersr   ÚlistÚgetAllRawHeadersÚgetRawHeaders)	r6   r7   r8   ÚnameÚ	componentr.   ÚaddedZ	setHeaderÚheaderr    r    r!   ÚassertSanitizedH   s    

rB   c                   @  s  e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœd d!„Zddœd"d#„Zddœd$d%„Zddœd&d'„Zddœd(d)„Zd*S )+ÚBytesHeadersTestszE
    Tests for L{Headers}, using L{bytes} arguments for methods.
    r   r   c                 C  s   t | ttƒ dS ©zf
        Linear whitespace in header names or values is replaced with a
        single space.
        N)rB   r	   r
   r   r    r    r!   Útest_sanitizeLinearWhitespacep   s    z/BytesHeadersTests.test_sanitizeLinearWhitespacec                 C  s&   t ddgiƒ}|  | d¡dg¡ dS )zx
        The header values passed to L{Headers.__init__} can be retrieved via
        L{Headers.getRawHeaders}.
        s   Fooó   baró   fooN©r   r   r=   ©r   Úhr    r    r!   Útest_initializerw   s    z"BytesHeadersTests.test_initializerc                 C  sP   ddg}t ƒ }| d|¡ |  | d¡¡ |  | d¡¡ |  | d¡|¡ dS )zŠ
        L{Headers.setRawHeaders} sets the header values for the given
        header name to the sequence of byte string values.
        ó   value1ó   value2r   r   N©r   r:   Ú
assertTrueÚ	hasHeaderr   r=   )r   ÚrawValuerJ   r    r    r!   Útest_setRawHeaders   s    z$BytesHeadersTests.test_setRawHeadersc                 C  sL   t ƒ }| dd¡ |  | d¡dg¡ | dd¡ |  | d¡ddg¡ dS )úN
        L{Headers.addRawHeader} adds a new value for a given header.
        r   ó   lemuró   pandaN©r   r,   r   r=   rI   r    r    r!   Útest_addRawHeader‹   s
    z#BytesHeadersTests.test_addRawHeaderc                 C  s   |   tƒ  d¡¡ dS )úz
        L{Headers.getRawHeaders} returns L{None} if the header is not found and
        no default is specified.
        r   N©ZassertIsNoner   r=   r   r    r    r!   Útest_getRawHeadersNoDefault•   s    z-BytesHeadersTests.test_getRawHeadersNoDefaultc                 C  s$   t ƒ }tƒ }|  | d|¡|¡ dS )úo
        L{Headers.getRawHeaders} returns the specified default value when no
        header is found.
        r   N)r   ÚobjectÚassertIdenticalr=   ©r   rJ   Údefaultr    r    r!   Útest_getRawHeadersDefaultValueœ   s    z0BytesHeadersTests.test_getRawHeadersDefaultValuec                 C  sJ   t ƒ }dg}| d|¡ |  | d|¡d t¡ |  | d|¡dg¡ dS )zÏ
        If the object passed as the value list to L{Headers.setRawHeaders}
        is later passed as a default to L{Headers.getRawHeaders}, the
        result nevertheless contains encoded values.
        r*   ó   keyr   ó   valueN)r   r:   ÚassertIsInstancer=   r5   r   r^   r    r    r!   Ú*test_getRawHeadersWithDefaultMatchingValue¥   s
    z<BytesHeadersTests.test_getRawHeadersWithDefaultMatchingValuec                 C  s@   t ƒ }| ddg¡ |  | d¡dg¡ |  | d¡dg¡ dS )úm
        L{Headers.getRawHeaders} returns the values which have been set for a
        given header.
        r   rT   r   N©r   r:   r   r=   rI   r    r    r!   Útest_getRawHeaders±   s    z$BytesHeadersTests.test_getRawHeadersc                 C  s8   t ƒ }| ddg¡ |  | d¡¡ |  | d¡¡ dS )úi
        Check that L{Headers.hasHeader} returns C{True} when the given header
        is found.
        r   rT   r   N©r   r:   rO   rP   rI   r    r    r!   Útest_hasHeaderTrue»   s    z$BytesHeadersTests.test_hasHeaderTruec                 C  s   |   tƒ  d¡¡ dS )úc
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        r   N©ÚassertFalser   rP   r   r    r    r!   Útest_hasHeaderFalseÅ   s    z%BytesHeadersTests.test_hasHeaderFalsec                 C  sz   t ƒ }| ddg¡ |  | d¡¡ | d¡ |  | d¡¡ | ddg¡ |  | d¡¡ | d¡ |  | d¡¡ dS )úN
        Check that L{Headers.removeHeader} removes the given header.
        rG   rT   rF   rU   s   BarN©r   r:   rO   rP   ÚremoveHeaderrm   rI   r    r    r!   Útest_removeHeaderÌ   s    

z#BytesHeadersTests.test_removeHeaderc                 C  s(   t ƒ }| d¡ |  t| ¡ ƒg ¡ dS )úk
        L{Headers.removeHeader} is a no-operation when the specified header is
        not found.
        r   N©r   rq   r   r;   r<   rI   r    r    r!   Útest_removeHeaderDoesntExistÜ   s    
z.BytesHeadersTests.test_removeHeaderDoesntExistc                 C  sH   t ƒ }| ddg¡ | ddg¡ dd„ | ¡ D ƒ}|  |ddh¡ d	S )
úÇ
        L{Headers.getAllRawHeaders} returns an iterable of (k, v) pairs, where
        C{k} is the canonicalized representation of the header name, and C{v}
        is a sequence of values.
        r   ó   lemursr   ó   basic aksljdlk=c                 S  s   h | ]\}}|t |ƒf’qS r    ©Útuple©Ú.0ÚkÚvr    r    r!   Ú	<setcomp>ï   s     z:BytesHeadersTests.test_getAllRawHeaders.<locals>.<setcomp>©r   )rx   ©r   )rw   N©r   r:   r<   r   ©r   rJ   Z
allHeadersr    r    r!   Útest_getAllRawHeaderså   s    þz'BytesHeadersTests.test_getAllRawHeadersc                 C  sf   t ƒ }| ddg¡ t ƒ }| ddg¡ t ƒ }| dddg¡ |  ||¡ |  ||¡ |  ||¡ dS )ú�
        A L{Headers} instance compares equal to itself and to another
        L{Headers} instance with the same values.
        rG   rU   rT   N©r   r:   r   ÚassertNotEqual)r   ÚfirstÚsecondÚthirdr    r    r!   Útest_headersComparisonö   s    z(BytesHeadersTests.test_headersComparisonc                 C  s0   t ƒ }|  |d¡ |  |tƒ ¡ |  |d¡ dS )úf
        An instance of L{Headers} does not compare equal to other unrelated
        objects.
        r    rG   N©r   r‡   r\   rI   r    r    r!   Útest_otherComparison  s    z&BytesHeadersTests.test_otherComparisonc              
   C  sD   d}d}d}|   tt|||giƒƒd| ¡ ›d|›d|›d�¡ dS )	zy
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains.
        rG   rF   ó   bazú	Headers({ú: [ú, ú]})N©r   Úreprr   Ú
capitalize©r   ÚfooÚbarÚbazr    r    r!   Ú	test_repr  s    þzBytesHeadersTests.test_reprc              
   C  sD   d}d}d}|   tt|||giƒƒd| ¡ ›d|›d|›d�¡ dS )	z¡
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains, not attempting to decode any raw bytes.
        rG   s   barás   bazár�   r‘   r’   r“   Nr”   r—   r    r    r!   Útest_reprWithRawBytes  s    þz'BytesHeadersTests.test_reprWithRawBytesc              
   C  sT   d}d}d}G dd„ dt ƒ}|  t||||giƒƒd| ¡ ›d|›d|›d	�¡ d
S )ú’
        The L{repr} of an instance of a subclass of L{Headers} uses the name
        of the subclass instead of the string C{"Headers"}.
        rG   rF   r�   c                   @  s   e Zd ZdS )z9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersN©r1   r2   r3   r    r    r    r!   ÚFunnyHeaders6  s   rŸ   zFunnyHeaders({r‘   r’   r“   N)r   r   r•   r–   )r   r˜   r™   rš   rŸ   r    r    r!   Útest_subclassRepr-  s    þz#BytesHeadersTests.test_subclassReprc                 C  sv   t ƒ }| ddg¡ | ¡ }|  | d¡dg¡ | dd¡ |  | d¡dg¡ | dd¡ |  | d¡ddg¡ dS )ú¶
        L{Headers.copy} creates a new independent copy of an existing
        L{Headers} instance, allowing future modifications without impacts
        between the copies.
        r   rG   rF   r�   N©r   r:   Úcopyr   r=   r,   ©r   rJ   r/   r    r    r!   Ú	test_copy>  s    zBytesHeadersTests.test_copyN)r1   r2   r3   r4   rE   rK   rR   rW   rZ   r`   rd   rg   rj   rn   rr   ru   r„   r‹   rŽ   r›   rœ   r    r¥   r    r    r    r!   rC   k   s(   
	

	
rC   c                   @  sD  e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœd d!„Zddœd"d#„Zddœd$d%„Zddœd&d'„Zddœd(d)„Zddœd*d+„Zddœd,d-„Zddœd.d/„Zd0S )1ÚUnicodeHeadersTestszC
    Tests for L{Headers}, using L{str} arguments for methods.
    r   r   c                 C  s   t | ttƒ dS rD   )rB   r   r
   r   r    r    r!   rE   S  s    z1UnicodeHeadersTests.test_sanitizeLinearWhitespacec                 C  s:   t ddgiƒ}|  | d¡dg¡ |  | d¡dg¡ dS )aC  
        The header values passed to L{Headers.__init__} can be retrieved via
        L{Headers.getRawHeaders}. If a L{bytes} argument is given, it returns
        L{bytes} values, and if a L{str} argument is given, it returns
        L{str} values. Both are the same header value, just encoded or
        decoded.
        ZFoor™   rG   rF   r˜   NrH   rI   r    r    r!   rK   Z  s    z$UnicodeHeadersTests.test_initializerc                 C  sŠ   ddg}ddg}t ƒ }| d|¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡|¡ |  | d¡|¡ d	S )
zˆ
        L{Headers.setRawHeaders} sets the header values for the given
        header name to the sequence of strings, encoded.
        Zvalue1Zvalue2rL   rM   r#   r   r   ÚTestNrN   )r   rQ   ZrawEncodedValuerJ   r    r    r!   rR   f  s    z&UnicodeHeadersTests.test_setRawHeadersc              	   C  sN   t ƒ }|  t¡� | ddg¡ W 5 Q R X |  t¡� | d¡ W 5 Q R X dS )zÉ
        Passing L{str} to any function that takes a header name will encode
        said header name as ISO-8859-1, and if it cannot be encoded, it will
        raise a L{UnicodeDecodeError}.
        õ   â˜ƒÚvalN)r   ÚassertRaisesÚUnicodeEncodeErrorr:   rP   rI   r    r    r!   Útest_nameNotEncodablev  s
    z)UnicodeHeadersTests.test_nameNotEncodablec                 C  sn   t ƒ }|  t|jddg¡ |  t|jddg¡ |  t|jddg¡ |  t|jddg¡ |  t|jddg¡ dS )z„
        HTTP header names must be tokens, so any names containing non-token
        characters raises L{InvalidHeaderName}
        ó   ás   valõ   Ã¡s   a bzc
dzc	dN)r   rª   r   r:   rI   r    r    r!   Útest_nameNotToken…  s    z%UnicodeHeadersTests.test_nameNotTokenc                 C  sL   t ƒ }| ddg¡ |  | d¡¡ |  | d¡dg¡ |  | d¡¡ dS )z}
        Passing L{str} to any function that takes a header name will encode
        said header name as ISO-8859-1.
        r™   rG   rF   NrN   rI   r    r    r!   Útest_nameEncoding•  s
    z%UnicodeHeadersTests.test_nameEncodingc                 C  s@   t ƒ }| dddg¡ |  | d¡¡ |  | d¡ddg¡ dS )z|
        Passing L{str} to L{Headers.setRawHeaders} will encode the name as
        ISO-8859-1 and values as UTF-8.
        Úxr¨   rG   ó   xs   â˜ƒNrN   rI   r    r    r!   Útest_rawHeadersValueEncoding¦  s    z0UnicodeHeadersTests.test_rawHeadersValueEncodingc                 C  sb   t ƒ }| dd¡ |  | d¡dg¡ | dd¡ |  | d¡ddg¡ |  | d¡ddg¡ dS )rS   r#   ÚlemurÚpandar   rT   rU   NrV   rI   r    r    r!   rW   °  s    z%UnicodeHeadersTests.test_addRawHeaderc                 C  s   |   tƒ  d¡¡ dS )rX   r#   NrY   r   r    r    r!   rZ   »  s    z/UnicodeHeadersTests.test_getRawHeadersNoDefaultc                 C  sh   t ƒ }tƒ }|  | d|¡|¡ |  | dd¡d¡ |  | ddg¡dg¡ |  | ddg¡dg¡ dS )r[   r#   Nr¨   )r   r\   r]   r=   r   r^   r    r    r!   r`   Â  s    þz2UnicodeHeadersTests.test_getRawHeadersDefaultValuec                 C  sJ   t ƒ }dg}| d|¡ |  | d|¡d t¡ |  | d|¡dg¡ dS )zÏ
        If the object passed as the value list to L{Headers.setRawHeaders}
        is later passed as a default to L{Headers.getRawHeaders}, the
        result nevertheless contains decoded values.
        rb   ra   Úkeyr   r*   N)r   r:   rc   r=   Ústrr   r^   r    r    r!   rd   Ñ  s
    z>UnicodeHeadersTests.test_getRawHeadersWithDefaultMatchingValuec                 C  sh   t ƒ }| ddg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ dS )re   r#   r´   r§   r   rT   r   Nrf   rI   r    r    r!   rg   Ý  s    z&UnicodeHeadersTests.test_getRawHeadersc                 C  sX   t ƒ }| ddg¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ dS )rh   r#   r´   r§   r   r   Nri   rI   r    r    r!   rj   é  s    z&UnicodeHeadersTests.test_hasHeaderTruec                 C  s   |   tƒ  d¡¡ dS )rk   r#   Nrl   r   r    r    r!   rn   õ  s    z'UnicodeHeadersTests.test_hasHeaderFalsec                 C  sš   t ƒ }| ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ | ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ dS )	ro   r˜   r´   rG   r™   rµ   ÚBarrF   Nrp   rI   r    r    r!   rr   ü  s    

z%UnicodeHeadersTests.test_removeHeaderc                 C  s(   t ƒ }| d¡ |  t| ¡ ƒg ¡ dS )rs   r#   Nrt   rI   r    r    r!   ru     s    
z0UnicodeHeadersTests.test_removeHeaderDoesntExistc                 C  sX   t ƒ }| ddg¡ | ddg¡ | ddg¡ dd„ | ¡ D ƒ}|  |d	d
dh¡ dS )rv   r#   Zlemursr'   zbasic aksljdlk=r$   Zkjdfdfgdfgnsdc                 S  s   h | ]\}}|t |ƒf’qS r    ry   r{   r    r    r!   r   "  s     z<UnicodeHeadersTests.test_getAllRawHeaders.<locals>.<setcomp>r€   )r   )s   kjdfdfgdfgnsdr�   Nr‚   rƒ   r    r    r!   r„     s    ýþz)UnicodeHeadersTests.test_getAllRawHeadersc                 C  sÈ   t ƒ }| ddg¡ t ƒ }| ddg¡ t ƒ }| dddg¡ |  ||¡ |  ||¡ |  ||¡ t ƒ }| ddg¡ t ƒ }| ddg¡ t ƒ }| dddg¡ |  ||¡ |  ||¡ |  ||¡ dS )r…   r˜   rµ   r´   rG   rU   rT   Nr†   )r   rˆ   r‰   rŠ   Z
firstBytesZsecondBytesZ
thirdBytesr    r    r!   r‹   -  s$    z*UnicodeHeadersTests.test_headersComparisonc                 C  s0   t ƒ }|  |d¡ |  |tƒ ¡ |  |d¡ dS )rŒ   r    r˜   Nr�   rI   r    r    r!   rŽ   I  s    z(UnicodeHeadersTests.test_otherComparisonc              
   C  sT   d}d}d}d}d}d| }d| }|   tt|||giƒƒd ||| d¡¡¡ d	S )
z×
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains. This shows only reprs of bytes values, as
        undecodable headers may cause an exception.
        r˜   õ   barâ˜ƒrš   z'Foo'z'bar\xe2\x98\x83'ÚbzHeaders({{{}: [{}, {!r}]}})Úutf8N)r   r•   r   Úformatr   )r   r˜   r™   rš   Ú
fooEncodedÚ
barEncodedr    r    r!   r›   S  s      ÿþzUnicodeHeadersTests.test_reprc              	   C  sT   d}d}d}d}d}G dd„ dt ƒ}|  t||||giƒƒd||| d	¡f ¡ d
S )r�   r˜   r¹   rš   zb'Foo'zb'bar\xe2\x98\x83'c                   @  s   e Zd ZdS )z;UnicodeHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNrž   r    r    r    r!   rŸ   r  s   rŸ   zFunnyHeaders({%s: [%s, %r]})r»   N)r   r   r•   r   )r   r˜   r™   rš   r½   r¾   rŸ   r    r    r!   r    g  s    ÿþz%UnicodeHeadersTests.test_subclassReprc                 C  s´   t ƒ }| ddg¡ | ¡ }|  | d¡dg¡ |  | d¡dg¡ | dd¡ |  | d¡dg¡ |  | d¡dg¡ | dd¡ |  | d¡ddg¡ |  | d¡ddg¡ d	S )
r¡   r#   u   fooâ˜ƒr   s   fooâ˜ƒr™   r§   r�   rF   Nr¢   r¤   r    r    r!   r¥   {  s    zUnicodeHeadersTests.test_copyN)r1   r2   r3   r4   rE   rK   rR   r¬   r¯   r°   r³   rW   rZ   r`   rd   rg   rj   rn   rr   ru   r„   r‹   rŽ   r›   r    r¥   r    r    r    r!   r¦   N  s.   
	
r¦   c                   @  s,   e Zd ZdZddœdd„Zddœdd„ZdS )	ÚMixedHeadersTestszm
    Tests for L{Headers}, mixing L{bytes} and L{str} arguments for methods
    where that is permitted.
    r   r   c                 C  sJ   t ƒ }| dd¡ | dd¡ |  | d¡dg¡ |  | d¡dg¡ dS )zL
        L{Headers.addRawHeader} accepts mixed L{str} and L{bytes}.
        ó   bytesr·   ó   Bytesó   strÚStrr5   NrV   rI   r    r    r!   rW   ž  s
    z#MixedHeadersTests.test_addRawHeaderc                 C  sš   t ƒ }| ddg¡ | ddg¡ | dddg¡ | dddg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡ddg¡ |  | d	¡d
dg¡ dS )zM
        L{Headers.setRawHeaders} accepts mixed L{str} and L{bytes}.
        rÀ   r·   z	mixed-strs   mixed-bytesrÁ   rÃ   z	Mixed-Strr5   s   Mixed-BytesrÂ   Nrf   rI   r    r    r!   rR   ©  s    z$MixedHeadersTests.test_setRawHeadersN)r1   r2   r3   r4   rW   rR   r    r    r    r!   r¿   ˜  s   r¿   N)r4   Ú
__future__r   Útypingr   Ztwisted.trial.unittestr   r   Ztwisted.web.http_headersr   r   r   Ztwisted.web.test.requesthelperr	   r
   r   r   rB   rC   r¦   r¿   r    r    r    r!   Ú<module>   s   3# d  L