o
    Óó·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„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„Zddd„Zddd	„Zd
S )ÚNameEncoderTestsz7
    Test L{twisted.web.http_headers._NameEncoder}
    ÚreturnÚNonec                 C  óÊ   |   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    úhC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/web/test/test_http_headers.pyÚtest_encodeName   ó   z NameEncoderTests.test_encodeNamec                 C  r   )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+   r#   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©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r)   r1   r    r    r    r!   r      s
    

r   ÚtestCaser   Ú
componentsúSequence[bytes] | Sequence[str]ÚexpectedÚbytesr   r   c           	      C  sž   d}|D ]H}g }|  t||giƒ¡ tƒ }| ||¡ |  |¡ tƒ }| ||g¡ |  |¡ |D ]}|  t| ¡ ƒ||gfg¡ |  | |¡|g¡ q1q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)	r7   r8   r:   ÚnameÚ	componentr/   ÚaddedZ	setHeaderÚheaderr    r    r!   ÚassertSanitizedH   s   

þôrE   c                   @  sÎ   e Zd ZdZd+dd„Zd+dd„Zd+dd	„Zd+d
d„Zd+dd„Zd+dd„Z	d+dd„Z
d+dd„Zd+dd„Zd+dd„Zd+dd„Zd+dd„Zd+dd„Zd+dd„Zd+d d!„Zd+d"d#„Zd+d$d%„Zd+d&d'„Zd+d(d)„Zd*S ),ÚBytesHeadersTestszE
    Tests for L{Headers}, using L{bytes} arguments for methods.
    r   r   c                 C  ó   t | ttƒ dS ©zf
        Linear whitespace in header names or values is replaced with a
        single space.
        N)rE   r	   r
   r   r    r    r!   Útest_sanitizeLinearWhitespacep   ó   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   ÚrawValuerO   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@   rN   r    r    r!   Útest_addRawHeader‹   s
   z#BytesHeadersTests.test_addRawHeaderc                 C  ó   |   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•   ó   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   rO   Ú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@   r;   r   re   r    r    r!   Ú*test_getRawHeadersWithDefaultMatchingValue¥   ó
   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   rY   r   N©r   r=   r   r@   rN   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   rY   r   N©r   r=   rT   rU   rN   r    r    r!   Útest_hasHeaderTrue»   s   z$BytesHeadersTests.test_hasHeaderTruec                 C  r]   )úc
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        r   N©ÚassertFalser   rU   r   r    r    r!   Útest_hasHeaderFalseÅ   ra   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.
        rL   rY   rK   rZ   s   BarN©r   r=   rT   rU   ÚremoveHeaderru   rN   r    r    r!   Útest_removeHeaderÌ   s   

z#BytesHeadersTests.test_removeHeaderc                 C  ó(   t ƒ }| d¡ |  t| ¡ ƒg ¡ dS )úk
        L{Headers.removeHeader} is a no-operation when the specified header is
        not found.
        r   N©r   ry   r   r>   r?   rN   r    r    r!   Útest_removeHeaderDoesntExistÜ   ó   
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  ó   h | ]
\}}|t |ƒf’qS r    ©Útuple©Ú.0ÚkÚvr    r    r!   Ú	<setcomp>ï   ó    z:BytesHeadersTests.test_getAllRawHeaders.<locals>.<setcomp>©r   )r‚   ©r   )r�   N©r   r=   r?   r   ©r   rO   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.
        rL   rZ   rY   N©r   r=   r   ÚassertNotEqual)r   ÚfirstÚsecondÚthirdr    r    r!   Útest_headersComparisonö   s   z(BytesHeadersTests.test_headersComparisonc                 C  ó0   t ƒ }|  |d¡ |  |tƒ ¡ |  |d¡ dS )úf
        An instance of L{Headers} does not compare equal to other unrelated
        objects.
        r    rL   N©r   r“   rc   rN   r    r    r!   Útest_otherComparison  ó   z&BytesHeadersTests.test_otherComparisonc              
   C  óD   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.
        rL   rK   ó   bazú	Headers({ú: [ú, ú]})N©r   Úreprr   Ú
