
    VhMa                        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e      Z	 	 	 	 	 	 	 	 dd	Z G d
 de      Z G d de      Z G d de      Zy)z(
Tests for L{twisted.web.http_headers}.
    )annotations)Sequence)SynchronousTestCaseTestCase)HeadersInvalidHeaderName_nameEncoder)bytesLinearWhitespaceComponentssanitizedBytestextLinearWhitespaceComponentsc                  (    e Zd ZdZddZddZddZy)NameEncoderTestsz7
    Test L{twisted.web.http_headers._NameEncoder}
    c                2   | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d	      d
       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       y)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selfs    R/home/dcms/DCMS/lib/python3.12/site-packages/twisted/web/test/test_http_headers.pytest_encodeNamez NameEncoderTests.test_encodeName   s5   
 	,,W5w?,,];]K,,^<nM,,V4f=,,W5w?,,V4f=,,U3U;,,-@ACVW,,-@ACVW,,-@ACVW,,-@ACVW    c                2   | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d	      d
       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       y)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   s    r    test_encodeNameStrz#NameEncoderTests.test_encodeNameStr+   s5   
 	,,V4g>,,\:MJ,,];^L,,U3V<,,V4g>,,U3V<,,T2E:,,-?@BUV,,-?@BUV,,-?@BUV,,-?@BUVr"   c                    t               }t        t        j                  dz         D ]  }|j	                  d| d        | j                  t        t        j                        t        j                         y)zH
        Only a limited number of HTTP header names get cached.
           zhello-valueN)r   ranger	   _MAX_CACHED_HEADERSaddRawHeaderr   len_canonicalHeaderCache)r   headersis      r    test_maxCachedHeadersz&NameEncoderTests.test_maxCachedHeaders<   sd     )|77#=> 	8A  6!w7	8223\5U5U	
