U
    
W[¢O  ã                   @   s`   d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
 G dd„ deƒZG dd	„ d	eƒZd
S )z(
Tests for L{twisted.web.http_headers}.
é    )ÚdivisionÚabsolute_import)ÚTestCase)Ú_PY3Úunicode)ÚHeadersc                   @   s°   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*S )+ÚBytesHeadersTestszE
    Tests for L{Headers}, using L{bytes} arguments for methods.
    c                 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}.
        ó   Fooó   baró   fooN©r   ÚassertEqualÚgetRawHeaders©ÚselfÚh© r   úD/usr/lib/python3/dist-packages/twisted/web/test/test_http_headers.pyÚtest_initializer   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ó   value2ó   testó   TestN©r   ÚsetRawHeadersÚ
assertTrueÚ	hasHeaderr   r   )r   ÚrawValuer   r   r   r   Útest_setRawHeaders   s    z$BytesHeadersTests.test_setRawHeadersc                 C   s    t ƒ }|  t|jdddi¡ dS )úN
        L{Headers.setRawHeaders} requires values to be of type list.
        ó   keyr	   r
   N©r   ÚassertRaisesÚ	TypeErrorr   r   r   r   r   Útest_rawHeadersTypeChecking(   s    z-BytesHeadersTests.test_rawHeadersTypeCheckingc                 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   ÚaddRawHeaderr   r   r   r   r   r   Útest_addRawHeader0   s
    z#BytesHeadersTests.test_addRawHeaderc                 C   s   |   tƒ  d¡¡ dS )úz
        L{Headers.getRawHeaders} returns L{None} if the header is not found and
        no default is specified.
        r   N©ZassertIsNoner   r   ©r   r   r   r   Útest_getRawHeadersNoDefault;   s    z-BytesHeadersTests.test_getRawHeadersNoDefaultc                 C   s$   t ƒ }tƒ }|  | d|¡|¡ dS )úo
        L{Headers.getRawHeaders} returns the specified default value when no
        header is found.
        r   N)r   ÚobjectÚassertIdenticalr   ©r   r   Údefaultr   r   r   Útest_getRawHeadersDefaultValueC   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.
        Úvaluer    r   ó   valueN)r   r   ÚassertIsInstancer   Úbytesr   r2   r   r   r   Ú*test_getRawHeadersWithDefaultMatchingValueM   s
    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   r   r   r   r   r   r   r   Útest_getRawHeadersZ   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   r   r   r   r   r   r   r   Útest_hasHeaderTruee   s    z$BytesHeadersTests.test_hasHeaderTruec                 C   s   |   tƒ  d¡¡ dS )úc
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        r   N©ÚassertFalser   r   r-   r   r   r   Útest_hasHeaderFalsep   s    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.
        r   r&   r
   r'   s   BarN©r   r   r   r   ÚremoveHeaderrB   r   r   r   r   Útest_removeHeaderx   s    

z#BytesHeadersTests.test_removeHeaderc                 C   s(   t ƒ }| d¡ |  t| ¡ ƒg ¡ dS )úk
        L{Headers.removeHeader} is a no-operation when the specified header is
        not found.
        r   N©r   rF   r   ÚlistÚgetAllRawHeadersr   r   r   r   Útest_removeHeaderDoesntExist‰   s    
z.BytesHeadersTests.test_removeHeaderDoesntExistc                 C   s¬   t ƒ }|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d	¡d
¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ dS )zr
        L{Headers._canonicalNameCaps} 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   x-xss-protections   X-XSS-ProtectionN)r   r   Z_canonicalNameCapsr   r   r   r   Útest_canonicalNameCaps“   s    ÿÿz(BytesHeadersTests.test_canonicalNameCapsc                 C   sP   t ƒ }| ddg¡ | ddg¡ tdd„ | ¡ D ƒƒ}|  |tddgƒ¡ 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   ó   lemursrN   ó   basic aksljdlk=c                 S   s   g | ]\}}|t |ƒf‘qS r   ©Útuple©Ú.0ÚkÚvr   r   r   Ú
<listcomp>°   s     z;BytesHeadersTests.test_getAllRawHeaders.<locals>.<listcomp>©rO   )rS   )r   ©rR   N©r   r   ÚsetrK   r   ©r   r   Z
allHeadersr   r   r   Útest_getAllRawHeaders¦   s    ÿÿz'BytesHeadersTests.test_getAllRawHeadersc                 C   sf   t ƒ }| ddg¡ t ƒ }| ddg¡ t ƒ }| dddg¡ |  ||¡ |  ||¡ |  ||¡ dS )ú
        A L{Headers} instance compares equal to itself and to another
        L{Headers} instance with the same values.
        r   r'   r&   N©r   r   r   ÚassertNotEqual)r   ÚfirstÚsecondÚthirdr   r   r   Útest_headersComparison·   s    z(BytesHeadersTests.test_headersComparisonc                 C   s0   t ƒ }|  |d¡ |  |tƒ ¡ |  |d¡ dS )úf
        An instance of L{Headers} does not compare equal to other unrelated
        objects.
        r   r   N©r   rc   r0   r   r   r   r   Útest_otherComparisonÇ   s    z&BytesHeadersTests.test_otherComparisonc                 C   s6   d}d}d}|   tt|||giƒƒd|||f ¡ dS )zy
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains.
        r   r
   ó   bazúHeaders({%r: [%r, %r]})N©r   Úreprr   ©r   ÚfooÚbarÚbazr   r   r   Ú	test_reprÒ   s    þzBytesHeadersTests.test_reprc                 C   s6   d}d}d}|   tt|||giƒƒd|||f ¡ dS )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   barás   bazárl   Nrm   ro   r   r   r   Útest_reprWithRawBytesß   s    þz'BytesHeadersTests.test_reprWithRawBytesc                 C   sF   d}d}d}G dd„ dt ƒ}|  t||||giƒƒd|||f ¡ 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"}.
        r   r
   rk   c                   @   s   e Zd ZdS )z9BytesHeadersTests.test_subclassRepr.<locals>.FunnyHeadersN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚFunnyHeadersø   s   rz   zFunnyHeaders({%r: [%r, %r]})N)r   r   rn   )r   rp   rq   rr   rz   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   r   r
   rk   N©r   r   Úcopyr   r   r)   ©r   r   Úir   r   r   Ú	test_copyÿ   s    zBytesHeadersTests.test_copyN)rw   rx   ry   Ú__doc__r   r   r$   r*   r.   r4   r9   r<   r?   rC   rG   rL   rP   r`   rg   rj   rs   rt   r{   r   r   r   r   r   r      s*   	

r   c                   @   s¸   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,S )-ÚUnicodeHeadersTestszG
    Tests for L{Headers}, using L{unicode} arguments for methods.
    c                 C   s:   t ddgiƒ}|  | d¡dg¡ |  | d¡dg¡ dS )aK  
        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{unicode} argument is given, it returns
        L{unicode} values. Both are the same header value, just encoded or
        decoded.
        ÚFoorq   r   r
   rp   Nr   r   r   r   r   r     s    z$UnicodeHeadersTests.test_initializerc                 C   sŠ   ddg}ddg}t ƒ }| d|¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡|¡ |  | d¡|¡ d	S )
