Ë
    oj.  ã                   óî   — d Z ddlmZ ddlmZ ddlmZ  G d„ dej                  «      Z G d„ d«      Z	 G d	„ d
e	ej                  «      Z
 G d„ de	ej                  «      Z G d„ de	ej                  «      Zy)z)
Tests L{twisted.web.client} helper APIs
é    )Úurlparse)Úunittest)Úclientc                   ó   — e Zd ZdZd„ Zd„ Zy)ÚURLJoinTestsz'
    Tests for L{client._urljoin}.
    c                 óè   — | j                  t        j                  dd«      d«       | j                  t        j                  dd«      d«       | j                  t        j                  dd«      d«       y)z´
        L{client._urljoin} does not include a fragment identifier in the
        resulting URL if neither the base nor the new path include a fragment
        identifier.
        ó   http://foo.com/baró   /quuxs   http://foo.com/quuxs   http://foo.com/bar#s   /quux#N©ÚassertEqualr   Ú_urljoin©Úselfs    úA/usr/lib/python3/dist-packages/twisted/web/test/test_webclient.pyÚtest_noFragmentszURLJoinTests.test_noFragments   sh   € ð 	×ÑÜ�O‰OÐ1°8Ó<Ð>Tô	
ð 	×ÑÜ�O‰OÐ2°HÓ=Ð?Uô	
ð 	×ÑÜ�O‰OÐ1°9Ó=Ð?Uõ	
ó    c                 óè   — | j                  t        j                  dd«      d«       | j                  t        j                  dd«      d«       | j                  t        j                  dd«      d«       y)a  
        L{client._urljoin} preserves the fragment identifier from either the
        new path or the base URL respectively, as specified in the HTTP 1.1 bis
        draft.

        @see: U{https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-22#section-7.1.2}
        s   http://foo.com/bar#fragr
   s   http://foo.com/quux#fragr	   s   /quux#frag2s   http://foo.com/quux#frag2Nr   r   s    r   Útest_preserveFragmentsz#URLJoinTests.test_preserveFragments$   sh   € ð 	×ÑÜ�O‰OÐ6¸ÓAØ'ô	
ð 	×ÑÜ�O‰OÐ1°>ÓBØ(ô	
ð 	×ÑÜ�O‰OÐ6¸ÓGØ(õ	
r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © r   r   r   r      s   „ ñò
ó 
r   r   c                   ót   — e Zd ZdZd„ Z	 dd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚURITestsa  
    Abstract tests for L{twisted.web.client.URI}.

    Subclass this and L{unittest.TestCase}. Then provide a value for
    C{host} and C{uriHost}.

    @ivar host: A host specification for use in tests, must be L{bytes}.

    @ivar uriHost: The host specification in URI form, must be a L{bytes}. In
        most cases this is identical with C{host}. IPv6 address literals are an
        exception, according to RFC 3986 section 3.2.2, as they need to be
        enclosed in brackets. In this case this variable is different.
    c                 ó
  — | j                  | j                  t        «       | j                  | j                  t        «       | j                  |t        «       | j	                  d|«       |j                  d| j                  «      S )a±  
        Replace the string "HOST" in C{template} with this test's host.

        Byte strings Python between (and including) versions 3.0 and 3.4
        cannot be formatted using C{%} or C{format} so this does a simple
        replace.

        @type template: L{bytes}
        @param template: A string containing "HOST".

        @rtype: L{bytes}
        @return: A string where "HOST" has been replaced by C{self.host}.
        s   HOST)ÚassertIsInstanceÚhostÚbytesÚuriHostÚassertInÚreplace)r   Útemplates     r   ÚmakeURIStringzURITests.makeURIStringI   sa   € ð 	×Ñ˜dŸi™i¬Ô/Ø×Ñ˜dŸl™l¬EÔ2Ø×Ñ˜h¬Ô.Ø�‰�g˜xÔ(Ø×Ñ ¨¯©Ó6Ð6r   c
                 óè   — | j                  ||||||||	f|j                  |j                  |j                  |j                  |j
                  |j                  |j                  |j                  f«       y)aU  
        Assert that all of a L{client.URI}'s components match the expected
        values.

        @param uri: U{client.URI} instance whose attributes will be checked
            for equality.

        @type scheme: L{bytes}
        @param scheme: URI scheme specifier.

        @type netloc: L{bytes}
        @param netloc: Network location component.

        @type host: L{bytes}
        @param host: Host name.

        @type port: L{int}
        @param port: Port number.

        @type path: L{bytes}
        @param path: Hierarchical path.

        @type params: L{bytes}
        @param params: Parameters for last path segment, defaults to C{b''}.

        @type query: L{bytes}
        @param query: Query string, defaults to C{b''}.

        @type fragment: L{bytes}
        @param fragment: Fragment identifier, defaults to C{b''}.
        N)	r   ÚschemeÚnetlocr   ÚportÚpathÚparamsÚqueryÚfragment)