capitalize©r   ÚfooÚbarÚbazr    r    r!   Ú	test_repr  s   þzBytesHeadersTests.test_reprc              
   C  r�   )	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.
        rL   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"}.
        rL   rK   rž   c                   @  ó   e Zd ZdS )z9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersN©r3   r4   r5   r    r    r    r!   ÚFunnyHeaders6  ó    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   rL   rK   rž   N©r   r=   Úcopyr   r@   r-   ©r   rO   r0   r    r    r!   Ú	test_copy>  s   zBytesHeadersTests.test_copyNr2   )r3   r4   r5   r6   rI   rP   rW   r\   r`   rg   rk   ro   rr   rv   rz   r~   r�   r—   r›   rª   r«   r±   r¶   r    r    r    r!   rF   k   s*    







	







	





rF   c                   @  sì   e Zd ZdZd1dd„Zd1dd„Zd1dd	„Zd1d
d„Zd1dd„Zd1dd„Z	d1dd„Z
d1dd„Zd1dd„Zd1dd„Zd1dd„Zd1dd„Zd1dd„Zd1dd„Zd1d d!„Zd1d"d#„Zd1d$d%„Zd1d&d'„Zd1d(d)„Zd1d*d+„Zd1d,d-„Zd1d.d/„Zd0S )2ÚUnicodeHeadersTestszC
    Tests for L{Headers}, using L{str} arguments for methods.
    r   r   c                 C  rG   rH   )rE   r   r
   r   r    r    r!   rI   S  rJ   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¨   rL   rK   r§   NrM   rN   r    r    r!   rP   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value2rQ   rR   r$   r   r   ÚTestNrS   )r   rV   ZrawEncodedValuerO   r    r    r!   rW   f  s   z&UnicodeHeadersTests.test_setRawHeadersc                 C  sx   t ƒ }|  t¡� | ddg¡ W d  ƒ n1 sw   Y  |  t¡� | d¡ W d  ƒ dS 1 s5w   Y  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=   rU   rN   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=   rN   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¨   rL   rK   NrS   rN   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¹   rL   ó   xs   â˜ƒNrS   rN   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 )rX   r$   ÚlemurÚpandar   rY   rZ   Nr[   rN   r    r    r!   r\   °  s   z%UnicodeHeadersTests.test_addRawHeaderc                 C  r]   )r^   r$   Nr_   r   r    r    r!   r`   »  ra   z/UnicodeHeadersTests.test_getRawHeadersNoDefaultc                 C  sh   t ƒ }tƒ }|  | d|¡|¡ |  | dd¡d¡ |  | ddg¡dg¡ |  | ddg¡dg¡ dS )rb   r$   Nr¹   )r   rc   rd   r@   r   re   r    r    r!   rg   Â  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.
        ri   rh   Úkeyr   r+   N)r   r=   rj   r@   Ústrr   re   r    r    r!   rk   Ñ  rl   z>UnicodeHeadersTests.test_getRawHeadersWithDefaultMatchingValuec                 C  sh   t ƒ }| ddg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ dS )rm   r$   rÅ   r¸   r   rY   r   Nrn   rN   r    r    r!   ro   Ý  s   z&UnicodeHeadersTests.test_getRawHeadersc                 C  sX   t ƒ }| ddg¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ dS )rp   r$   rÅ   r¸   r   r   Nrq   rN   r    r    r!   rr   é  s   z&UnicodeHeadersTests.test_hasHeaderTruec                 C  r]   )rs   r$   Nrt   r   r    r    r!   rv   õ  ra   z'UnicodeHeadersTests.test_hasHeaderFalsec                 C  sš   t ƒ }| ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ | ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ dS )	rw   r§   rÅ   rL   r¨   rÆ   ÚBarrK   Nrx   rN   r    r    r!   rz   ü  s   

z%UnicodeHeadersTests.test_removeHeaderc                 C  r{   )r|   r$   Nr}   rN   r    r    r!   r~     r   z0UnicodeHeadersTests.test_removeHeaderDoesntExistc                 C  sV   t ƒ }| ddg¡ | ddg¡ | ddg¡ dd„ | ¡ D ƒ}|  |h d	£¡ d
S )r€   r$   Zlemursr(   zbasic aksljdlk=r%   Zkjdfdfgdfgnsdc                 S  rƒ   r    r„   r†   r    r    r!   rŠ   "  r‹   z<UnicodeHeadersTests.test_getAllRawHeaders.<locals>.<setcomp>>   rŒ   r�   )r   )s   kjdfdfgdfgnsdNrŽ   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Å   rL   rZ   rY   Nr’   )r   r”   r•   r–   Z
firstBytesZsecondBytesZ
thirdBytesr    r    r!   r—   -  s$   z*UnicodeHeadersTests.test_headersComparisonc                 C  r˜   )r™   r    r§   Nrš   rN   r    r    r!   r›   I  rœ   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                   @  r­   )z;UnicodeHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNr®   r    r    r    r!   r¯   r  r°   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ž   rK   Nr³   rµ   r    r    r!   r¶   {  s   zUnicodeHeadersTests.test_copyNr2   )r3   r4   r5   r6   rI   rP   rW   r½   rÀ   rÁ   rÄ   r\   r`   rg   rk   ro   rr   rv   rz   r~   r�   r—   r›   rª   r±   r¶   r    r    r    r!   r·   N  s0    

















	




r·   c                   @  s$   e Zd ZdZd	dd„Z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ÚStrr;   Nr[   rN   r    r    r!   r\   ž  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-Strr;   s   Mixed-BytesrÓ   Nrn   rN   r    r    r!   rW   ©  s   z$MixedHeadersTests.test_setRawHeadersNr2   )r3   r4   r5   r6   r\   rW   r    r    r    r!   rÐ   ˜  s    
rÐ   N)r7   r   r8   r9   r:   r;   r   r   )r6   Ú
__future__r   Útypingr   Ztwisted.trial.unittestr   r   Ztwisted.web.http_headersr   r   r   Ztwisted.web.test.requesthelperr	   r
   r   r   rE   rF   r·   rÐ   r    r    r    r!   Ú<module>   s   
3# d  L