
    JfZ                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZm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)TestCase)Headers)bytesLinearWhitespaceComponentssanitizedBytestextLinearWhitespaceComponentsc                   |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 name and 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 names and values; see
        C{textLinearWhitespaceComponents} and
        C{bytesLinearWhitespaceComponents}

    @param expected: The expected sanitized form of the component for
        both headers names and their values.
    N)appendr   addRawHeadersetRawHeadersassertEquallistgetAllRawHeadersgetRawHeaders)testCase
componentsexpected	componentheadersadded	setHeaderheaders           ]/var/www/cs2snipe.com/venv/lib/python3.12/site-packages/twisted/web/test/test_http_headers.pyassertSanitizedr      s    $   M	w	I;789	9i0uI		I;7y! 	MF  V,,./8hZ2H1I   !5!5h!?(L		MM    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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)r   r   r   selfs    r   test_sanitizeLinearWhitespacez/BytesHeadersTests.test_sanitizeLinearWhitespace>   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   r   r"   hs     r   test_initializerz"BytesHeadersTests.test_initializerE   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   value2   test   TestNr   r   
assertTrue	hasHeaderr   r   )r"   rawValuer)   s      r   test_setRawHeadersz$BytesHeadersTests.test_setRawHeadersM   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   r   r   r   r(   s     r   test_addRawHeaderz#BytesHeadersTests.test_addRawHeaderY   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   r   r!   s    r   test_getRawHeadersNoDefaultz-BytesHeadersTests.test_getRawHeadersNoDefaultc   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assertIdenticalr   r"   r)   defaults      r   test_getRawHeadersDefaultValuez0BytesHeadersTests.test_getRawHeadersDefaultValuej   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.
        value   keyr      valueN)r   r   assertIsInstancer   bytesr   rD   s      r   *test_getRawHeadersWithDefaultMatchingValuez<BytesHeadersTests.test_getRawHeadersWithDefaultMatchingValues   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.   r7   r/   Nr   r   r   r   r(   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.   r7   r/   Nr   r   r1   r2   r(   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   r2   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.
        r&   r7   r%   r8   s   BarNr   r   r1   r2   removeHeaderrY   r(   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   r   r   r(   s     r   test_removeHeaderDoesntExistz.BytesHeadersTests.test_removeHeaderDoesntExist   s5    
 I	wa0023R8r   c                   t               }| j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d	      d
       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       y)zk
        L{Headers._encodeName} returns the canonical capitalization for
        the given header.
        r.   r/   s
   test-stuffs
   Test-Stuffs   content-md5   Content-MD5s   dnts   DNTs   etags   ETags   p3ps   P3Ps   tes   TE   www-authenticate   WWW-Authenticates   WWW-authenticates   Www-Authenticates   x-xss-protections   X-XSS-ProtectionN)r   r   _encodeNamer(   s     r   test_encodeNamez!BytesHeadersTests.test_encodeName   s&   
 Iw/9}5}E~6Gv.7w/9v.7u-u5':;=PQ':;=PQ':;=PQ':;=PQr   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.      lemursrf      basic aksljdlk=rg   )rm   )r/   rl   Nr   r   r   tupler   r"   r)   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.
        r&   r8   r7   Nr   r   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&   Nr   rz   rB   r(   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.
        r&   r%      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.
        r&   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"}.
        r&   r%   r   c                      e Zd Zy)9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersN__name__
__module____qualname__r   r   r   FunnyHeadersr         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.   r&   r%   r   Nr   r   copyr   r   r   r"   r)   is      r   	test_copyzBytesHeadersTests.test_copy  s     I	&*FFH1F8<	w'1F8<	w'1FF3CDr   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-rH   N)r   range_MAX_CACHED_HEADERSr   r   len_canonicalHeaderCache)r"   r   r   s      r   test_max_cached_headersz)BytesHeadersTests.test_max_cached_headers-  sd     )w22S89 	8A  6!w7	8--.0K0K	
r   NreturnNone)r   r   r   __doc__r#   r*   r4   r:   r?   rF   rM   rQ   rU   rZ   r_   rc   ri   rv   r~   r   r   r   r   r   r   r   r   r   r   r   9   sv    O<
=I<I
G?.7. 9R$
"*'