r   Úurir&   r'   r   r(   r)   r*   r+   r,   s
             r   ÚassertURIEqualszURITests.assertURIEquals]   sd   € ðD 	×ÑØ�V˜T 4¨¨v°u¸hÐGà—
‘
Ø—
‘
Ø—‘Ø—‘Ø—‘Ø—
‘
Ø—	‘	Ø—‘ð	õ	
r   c                 óÀ  — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       y)z„
        L{client.URI.fromBytes} by default assumes port 80 for the I{http}
        scheme and 443 for the I{https} scheme.
        ó   http://HOSTéP   s   http://HOST:ó   https://HOSTi»  N©r   ÚURIÚ	fromBytesr$   r   r(   ©r   r-   s     r   Útest_parseDefaultPortzURITests.test_parseDefaultPort�   s�   € ô
 �j‰j×"Ñ" 4×#5Ñ#5°nÓ#EÓFˆØ×Ñ˜˜SŸX™XÔ&ä�j‰j×"Ñ" 4×#5Ñ#5°oÓ#FÓGˆØ×Ñ˜˜SŸX™XÔ&Ü�j‰j×"Ñ" 4×#5Ñ#5°oÓ#FÓGˆØ×Ñ˜˜cŸh™hÕ'r   c                 ó4  — t         j                  j                  | j                  d«      d¬«      }| j	                  d|j
                  «       t         j                  j                  | j                  d«      d¬«      }| j	                  d|j
                  «       y)z‚
        L{client.URI.fromBytes} accepts a C{defaultPort} parameter that
        overrides the normal default port logic.
        r0   é  )ÚdefaultPortr2   Nr3   r6   s     r   Útest_parseCustomDefaultPortz$URITests.test_parseCustomDefaultPortš   s|   € ô
 �j‰j×"Ñ" 4×#5Ñ#5°nÓ#EÐSWÐ"ÓXˆØ×Ñ˜˜sŸx™xÔ(Ü�j‰j×"Ñ"Ø×Ñ˜Ó/¸Tð #ó 
ˆð 	×Ñ˜˜sŸx™xÕ(r   c                 óÞ  — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       | j	                  | j                  |j                  «       | j	                  | j                  dz   |j                  «       t         j                  j                  | j                  d«      «      }| j	                  | j                  |j                  «       y)zj
        Parsing a I{URI} splits the network location component into I{host} and
        I{port}.
        s   http://HOST:5144r9   s   :5144s   http://HOST N)	r   r4   r5   r$   r   r(   r   r    r'   r6   s     r   Útest_netlocHostPortzURITests.test_netlocHostPort¦   s¦   € ô
 �j‰j×"Ñ" 4×#5Ñ#5Ð6IÓ#JÓKˆØ×Ñ˜˜sŸx™xÔ(Ø×Ñ˜Ÿ™ C§H¡HÔ-Ø×Ñ˜Ÿ™¨Ñ0°#·*±*Ô=ô �j‰j×"Ñ" 4×#5Ñ#5°oÓ#FÓGˆØ×Ñ˜Ÿ™ s§z¡zÕ2r   c                 óú   — | j                  d«      }t        j                  j                  |«      }| j	                  |d| j
                  | j                  dd¬«       | j                  ||j                  «       «       y)z/
        Parse the path from a I{URI}.
        s   http://HOST/foo/baró   httpr1   ó   /foo/bar©r&   r'   r   r(   r)   N©	r$   r   r4   r5   r.   r    r   r   ÚtoBytes©r   r-   Úparseds      r   Ú	test_pathzURITests.test_path´   so   € ð × Ñ Ð!7Ó8ˆÜ—‘×%Ñ% cÓ*ˆØ×ÑØØØ—<‘<Ø—‘ØØð 	ô 	
