
    Yf.                         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dS )z)
Tests L{twisted.web.client} helper APIs
    )urlparse)unittest)clientc                       e Zd ZdZd Zd ZdS )URLJoinTestsz'
    Tests for L{client._urljoin}.
    c                     |                      t          j        dd          d           |                      t          j        dd          d           |                      t          j        dd          d           dS )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    Q/var/www/html/env/lib/python3.11/site-packages/twisted/web/test/test_webclient.pytest_noFragmentszURLJoinTests.test_noFragments   s     	O18<<>T	
 	
 	
 	O2H==?U	
 	
 	
 	O19==?U	
 	
 	
 	
 	
    c                     |                      t          j        dd          d           |                      t          j        dd          d           |                      t          j        dd          d           dS )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$   s     	O6AA'	
 	
 	
 	O1>BB(	
 	
 	
 	O6GG(	
 	
 	
 	
 	
r   N)__name__
__module____qualname____doc__r   r    r   r   r   r      s<         
 
 
 
 
 
 
 
r   r   c                   v    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dS )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        t                     |                      | j        t                     |                      |t                     |                     d|           |                    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   sv     	di///dlE222h...gx(((666r   r   c
                     |                      ||||||||	f|j        |j        |j        |j        |j        |j        |j        |j        f           dS )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]   sh    D 	VT4vuhG


			
 	
 	
 	
 	
r   c                    t           j                            |                     d                    }|                     d|j                   t           j                            |                     d                    }|                     d|j                   t           j                            |                     d                    }|                     d|j                   dS )z
        L{client.URI.fromBytes} by default assumes port 80 for the I{http}
        scheme and 443 for the I{https} scheme.
           http://HOSTP   s   http://HOST:   https://HOSTi  Nr   URI	fromBytesr$   r   r(   r   r-   s     r   test_parseDefaultPortzURITests.test_parseDefaultPort   s    
 j""4#5#5n#E#EFFSX&&&j""4#5#5o#F#FGGSX&&&j""4#5#5o#F#FGGch'''''r   c                 B   t           j                            |                     d          d          }|                     d|j                   t           j                            |                     d          d          }|                     d|j                   dS )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""4#5#5n#E#ESW"XXsx(((j""//T # 
 
 	sx(((((r   c                    t           j                            |                     d                    }|                     d|j                   |                     | j        |j                   |                     | j        dz   |j                   t           j                            |                     d                    }|                     | j        |j                   dS )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""4#5#56I#J#JKKsx(((CH---0#*=== j""4#5#5o#F#FGGsz22222r   c                    |                      d          }t          j                            |          }|                     |d| j        | j        dd           |                     ||                                           dS )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   s       !788%%c**< 	 	
 	
 	
 	fnn../////r   c                    |                      d          }t          j                            |          }|                     |d| j        | j        dd           |                     ||                                           dS )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   s       00%%c**< 	 	
 	
 	
 	fnn../////r   c                     |                      d          }|                     t          j                            |          d| j        | j        dd           dS )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   sd       11J  %%< 	 	
 	
 	
 	
 	
r   c           	      
   |                      d          }t          j                            |          }|                     |d| j        | j        ddd           |                     ||                                           dS )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   s       !=>>%%c**< 	 	
 	
 	
 	fnn../////r   c           
         |                      d          }t          j                            |          }|                     |d| j        | j        dddd           |                     ||                                           dS )	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   s       !EFF%%c**< 	 		
 		
 		
 	fnn../////r   c                    |                      d          }t          j                            |          }|                     |d| j        | j        ddddd	  	         |                     ||                                           d	S )
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  s       !JKK%%c**< 	 
	
 
	
 
	
 	fnn../////r   c                     t           j                            |                     d                    }|                     d|j                   dS )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  sF    
 j""4#5#56H#I#IJJ#.11111r   c                     t           j                            |                     d                    }|                     d|j                   dS )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   sN     j""@AA
 
 	*CN;;;;;r   c                     t           j                            |                     d                    }|                     d|j                   dS )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+  sE    
 j""4#5#5n#E#EFFs~.....r   c                     t           j                            |                     d                    }|                     d|j                   dS )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  sE    
 j""4#5#5o#F#FGGs~.....r   c                 v   |                      d          }|                    d          }t          |           t          j                            |          }|                     |j        t                     |                     |j	        t                     |                     |j
        t                     dS )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""9--cj%000ch...ch.....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 7 7* VY.
 .
 .
 .
`( ( (
) 
) 
)3 3 30 0 0 0 0 0 
 
 
0 0 0"0 0 0$0 0 0&2 2 2	< 	< 	</ / // / // / / / /r   r   c                       e Zd ZdZdxZZdS )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$          $#Gdddr   rf   c                       e Zd ZdZdxZZdS )URITestsForIPv4zG
    Tests for L{twisted.web.client.URI} with IPv4 host addresses.
    s   192.168.1.67Nrg   r   r   r   ri   ri   R  s$          %$Gdddr   ri   c                        e Zd ZdZdZdZd ZdS )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                            d          }|                     |j        d           |                     |j        d           |                     |                                d           dS )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  so     j""#@AA6***[111(EFFFFFr   N)r   r   r   r   r   r    rm   r   r   r   rk   rk   Z  s>          &D*G
G 
G 
G 
G 
Gr   rk   N)r   urllib.parser   twisted.trialr   twisted.webr   TestCaser   r   rf   ri   rk   r   r   r   <module>rr      sG   
 " ! ! ! ! ! " " " " " "      (
 (
 (
 (
 (
8$ (
 (
 (
VM/ M/ M/ M/ M/ M/ M/ M/`$ $ $ $ $(H$5 $ $ $% % % % %h 1 % % %G G G G Gh 1 G G G G Gr   