"
"E	
r   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ddZddZy)UnicodeHeadersTestszC
    Tests for L{Headers}, using L{str} arguments for methods.
    c                .    t        | t        t               yr    )r   r	   r   r!   s    r   r#   z1UnicodeHeadersTests.test_sanitizeLinearWhitespace>  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   r&   r%   r   Nr'   r(   s     r   r*   z$UnicodeHeadersTests.test_initializerE  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-   testr.   r/   TestNr0   )r"   r3   rawEncodedValuer)   s       r   r4   z&UnicodeHeadersTests.test_setRawHeadersQ  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UnicodeEncodeErrorr   r2   r(   s     r   test_nameNotEncodablez)UnicodeHeadersTests.test_nameNotEncodablea  sx     I 12 	/OOHug.	/ 12 	"KK!	" 	"	/ 	/	" 	"s   A,A8,A58B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&      Nr0   r(   s     r   test_nameEncodingz%UnicodeHeadersTests.test_nameEncodingp  sf    
 I 	
6(+ 	G,-1F8< 	H-.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.
        r   r   r&   r   s   ☃Nr0   r(   s     r   test_rawHeadersValueEncodingz0UnicodeHeadersTests.test_rawHeadersValueEncoding  sQ    
 I	8V"45G,-1OV3LMr   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)r6   r   lemurpandar.   r7   r8   Nr9   r(   s     r   r:   z%UnicodeHeadersTests.test_addRawHeader  s~     I	vw'07)<	vw'07G2DE1Hh3GHr   c                T    | j                  t               j                  d             y)r<   r   Nr=   r!   s    r   r?   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)rA   r   Nr   )r   rB   rC   r   r   rD   s      r   rF   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.
        rJ   rI   keyr   rH   N)r   r   rK   r   strr   rD   s      r   rM   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)rO      testár      Testá   testr7      TestNrP   r(   s     r   rQ   z&UnicodeHeadersTests.test_getRawHeaders  s    
 I	wi06	B6	B5zB5zBr   c                >   t               }|j                  ddg       | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             y)rS   r   r   r   r   r   NrT   r(   s     r   rU   z&UnicodeHeadersTests.test_hasHeaderTrue  so    
 I	wi0L12L12K01K01r   c                T    | j                  t               j                  d             y)rW   r   NrX   r!   s    r   rZ   z'UnicodeHeadersTests.test_hasHeaderFalse  s    
 	,,\:;r   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   r&   r   r   Barr%   Nr]   r(   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)ra   r   Nrb   r(   s     r   rc   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 )	rk   r   lemurszwww-authenticatezbasic aksljdlk=zcontent-md5kjdfdfgdfgnsd>   r   ro   re   )s   kjdfdfgdfgnsdrn   Nrp   rr   s        r   rv   z)UnicodeHeadersTests.test_getAllRawHeaders  s     I	xj1	*->,?@	'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)rx      fooár   r   s   foor8   r7   Nry   )r"   r{   r|   r}   
firstBytessecondBytes
thirdBytess          r   r~   z*UnicodeHeadersTests.test_headersComparison  s   
 	K'3[7)4	K'7);<&'E5) Y
  hZ8i!!*xj9Y
  h-@A
+-
+r   c                    t               }| j                  |d       | j                  |t                      | j                  |d       y)r   r   r   Nr   r(   s     r   r   z(UnicodeHeadersTests.test_otherComparison$  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\xe1'z'bar\xe2\x98\x83'bzHeaders({{{}: [{}, {!r}]}})utf8N)r   r   r   formatencode)r"   r   r   r   
fooEncoded
barEncodeds         r   r   zUnicodeHeadersTests.test_repr.  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\xe1'zb'bar\xe2\x98\x83'c                      e Zd Zy);UnicodeHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNr   r   r   r   r   r   M  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_subclassReprB  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%   Nr   r   s      r   r   zUnicodeHeadersTests.test_copyV  s     I	{m4FFH 	6F58J7KL 	
|U+ 	6F58J7KL 	
|V, 	6e8LM58JF7STr   Nr   )r   r   r   r   r#   r*   r4   r   r   r   r:   r?   rF   rM   rQ   rU   rZ   r_   rc   rv   r~   r   r   r   r   r   r   r   r   r   9  sw    N
:D "/"N	I;

E
C
2<.$9
,,8&
(
(U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StrrL   Nr9   r(   s     r   r:   z#MixedHeadersTests.test_addRawHeadery  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-StrrL   s   Mixed-Bytesr   NrP   r(   s     r   r4   z$MixedHeadersTests.test_setRawHeaders  s     I	8*-	w'	h%67	(9:2XJ?/%957GH868:LMr   Nr   )r   r   r   r   r:   r4   r   r   r   r   r   s  s    
	<Nr   r   N)r   r   r   zSequence[bytes] | Sequence[str]r   rL   r   r   )r   
__future__r   typingr   twisted.trial.unittestr   twisted.web.http_headersr   twisted.web.test.requesthelperr   r   r	   r   r   r   r   r   r   r   <module>r      s{    #  + , "M"M$C"MOT"M	"MJ}
 }
@wU( wUt	N Nr   