zˆ
        L{Headers.setRawHeaders} sets the header values for the given
        header name to the sequence of strings, encoded.
        Zvalue1Zvalue2r   r   Útestr   r   ZTestNr   )r   r   ZrawEncodedValuer   r   r   r   r   !  s    z&UnicodeHeadersTests.test_setRawHeadersc              	   C   sN   t ƒ }|  t¡ | ddg¡ W 5 Q R X |  t¡ | d¡ W 5 Q R X dS )zÍ
        Passing L{unicode} 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   r"   ÚUnicodeEncodeErrorr   r   r   r   r   r   Útest_nameNotEncodable2  s
    z)UnicodeHeadersTests.test_nameNotEncodablec                 C   sL   t ƒ }| ddg¡ |  | d¡¡ |  | d¡dg¡ |  | d¡¡ dS )z
        Passing L{unicode} to any function that takes a header name will encode
        said header name as ISO-8859-1.
        õ   Ã¡r   ó   áNr   r   r   r   r   Útest_nameEncodingB  s
    z%UnicodeHeadersTests.test_nameEncodingc                 C   s@   t ƒ }| dddg¡ |  | d¡¡ |  | d¡ddg¡ dS )z€
        Passing L{unicode} to L{Headers.setRawHeaders} will encode the name as
        ISO-8859-1 and values as UTF-8.
        rŠ   r†   r   r‹   s   â˜ƒNr   r   r   r   r   Útest_rawHeadersValueEncodingT  s    z0UnicodeHeadersTests.test_rawHeadersValueEncodingc                 C   s    t ƒ }|  t|jdddi¡ dS )r   Úkeyr„   rq   Nr!   r   r   r   r   r$   _  s    z/UnicodeHeadersTests.test_rawHeadersTypeCheckingc                 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(   r   r   r   r   r*   g  s    z%UnicodeHeadersTests.test_addRawHeaderc                 C   s   |   tƒ  d¡¡ dS )r+   r…   Nr,   r-   r   r   r   r.   s  s    z/UnicodeHeadersTests.test_getRawHeadersNoDefaultc                 C   sh   t ƒ }tƒ }|  | d|¡|¡ |  | dd¡d¡ |  | ddg¡dg¡ |  | ddg¡dg¡ dS )r/   r…   Nr†   )r   r0   r1   r   r   r2   r   r   r   r4   {  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.
        r6   r    rŽ   r   r5   N)r   r   r7   r   r   r   r2   r   r   r   r9   ‹  s
    z>UnicodeHeadersTests.test_getRawHeadersWithDefaultMatchingValuec                 C   sh   t ƒ }| ddg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ |  | d¡dg¡ dS )r:   õ   testÃ¡r   õ   TestÃ¡ó   testár&   ó   TestáNr;   r   r   r   r   r<   ˜  s    z&UnicodeHeadersTests.test_getRawHeadersc                 C   sX   t ƒ }| ddg¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ dS )r=   r‘   r   r’   r“   r”   Nr>   r   r   r   r   r?   ¥  s    z&UnicodeHeadersTests.test_hasHeaderTruec                 C   s   |   tƒ  d¡¡ dS )r@   r‘   NrA   r-   r   r   r   rC   ²  s    z'UnicodeHeadersTests.test_hasHeaderFalsec                 C   sš   t ƒ }| ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ | ddg¡ |  | d¡¡ | d¡ |  | d¡¡ |  | d¡¡ dS )	rD   rp   r   r   rq   r   ZBarr
   NrE   r   r   r   r   rG   º  s    

