
    Ϫfa                        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           D/usr/lib/python3/dist-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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}.
           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                  t        |j                  dddi       y)zN
        L{Headers.setRawHeaders} requires values to be of type list.
           keyr%   r&   Nr   assertRaises	TypeErrorr   r)   s     r   )test_rawHeadersTypeCheckingValuesIterablez;BytesHeadersTests.test_rawHeadersTypeCheckingValuesIterableY   s(     I)Q__fvv>NOr   c                    t               }| j                  t        |j                  ddg      }| j	                  |j
                  d   d       y)zf
        L{Headers.setRawHeaders} requires C{name} to be a L{bytes} or
        L{str} string.
        Nr'   r   BHeader name is an instance of <class 'NoneType'>, not bytes or strr   r9   r:   r   r   argsr"   r*   es      r   test_rawHeadersTypeCheckingNamez1BytesHeadersTests.test_rawHeadersTypeCheckingName`   sC    
 Ii$IFF1IS	
r   c                    t               }| j                  t        |j                  dddg      }| j	                  |j
                  d   d       y)zn
        L{Headers.setRawHeaders} requires values to a L{list} of L{bytes} or
        L{str} strings.
        r7   r&   Nr   zQHeader value at position 1 is an instance of <class 'NoneType'>, not bytes or strr>   r@   s      r   *test_rawHeadersTypeCheckingValuesAreStringz<BytesHeadersTests.test_rawHeadersTypeCheckingValuesAreStringl   sG    
 Ii&64.QFF1I	
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d      }| j	                  |j
                  d   d       y)ze
        L{Headers.addRawHeader} requires C{name} to be a L{bytes} or L{str}
        string.
        Nr'   r   r=   r   r9   r:   r   r   r?   r@   s      r   test_addRawHeaderTypeCheckNamez0BytesHeadersTests.test_addRawHeaderTypeCheckName   sA    
 IivFFF1IS	
r   c                    t               }| j                  t        |j                  dd      }| j	                  |j
                  d   d       y)zc
        L{Headers.addRawHeader} requires value to be a L{bytes} or L{str}
        string.
        r7   Nr   zCHeader value is an instance of <class 'NoneType'>, not bytes or strrL   r@   s      r   test_addRawHeaderTypeCheckValuez1BytesHeadersTests.test_addRawHeaderTypeCheckValue   sA    
 IiFFF1IT	
r   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_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assertIdenticalr   r"   r*   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.
        valuer7   r      valueN)r   r   assertIsInstancer   bytesr   rY   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/   rG   r0   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/   rG   r0   Nr   r   r2   r3   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   r3   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'   rG   r&   rH   s   BarNr   r   r2   r3   removeHeaderrm   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   rr   r   r   r   r)   s     r   test_removeHeaderDoesntExistz.BytesHeadersTests.test_removeHeaderDoesntExist   s5    
 I	wa0023R8r   c                j   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       y)zr
        L{Headers._canonicalNameCaps} returns the canonical capitalization for
        the given header.
        r/   r0   s
   test-stuffs
   Test-Stuffs   content-md5   Content-MD5s   dnts   DNTs   etags   ETags   p3ps   P3Ps   tes   TE   www-authenticate   WWW-Authenticates   x-xss-protections   X-XSS-ProtectionN)r   r   _canonicalNameCapsr)   s     r   test_canonicalNameCapsz(BytesHeadersTests.test_canonicalNameCaps   s   
 I--g6@--m<mL--n=~N--f5v>--g6@--f5v>--e4e<--.ABDWX--.ABDWXr   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/      lemursrz      basic aksljdlk=r{   )r   )r0   r   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'   rH   rG   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   r   rW   r)   s     r   test_otherComparisonz&BytesHeadersTests.test_otherComparison  s=    
 IAr"Avx(Av&r   c           
     t    d}d}d}| j                  t        t        |||gi            d|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   r"   foobarbazs       r   	test_reprzBytesHeadersTests.test_repr%  sO    
 #Sz*+,s3'C7$7	
r   c           
     t    d}d}d}| j                  t        t        |||gi            d|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_reprWithRawBytes2  sQ      #Sz*+,s3'C7$7	
r   c           
         d}d}d} G d dt               }| j                  t         ||||gi            d|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   L      r   r   FunnyHeaders({r   r   r   N)r   r   r   )r"   r   r   r   r   s        r   test_subclassReprz#BytesHeadersTests.test_subclassReprC  s]    
 	7 	 	sS#J/01cWCwbt<	
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_copyT  s     I	&*FFH1F8<	w'1F8<	w'1FF3CDr   NreturnNone)r   r   r   __doc__r#   r+   r5   r;   rB   rD   rJ   rM   rO   rT   r[   ra   re   ri   rn   rs   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   9   s    O<
=P


I



<I
G?.7. 9Y 
"*'

"
"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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_sanitizeLinearWhitespacei  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_initializerp  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/   r0   TestNr1   )r"   r4   rawEncodedValuer*   s       r   r5   z&UnicodeHeadersTests.test_setRawHeaders|  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   r9   UnicodeEncodeErrorr   r3   r)   s     r   test_nameNotEncodablez)UnicodeHeadersTests.test_nameNotEncodable  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'      Nr1   r)   s     r   test_nameEncodingz%UnicodeHeadersTests.test_nameEncoding  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   ☃Nr1   r)   s     r   test_rawHeadersValueEncodingz0UnicodeHeadersTests.test_rawHeadersValueEncoding  sQ    
 I	8V"45G,-1OV3LMr   c                `    t               }| j                  t        |j                  dddi       y)zQ
        L{Headers.setRawHeaders} requires values to be of type sequence
        keyr   r   Nr8   r)   s     r   test_rawHeadersTypeCheckingz/UnicodeHeadersTests.test_rawHeadersTypeChecking  s'     I)Q__eeU^Lr   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)rF   r   lemurpandar/   rG   rH   NrI   r)   s     r   rJ   z%UnicodeHeadersTests.test_addRawHeader  s~     I	vw'07)<	vw'07G2DE1Hh3GHr   c                T    | j                  t               j                  d             y)rQ   r   NrR   r!   s    r   rT   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)rV   r   Nr   )r   rW   rX   r   r   rY   s      r   r[   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.
        r^   r7   r   r   r]   N)r   r   r_   r   strr   rY   s      r   ra   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)rc      testár      Testá   testrG      TestNrd   r)   s     r   re   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)rg   r   r   r   r   r   Nrh   r)   s     r   ri   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)rk   r   Nrl   r!   s    r   rn   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)	rp   r   r   r'   r   r   Barr&   Nrq   r)   s     r   rs   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)ru   r   Nrv   r)   s     r   rw   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   lemurszwww-authenticatezbasic aksljdlk=zcontent-md5kjdfdfgdfgnsd>   r   r   ry   )s   kjdfdfgdfgnsdr   Nr   r   s        r   r   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)r      fooár   r   s   foorH   rG   Nr   )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_otherComparisonV  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     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_subclassReprt  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_copy  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+   r5   r   r   r   r   rJ   rT   r[   ra   re   ri   rn   rs   rw   r   r   r   r   r   r   r   r   r   r   r   d  s}    N
:D "/"NM	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Strr`   NrI   r)   s     r   rJ   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-Strr`   s   Mixed-Bytesr  Nrd   r)   s     r   r5   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   rJ   r5   r   r   r   r   r     s    
	<Nr   r   N)r   r   r   zSequence[bytes] | Sequence[str]r   r`   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hE hEV	~U( ~UB
N Nr   