ð 	×Ñ˜˜fŸn™nÓ.Õ/r   c                 óú   — | j                  d«      }t        j                  j                  |«      }| j	                  |d| j
                  | j                  dd¬«       | j                  ||j                  «       «       y)zL
        The path of a I{URI} that has no path is the empty string.
        r0   r?   r1   r   rA   NrB   rD   s      r   Útest_noPathzURITests.test_noPathÄ   sn   € ð × Ñ  Ó0ˆÜ—‘×%Ñ% cÓ*ˆØ×ÑØØØ—<‘<Ø—‘ØØð 	ô 	
ð 	×Ñ˜˜fŸn™nÓ.Õ/r   c                 ó¶   — | j                  d«      }| j                  t        j                  j	                  |«      d| j
                  | j                  dd¬«       y)zE
        The path of a I{URI} with an empty path is C{b'/'}.
        ó   http://HOST/r?   r1   ó   /rA   N)r$   r.   r   r4   r5   r    r   r6   s     r   Útest_emptyPathzURITests.test_emptyPathÔ   sP   € ð × Ñ  Ó1ˆØ×ÑÜ�J‰J× Ñ  Ó%ØØ—<‘<Ø—‘ØØð 	õ 	
r   c           	      óü   — | j                  d«      }t        j                  j                  |«      }| j	                  |d| j
                  | j                  ddd¬«       | j                  ||j                  «       «       y)z8
        Parse I{URI} parameters from a I{URI}.
        s   http://HOST/foo/bar;paramr?   r1   r@   ó   param)r&   r'   r   r(   r)   r*   NrB   rD   s      r   Ú
test_paramzURITests.test_paramâ   sr   € ð × Ñ Ð!=Ó>ˆÜ—‘×%Ñ% cÓ*ˆØ×ÑØØØ—<‘<Ø—‘ØØØð 	ô 	
ð 	×Ñ˜˜fŸn™nÓ.Õ/r   c           
      óþ   — | j                  d«      }t        j                  j                  |«      }| j	                  |d| j
                  | j                  dddd¬«       | j                  ||j                  «       «       y)	z7
        Parse the query string from a I{URI}.
        s!   http://HOST/foo/bar;param?a=1&b=2r?   r1   r@   rN   ó   a=1&b=2)r&   r'   r   r(   r)   r*   r+   NrB   rD   s      r   Ú
test_queryzURITests.test_queryó   su   € ð × Ñ Ð!EÓFˆÜ—‘×%Ñ% cÓ*ˆØ×ÑØØØ—<‘<Ø—‘ØØØØð 	ô 		
ð 	×Ñ˜˜fŸn™nÓ.Õ/r   c                 ó   — | j                  d«      }t        j                  j                  |«      }| j	                  |d| j
                  | j                  ddddd¬«	       | j                  ||j                  «       «       y	)
z>
        Parse the fragment identifier from a I{URI}.
        s&   http://HOST/foo/bar;param?a=1&b=2#fragr?   r1   r@   rN   rQ   s   frag)r&   r'   r   r(   r)   r*   r+   r,   NrB   rD   s      r   Útest_fragmentzURITests.test_fragment  sx   € ð × Ñ Ð!JÓKˆÜ—‘×%Ñ% cÓ*ˆØ×ÑØØØ—<‘<Ø—‘ØØØØØð 	ô 
	
ð 	×Ñ˜˜fŸn™nÓ.Õ/r   c                 ó˜   — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       y)zn
        L{client.URI.originForm} produces an absolute I{URI} path including
        the I{URI} path.
        s   http://HOST/foos   /fooN©r   r4   r5   r$   r   Ú
originFormr6   s     r   Útest_originFormzURITests.test_originForm  s8   € ô
 �j‰j×"Ñ" 4×#5Ñ#5Ð6HÓ#IÓJˆØ×Ñ˜ #§.¡.Õ1r   c                 ó˜   — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       y)z¸
        L{client.URI.originForm} produces an absolute I{URI} path including
        the I{URI} path, parameters and query string but excludes the fragment
        identifier.
        s   http://HOST/foo;param?a=1#frags   /foo;param?a=1NrV   r6   s     r   Útest_originFormComplexzURITests.test_originFormComplex   s>   € ô �j‰j×"Ñ"Ø×ÑÐ@ÓAó