z%UnicodeHeadersTests.test_removeHeaderc                 C   s(   t ƒ }| d¡ |  t| ¡ ƒg ¡ dS )rH   r…   NrI   r   r   r   r   rL   Í  s    
z0UnicodeHeadersTests.test_removeHeaderDoesntExistc                 C   s`   t ƒ }| ddg¡ | ddg¡ | ddg¡ tdd„ | ¡ D ƒƒ}|  |td	d
dgƒ¡ dS )rQ   r‘   Zlemurszwww-authenticatezbasic aksljdlk=zcontent-md5Zkjdfdfgdfgnsdc                 S   s   g | ]\}}|t |ƒf‘qS r   rT   rV   r   r   r   rZ   â  s     z=UnicodeHeadersTests.test_getAllRawHeaders.<locals>.<listcomp>r[   )rM   )s   kjdfdfgdfgnsd)r”   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 )ra   õ   fooÃ¡r   r   s   fooár'   r&   Nrb   )r   rd   re   rf   Z
firstBytesZsecondBytesZ
thirdBytesr   r   r   rg   ê  s$    z*UnicodeHeadersTests.test_headersComparisonc                 C   s0   t ƒ }|  |d¡ |  |tƒ ¡ |  |d¡ dS )rh   r   rp   Nri   r   r   r   r   rj     s    z(UnicodeHeadersTests.test_otherComparisonc              	   C   sX   d}d}d}d}d}t r(d| }d| }|  tt|||giƒƒd||| d¡f ¡ 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â˜ƒrr   ú	'foo\xe1'ú'bar\xe2\x98\x83'ÚbzHeaders({%s: [%s, %r]})Úutf8N)r   r   rn   r   Úencode)r   rp   rq   rr   Ú
fooEncodedÚ
barEncodedr   r   r   rs     s    þþzUnicodeHeadersTests.test_reprc              	   C   sh   d}d}d}d}d}t r(d| }d| }G dd„ dtƒ}|  t||||giƒƒd	||| d
¡f ¡ dS )ru   r•   r–   rr   r—   r˜   r™   c                   @   s   e Zd ZdS )z;UnicodeHeadersTests.test_subclassRepr.<locals>.FunnyHeadersNrv   r   r   r   r   rz   4  s   rz   zFunnyHeaders({%s: [%s, %r]})rš   N)r   r   r   rn   r›   )r   rp   rq   rr   rœ   r   rz   r   r   r   r{   '  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â˜ƒrq   rk   r
   Nr}   r   r   r   r   r   =  s"     ÿ ÿzUnicodeHeadersTests.test_copyN)rw   rx   ry   r‚   r   r   r‰   rŒ   r   r$   r*   r.   r4   r9   r<   r?   rC   rG   rL   r`   rg   rj   rs   r{   r   r   r   r   r   rƒ     s,   
rƒ   N)r‚   Z
__future__r   r   Ztwisted.trial.unittestr   Ztwisted.python.compatr   r   Ztwisted.web.http_headersr   r   rƒ   r   r   r   r   Ú<module>   s     