r"   NreturnNone)__name__
__module____qualname____doc__r!   r+   r6    r"   r    r   r      s    X"W"	
r"   r   c                   d}|D ]  }g }|j                  t        ||gi             t               }|j                  ||       |j                  |       t               }|j                  ||g       |j                  |       |D ]Q  }| j	                  t        |j                               ||gfg       | j	                  |j                  |      |g       S  y)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   r1   setRawHeadersr   listgetAllRawHeadersgetRawHeaders)	testCase
componentsexpectedname	componentr4   added	setHeaderheaders	            r    assertSanitizedrM   H   s    " D I	wyk234	4+uI	yk2y! 	IF  f&=&=&?!@D8*CUBVW  !5!5d!;hZH	IIr"   c                      e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZddZddZddZddZddZy)BytesHeadersTestszE
    Tests for L{Headers}, using L{bytes} arguments for methods.
    c                .    t        | t        t               yzf
        Linear whitespace in header names or values is replaced with a
        single space.
        N)rM   r
   r   r   s    r    test_sanitizeLinearWhitespacez/BytesHeadersTests.test_sanitizeLinearWhitespacep   s    
 	=~Nr"   c                d    t        ddgi      }| j                  |j                  d      dg       y)zx
        The header values passed to L{Headers.__init__} can be retrieved via
        L{Headers.getRawHeaders}.
        s   Foo   bar   fooNr   r   rD   r   hs     r    test_initializerz"BytesHeadersTests.test_initializerw   s0    
 VfX&'06(;r"   c                   ddg}t               }|j                  d|       | j                  |j                  d             | j                  |j                  d             | j	                  |j                  d      |       y)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   rawValuerX   s      r    test_setRawHeadersz$BytesHeadersTests.test_setRawHeaders   sf    
 y)I	*G,-G,-18<r"   c                    t               }|j                  dd       | j                  |j                  d      dg       |j                  dd       | j                  |j                  d      ddg       y)N
        L{Headers.addRawHeader} adds a new value for a given header.
        r      lemur   pandaNr   r1   r   rD   rW   s     r    test_addRawHeaderz#BytesHeadersTests.test_addRawHeader   s`     I	w)1H:>	w)1Hh3GHr"   c                T    | j                  t               j                  d             y)z
        L{Headers.getRawHeaders} returns L{None} if the header is not found and
        no default is specified.
        r   NassertIsNoner   rD   r   s    r    test_getRawHeadersNoDefaultz-BytesHeadersTests.test_getRawHeadersNoDefault   s    
 	')11':;r"   c                p    t               }t               }| j                  |j                  d|      |       y)o
        L{Headers.getRawHeaders} returns the specified default value when no
        header is found.
        r   N)r   objectassertIdenticalrD   r   rX   defaults      r    test_getRawHeadersDefaultValuez0BytesHeadersTests.test_getRawHeadersDefaultValue   s-    
 I(Q__Wg>Hr"   c                    t               }dg}|j                  d|       | j                  |j                  d|      d   t               | j                  |j                  d|      dg       y)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   bytesr   rq   s      r    *test_getRawHeadersWithDefaultMatchingValuez<BytesHeadersTests.test_getRawHeadersWithDefaultMatchingValue   s]     I)	(aoofg>qA5I9H:Fr"   c                    t               }|j                  ddg       | j                  |j                  d      dg       | j                  |j                  d      dg       y)m
        L{Headers.getRawHeaders} returns the values which have been set for a
        given header.
        r   rd   r   Nr   rA   r   rD   rW   s     r    test_getRawHeadersz$BytesHeadersTests.test_getRawHeaders   sQ    
 I	(,1H:>1H:>r"   c                    t               }|j                  ddg       | j                  |j                  d             | j                  |j                  d             y)i
        Check that L{Headers.hasHeader} returns C{True} when the given header
        is found.
        r   rd   r   Nr   rA   r^   r_   rW   s     r    test_hasHeaderTruez$BytesHeadersTests.test_hasHeaderTrue   sE    
 I	(,G,-G,-r"   c                T    | j                  t               j                  d             y)c
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        r   NassertFalser   r_   r   s    r    test_hasHeaderFalsez%BytesHeadersTests.test_hasHeaderFalse   s    
 	,,W56r"   c                   t               }|j                  ddg       | j                  |j                  d             |j	                  d       | j                  |j                  d             |j                  ddg       | j                  |j                  d             |j	                  d       | j                  |j                  d             y)N
        Check that L{Headers.removeHeader} removes the given header.
        rU   rd   rT   re   s   BarNr   rA   r^   r_   removeHeaderr   rW   s     r    test_removeHeaderz#BytesHeadersTests.test_removeHeader   s     I	
+F+,	vV,-	
+F+,	vV,-r"   c                    t               }|j                  d       | j                  t        |j	                               g        y)k
        L{Headers.removeHeader} is a no-operation when the specified header is
        not found.
        r   Nr   r   r   rB   rC   rW   s     r    test_removeHeaderDoesntExistz.BytesHeadersTests.test_removeHeaderDoesntExist   s5    
 I	wa0023R8r"   c                    t               }|j                  ddg       |j                  ddg       |j                         D ch c]  \  }}|t        |      f }}}| j	                  |ddh       yc c}}w )
        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=r   )r   r   )r   Nr   rA   rC   tupler   r   rX   kv
allHeaderss        r    test_getAllRawHeadersz'BytesHeadersTests.test_getAllRawHeaders   sv     I	)-	+.@-AB010B0B0DE1q%(mE
E9;RS	
 Fs   A3c                    t               }|j                  ddg       t               }|j                  ddg       t               }|j                  dddg       | j                  ||       | j                  ||       | j                  ||       y)
        A L{Headers} instance compares equal to itself and to another
        L{Headers} instance with the same values.
        rU   re   rd   Nr   rA   r   assertNotEqual)r   firstsecondthirds       r    test_headersComparisonz(BytesHeadersTests.test_headersComparison   s    
 	FXJ/VhZ0	FXx$89&'E5)r"   c                    t               }| j                  |d       | j                  |t                      | j                  |d       y)f
        An instance of L{Headers} does not compare equal to other unrelated
        objects.
        r>   rU   Nr   r   ro   rW   s     r    test_otherComparisonz&BytesHeadersTests.test_otherComparison  s=    
 IAr"Avx(Av&r"   c           
         d}d}d}| j                  t        t        |||gi            d|j                         d|d|d       y)	zy
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains.
        rU   rT      baz	Headers({: [, ]})Nr   reprr   