ˆð 	×ÑÐ*¨C¯N©NÕ;r   c                 ó˜   — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       y)zp
        L{client.URI.originForm} produces a path of C{b'/'} when the I{URI}
        specifies no path.
        r0   rK   NrV   r6   s     r   Útest_originFormNoPathzURITests.test_originFormNoPath+  s7   € ô
 �j‰j×"Ñ" 4×#5Ñ#5°nÓ#EÓFˆØ×Ñ˜˜sŸ~™~Õ.r   c                 ó˜   — t         j                  j                  | j                  d«      «      }| j	                  d|j
                  «       y)zv
        L{client.URI.originForm} produces a path of C{b'/'} when the I{URI}
        specifies an empty path.
        rJ   rK   NrV   r6   s     r   Útest_originFormEmptyPathz!URITests.test_originFormEmptyPath3  s7   € ô
 �j‰j×"Ñ" 4×#5Ñ#5°oÓ#FÓGˆØ×Ñ˜˜sŸ~™~Õ.r   c                 ó\  — | j                  d«      }|j                  d«      }t        |«       t        j                  j                  |«      }| j                  |j                  t        «       | j                  |j                  t        «       | j                  |j                  t        «       y)zÓ
        L{client.URI.fromBytes} parses the scheme, host, and path elements
        into L{bytes}, even when passed an URL which has previously been passed
        to L{urlparse} as a L{unicode} string.
        s   http://HOST/pathÚasciiN)r$   Údecoder   r   r4   r5   r   r&   r   r   r)   )r   Ú	goodInputÚbadInputr-   s       r   Ú test_externalUnicodeInterferencez)URITests.test_externalUnicodeInterference;  s}   € ð ×&Ñ&Ð':Ó;ˆ	Ø×#Ñ# GÓ,ˆÜ�ÔÜ�j‰j×"Ñ" 9Ó-ˆØ×Ñ˜cŸj™j¬%Ô0Ø×Ñ˜cŸh™h¬Ô.Ø×Ñ˜cŸh™h¬Õ.r   N)r   r   r   )r   r   r   r   r$   r.   r7   r;   r=   rF   rH   rL   rO   rR   rT   rX   rZ   r\   r^   rd   r   r   r   r   r   :   s_   „ ñò7ð* VYó.
ò`(ò
)ò3ò0ò 0ò 
ò0ò"0ò$0ò&2ò	<ò/ò/ó/r   r   c                   ó   — e Zd ZdZdxZZy)ÚURITestsForHostnamez>
    Tests for L{twisted.web.client.URI} with host names.
    s   example.comN©r   r   r   r   r    r   r   r   r   rf   rf   J  s   „ ñð $Ð#€G‰dr   rf   c                   ó   — e Zd ZdZdxZZy)ÚURITestsForIPv4zG
    Tests for L{twisted.web.client.URI} with IPv4 host addresses.
    s   192.168.1.67Nrg   r   r   r   ri   ri   R  s   „ ñð %Ð$€G‰dr   ri   c                   ó   — e Zd ZdZdZdZd„ Zy)ÚURITestsForIPv6z·
    Tests for L{twisted.web.client.URI} with IPv6 host addresses.

    IPv6 addresses must always be surrounded by square braces in URIs. No
    attempt is made to test without.
    s   fe80::20c:29ff:fea4:c60s   [fe80::20c:29ff:fea4:c60]c                 óò   — t         j                  j                  d«      }| j                  |j                  d«       | j                  |j
                  d«       | j                  |j                  «       d«       y)z¶
        Brackets around IPv6 addresses are stripped in the host field. The host
        field is then exported with brackets in the output of
        L{client.URI.toBytes}.
        s   http://[::1]:80/index.htmls   ::1s   [::1]:80N)r   r4   r5   r   r   r'   rC   r6   s     r   Ú"test_hostBracketIPv6AddressLiteralz2URITestsForIPv6.test_hostBracketIPv6AddressLiterale  sX   € ô �j‰j×"Ñ"Ð#@ÓAˆà×Ñ˜Ÿ™ 6Ô*Ø×Ñ˜Ÿ™ [Ô1Ø×Ñ˜Ÿ™›Ð(EÕFr   N)r   r   r   r   r   r    rm   r   r   r   rk   rk   Z  s   „ ñð &€DØ*€Gó
Gr   rk   N)r   Úurllib.parser   Útwisted.trialr   Útwisted.webr   ÚTestCaser   r   rf   ri   rk   r   r   r   ú<module>rr      ss   ðñõ
 "å "Ý ô(
�8×$Ñ$ô (
÷VM/ñ M/ô`$˜( H×$5Ñ$5ô $ô%�h × 1Ñ 1ô %ôG�h × 1Ñ 1õ Gr   