o
    ¼>hMa  ã                   @  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    ú‚/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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   Údntr   Úetagr   Ú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   Ú_MAX_CACHED_HEADERSÚaddRawHeaderr   ÚlenÚ_canonicalHeaderCache)r   ÚheadersÚir    r    r!   Útest_maxCachedHeaders<   s   ÿz&NameEncoderTests.test_maxCachedHeadersN©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r+   r5   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   r0   ÚsetRawHeadersr   ÚlistÚgetAllRawHeadersÚgetRawHeaders)	r;   r<   r>   ÚnameÚ	componentr3   ÚaddedÚ	setHeaderÚheaderr    r    r!   ÚassertSanitizedH   s   

þôrJ   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)rJ   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   rD   ©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   rA   Ú
assertTrueÚ	hasHeaderr   rD   )r   ÚrawValuerT   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   r0   r   rD   rS   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©ÚassertIsNoner   rD   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ÚassertIdenticalrD   ©r   rT   Ú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   rA   ÚassertIsInstancerD   r?   r   rk   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   r^   r   N©r   rA   r   rD   rS   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   r^   r   N©r   rA   rY   rZ   rS   r    r    r!   Útest_hasHeaderTrue»   s   z$BytesHeadersTests.test_hasHeaderTruec                 C  rb   )úc
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        r   N©ÚassertFalser   rZ   r   r    r    r!   Útest_hasHeaderFalseÅ   rg   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.
        rQ   r^   rP   r_   s   BarN©r   rA   rY   rZ   ÚremoveHeaderr{   rS   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   r   r   rB   rC   rS   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   rA   rC   r   ©r   rT   Ú
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.
        rQ   r_   r^   N©r   rA   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    rQ   N©r   rš   ri   rS   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.
        rQ   rP   ó   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.
        rQ   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"}.
        rQ   rP   r¥   c                   @  ó   e Zd ZdS )z9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersN©r7   r8   r9   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   rQ   rP   r¥   N©r   rA   Úcopyr   rD   r0   ©r   rT   r4   r    r    r!   Ú	test_copy>  s   zBytesHeadersTests.test_copyNr6   )r7   r8   r9   r:   rN   rU   r\   ra   rf   rm   rq   ru   rx   r|   r€   r„   r—   rž   r¢   r±   r²   r¸   r½   r    r    r    r!   rK   k   s*    







	







	





rK   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  rL   rM   )rJ   r   r
   r   r    r    r!   rN   S  rO   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.
        ÚFoor¯   rQ   rP   r®   NrR   rS   r    r    r!   rU   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.
        Úvalue1Úvalue2rV   rW   r$   r   r   ÚTestNrX   )r   r[   ÚrawEncodedValuerT   r    r    r!   r\   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ÚUnicodeEncodeErrorrA   rZ   rS   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   rA   rS   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¯   rQ   rP   NrX   rS   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Ä   rQ   ó   xs   â˜ƒNrX   rS   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 )r]   r$   ÚlemurÚpandar   r^   r_   Nr`   rS   r    r    r!   ra   °  s   z%UnicodeHeadersTests.test_addRawHeaderc                 C  rb   )rc   r$   Nrd   r   r    r    r!   rf   »  rg   z/UnicodeHeadersTests.test_getRawHeadersNoDefaultc                 C  sh   t ƒ }tƒ }|  | d|¡|¡ |  | dd¡d¡ |  | ddg¡dg¡ |  | ddg¡dg¡ dS )rh   r$   NrÄ   )r   ri   rj   rD   r   rk   r    r    r!   rm   Â  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.
        ro   rn   Úkeyr   r-   N)r   rA   rp   rD   Ústrr   rk   r    r    r!   rq   Ñ  rr   z>UnicodeHeadersTests.test_getRawHeadersWithDefaultMatchingValuec                 C  sh   t ƒ }| ddg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ dS )rs   r$   rÐ   rÂ   r   r^   r   Nrt   rS   r    r    r!   ru   Ý  s   z&UnicodeHeadersTests.test_getRawHeadersc                 C  sX   t ƒ }| ddg¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ dS )rv   r$   rÐ   rÂ   r   r   Nrw   rS   r    r    r!   rx   é  s   z&UnicodeHeadersTests.test_hasHeaderTruec                 C  rb   )ry   r$   Nrz   r   r    r    r!   r|   õ  rg   z'UnicodeHeadersTests.test_hasHeaderFalsec                 C  sš   t ƒ }| ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ | ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ dS )	r}   r®   rÐ   rQ   r¯   rÑ   ÚBarrP   Nr~   rS   r    r    r!   r€   ü  s   

z%UnicodeHeadersTests.test_removeHeaderc                 C  r   )r‚   r$   Nrƒ   rS   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$   Úlemursr*   zbasic aksljdlk=r%   Úkjdfdfgdfgnsdc                 S  r‰   r    rŠ   rŒ   r    r    r!   r   "  r‘   z<UnicodeHeadersTests.test_getAllRawHeaders.<locals>.<setcomp>>   ©r   )s   kjdfdfgdfgnsdr“   r’   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Ð   rQ   r_   r^   Nr™   )r   r›   rœ   r   Ú
firstBytesÚsecondBytesÚ
thirdBytesr    r    r!   rž   -  s$   z*UnicodeHeadersTests.test_headersComparisonc                 C  rŸ   )r    r    r®   Nr¡   rS   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¥   rP   Nrº   r¼   r    r    r!   r½   {  s   zUnicodeHeadersTests.test_copyNr6   )r7   r8   r9   r:   rN   rU   r\   rÈ   rË   rÌ   rÏ   ra   rf   rm   rq   ru   rx   r|   r€   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`   rS   r    r    r!   ra   ž  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ä   Nrt   rS   r    r    r!   r\   ©  s   z$MixedHeadersTests.test_setRawHeadersNr6   )r7   r8   r9   r:   ra   r\   r    r    r    r!   rá   ˜  s    
rá   N)r;   r   r<   r=   r>   r?   r   r   )r:   Ú
__future__r   Útypingr   Útwisted.trial.unittestr   r   Útwisted.web.http_headersr   r   r   Útwisted.web.test.requesthelperr	   r
   r   r   rJ   rK   r¾   rá   r    r    r    r!   Ú<module>   s   
3# d  L