capitalizer   foobarbazs       r    	test_reprzBytesHeadersTests.test_repr  sW    
 #Sz*+,),CwbtD	
r"   c           
         d}d}d}| j                  t        t        |||gi            d|j                         d|d|d       y)	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.
        rU   s   bars   bazr   r   r   r   Nr   r   s       r    test_reprWithRawBytesz'BytesHeadersTests.test_reprWithRawBytes  sY      #Sz*+,),CwbtD	
r"   c           
         d}d}d} G d dt               }| j                  t         ||||gi            d|j                         d|d|d	       y
)
        The L{repr} of an instance of a subclass of L{Headers} uses the name
        of the subclass instead of the string C{"Headers"}.
        rU   rT   r   c                      e Zd Zy)9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNr:   r;   r<   r>   r"   r    FunnyHeadersr   6      r"   r   FunnyHeaders({r   r   r   N)r   r   r   r   )r   r   r   r   r   s        r    test_subclassReprz#BytesHeadersTests.test_subclassRepr-  se    
 	7 	 	sS#J/01cnn.1SG2cWDI	
r"   c                t   t               }|j                  ddg       |j                         }| j                  |j	                  d      dg       |j                  dd       | j                  |j	                  d      dg       |j                  dd       | j                  |j	                  d      ddg       y)
        L{Headers.copy} creates a new independent copy of an existing
        L{Headers} instance, allowing future modifications without impacts
        between the copies.
        r   rU   rT   r   Nr   rA   copyr   rD   r1   r   rX   r5   s      r    	test_copyzBytesHeadersTests.test_copy>  s     I	&*FFH1F8<	w'1F8<	w'1FF3CDr"   Nr7   )r:   r;   r<   r=   rR   rY   ra   rg   rl   rs   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r>   r"   r    rO   rO   k   sk    O<
=I<I
G?.7. 9
"*'

"
"Er"   rO   c                      e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZddZddZddZddZddZddZddZddZy)UnicodeHeadersTestszC
    Tests for L{Headers}, using L{str} arguments for methods.
    c                .    t        | t        t               yrQ   )rM   r   r   r   s    r    rR   z1UnicodeHeadersTests.test_sanitizeLinearWhitespaceS  s    
 	<nMr"   c                    t        ddgi      }| j                  |j                  d      dg       | j                  |j                  d      dg       y)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   rU   rT   r   NrV   rW   s     r    rY   z$UnicodeHeadersTests.test_initializerZ  sK     UUG$%06(;/%9r"   c                   ddg}ddg}t               }|j                  d|       | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             | j	                  |j                  d      |       | j	                  |j                  d      |       y	)
z
        L{Headers.setRawHeaders} sets the header values for the given
        header name to the sequence of strings, encoded.
        value1value2r[   r\   r$   r   r   TestNr]   )r   r`   rawEncodedValuerX   s       r    ra   z&UnicodeHeadersTests.test_setRawHeadersf  s    
 h'$i0I	)G,-G,-F+,F+,0(;1?Cr"   c                   t               }| j                  t              5  |j                  ddg       ddd       | j                  t              5  |j	                  d       ddd       y# 1 sw Y   9xY w# 1 sw Y   yxY w)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   r_   rW   s     r    test_nameNotEncodablez)UnicodeHeadersTests.test_nameNotEncodablev  sx     I 12 	/OOHug.	/ 12 	"KK!	" 	"	/ 	/	" 	"s   A,A8,A58Bc                v   t               }| j                  t        |j                  ddg       | j                  t        |j                  ddg       | j                  t        |j                  ddg       | j                  t        |j                  ddg       | j                  t        |j                  ddg       y)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   rW   s     r    test_nameNotTokenz%UnicodeHeadersTests.test_nameNotToken  s    
 I 	+Q__gxP+Q__hQ 	+Q__fvhO+Q__fvhO+Q__fvhOr"   c                   t               }|j                  ddg       | j                  |j                  d             | j	                  |j                  d      dg       | j                  |j                  d             y)z}
        Passing L{str} to any function that takes a header name will encode
        said header name as ISO-8859-1.
        r   rU   rT   Nr]   rW   s     r    test_nameEncodingz%UnicodeHeadersTests.test_nameEncoding  sf    
 I 	
x( 	F+,06(; 	E*+r"   c                    t               }|j                  dddg       | j                  |j                  d             | j	                  |j                  d      ddg       y)z|
        Passing L{str} to L{Headers.setRawHeaders} will encode the name as
        ISO-8859-1 and values as UTF-8.
        xr   rU      xs   ☃Nr]   rW   s     r    test_rawHeadersValueEncodingz0UnicodeHeadersTests.test_rawHeadersValueEncoding  sQ    
 I	h/0D)*.&0IJr"   c                0   t               }|j                  dd       | j                  |j                  d      dg       |j                  dd       | j                  |j                  d      ddg       | j                  |j                  d      ddg       y)rc   r$   lemurpandar   rd   re   Nrf   rW   s     r    rg   z%UnicodeHeadersTests.test_addRawHeader  s~     I	vw'07)<	vw'07G2DE1Hh3GHr"   c                T    | j                  t               j                  d             y)ri   r$   Nrj   r   s    r    rl   z/UnicodeHeadersTests.test_getRawHeadersNoDefault  s    
 	')11&9:r"   c                D   t               }t               }| j                  |j                  d|      |       | j                  |j                  dd      d       | j	                  |j                  ddg      dg       | j	                  |j                  ddg      dg       y)rn   r$   Nr   )r   ro   rp   rD   r   rq   s      r    rs   z2UnicodeHeadersTests.test_getRawHeadersDefaultValue  s    
 I(Q__VW=wGQ__VT:DA$84&AOOF]O4O	
r"   c                    t               }dg}|j                  d|       | j                  |j                  d|      d   t               | j                  |j                  d|      dg       y)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.
        rv   ru   keyr   r.   N)r   rA   rw   rD   strr   rq   s      r    ry   z>UnicodeHeadersTests.test_getRawHeadersWithDefaultMatchingValue  s]     I*	(aooeW=a@#F87)Dr"   c                N   t               }|j                  ddg       | j                  |j                  d      dg       | j                  |j                  d      dg       | j                  |j                  d      dg       | j                  |j                  d      dg       y)r{   r$   r   r   r   rd   r   Nr|   rW   s     r    r}   z&UnicodeHeadersTests.test_getRawHeaders  s    
 I		*07)<07)<1H:>1H:>r"   c                >   t               }|j                  ddg       | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             y)r   r$   r   r   r   r   Nr   rW   s     r    r   z&UnicodeHeadersTests.test_hasHeaderTrue  so    
 I		*F+,F+,G,-G,-r"   c                T    | j                  t               j                  d             y)r   r$   Nr   r   s    r    r   z'UnicodeHeadersTests.test_hasHeaderFalse  s    
 	,,V45r"   c                (   t               }|j                  ddg       | j                  |j                  d             |j	                  d       | j                  |j                  d             | j                  |j                  d             |j                  ddg       | j                  |j                  d             |j	                  d       | j                  |j                  d             | j                  |j                  d             y)	r   r   r   rU   r   r   BarrT   Nr   rW   s     r    r   z%UnicodeHeadersTests.test_removeHeader  s     I	y)E*+	uU+,V,-	y)E*+	uU+,V,-r"   c                    t               }|j                  d       | j                  t        |j	                               g        y)r   r$   Nr   rW   s     r    r   z0UnicodeHeadersTests.test_removeHeaderDoesntExist  s5    
 I	va0023R8r"   c                   t               }|j                  ddg       |j                  ddg       |j                  ddg       |j                         D ch c]  \  }}|t        |      f }}}| j	                  |h d       yc c}}w )	r   r$   lemursr*   zbasic aksljdlk=r%   kjdfdfgdfgnsd>   r   )s   kjdfdfgdfgnsdr   r   Nr   r   s        r    r   z)UnicodeHeadersTests.test_getAllRawHeaders  s     I	
+	*->,?@	'89010B0B0DE1q%(mE
E	
 Fs   Bc                <   t               }|j                  ddg       t               }|j                  ddg       t               }|j                  dddg       | j                  ||       | j                  ||       | j                  ||       t               }|j                  ddg       t               }|j                  ddg       t               }|j                  dddg       | j                  ||       | j                  ||       | j                  ||       y)r   r   r   r   rU   re   rd   Nr   )r   r   r   r   
firstBytessecondBytes
thirdBytess          r    r   z*UnicodeHeadersTests.test_headersComparison-  s   
 	EG9-UWI.	EGW#56&'E5) Y
  (4i!!&8*5Y
  (G)<=
+-
+r"   c                    t               }| j                  |d       | j                  |t                      | j                  |d       y)r   r>   r   Nr   rW   s     r    r   z(UnicodeHeadersTests.test_otherComparisonI  s=    
 IAr"Avx(Au%r"   c           
         d}d}d}d}d}d|z   }d|z   }| j                  t        t        |||gi            dj                  |||j	                  d                   y	)
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
barEncodeds         r    r   zUnicodeHeadersTests.test_reprS  ss     
+
:%
:%
#Sz*+,)00J

6(:	
r"   c                    d}d}d}d}d} G d dt               }| j                  t         ||||gi            d|d	|d
|j                  d      d       y)r   r   r   r   zb'Foo'zb'bar\xe2\x98\x83'c                      e Zd Zy);UnicodeHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNr   r>   r"   r    r   r  r  r   r"   r   r   r   r   r   r   N)r   r   r   r   )r   r   r   r   r   r   r   s          r    r   z%UnicodeHeadersTests.test_subclassReprg  sd    
 
,
	7 	 	sS#J/01:szz&'9;	
r"   c                B   t               }|j                  ddg       |j                         }| j                  |j	                  d      dg       | j                  |j	                  d      dg       |j                  dd       | j                  |j	                  d      dg       | j                  |j	                  d      dg       |j                  dd       | j                  |j	                  d      ddg       | j                  |j	                  d      ddg       y	)
r   r$   u   foo☃r   s   foo☃r   r   r   rT   Nr   r   s      r    r   zUnicodeHeadersTests.test_copy{  s     I	.FFH 	0;-@14F3GH 	
vu% 	0;-@14F3GH 	
vv& 	0;2FG14F3OPr"   Nr7   )r:   r;   r<   r=   rR   rY   ra   r   r   r   r   rg   rl   rs   ry   r}   r   r   r   r   r   r   r   r   r   r   r>   r"   r    r   r   N  s|    N
:D "P ,"K	I;

E
?
.6.$9
,,8&
(
(Qr"   r   c                       e Zd ZdZddZddZy)MixedHeadersTestszm
    Tests for L{Headers}, mixing L{bytes} and L{str} arguments for methods
    where that is permitted.
    c                    t               }|j                  dd       |j                  dd       | j                  |j                  d      dg       | j                  |j                  d      dg       y)zL
        L{Headers.addRawHeader} accepts mixed L{str} and L{bytes}.
           bytesr      Bytes   strStrrx   Nrf   rW   s     r    rg   z#MixedHeadersTests.test_addRawHeader  s]     I	x'	uh'2VH=/';r"   c                   t               }|j                  ddg       |j                  ddg       |j                  dddg       |j                  dddg       | j                  |j                  d      dg       | j                  |j                  d      dg       | j                  |j                  d      ddg       | j                  |j                  d	      d
dg       y)zM
        L{Headers.setRawHeaders} accepts mixed L{str} and L{bytes}.
        r  r   z	mixed-strs   mixed-bytesr  r
  z	Mixed-Strrx   s   Mixed-Bytesr	  Nr|   rW   s     r    ra   z$MixedHeadersTests.test_setRawHeaders  s     I	8*-	w'	h%67	(9:2XJ?/%957GH868:LMr"   Nr7   )r:   r;   r<   r=   rg   ra   r>   r"   r    r  r    s    
	<Nr"   r  N)rE   r   rF   zSequence[bytes] | Sequence[str]rG   rx   r8   r9   )r=   
__future__r   typingr   twisted.trial.unittestr   r   twisted.web.http_headersr   r   r	   twisted.web.test.requesthelperr
   r   r   r   rM   rO   r   r  r>   r"   r    <module>r     s    #  @ M M 0
* 0
f I I$C IOT I	 IF`E `EFGQ( GQT
N Nr"   