+
    Bi,                     ~   ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ^ RIH
t
 ^ RIHtHt  ! R R4      t ! R R	]]P                  4      t ! R
 R]]P                  4      t ! R R]]P                  4      t ! R R]]P                  4      t ! R R]4      t ! R R]]P                  4      t ! R R]]P                  4      t ! R R]4      t ! R R]]P                  4      t ! R R]]P                  4      t ! R R]]P                  4      t ! R R]]P                  4      t ! R  R!]4      t ! R" R#]]P                  4      t ! R$ R%]]P                  4      t ! R& R']]P                  4      t ! R( R)]]P                  4      t  ! R* R+]]P                  4      t! ! R, R-]]P                  4      t" ! R. R/]4      t#]PH                  ! ]PJ                  R04       ! R1 R2]P                  4      4       t&]PN                  ! 4        ! R3 R4]P                  4      4       t(])R58X  d   ]PT                  ! 4        R# R# )6    N)support)socket_helper)threading_helper)BaseHTTPRequestHandler
HTTPServerc                   R   a  ] tR t^t o RtRt. t. tRtR t	R t
R tR tR tR	tV tR# )
BaseRobotTest test_robotparserNc                    \         P                  ! V P                  4      P                  4       p\        P
                  P                  4       V n        V P                  P                  V4       R # N)	ioStringIO
robots_txt	readlinesurllibrobotparserRobotFileParserparserparse)selfliness   & ,/usr/lib/python3.14/test/test_robotparser.pysetUpBaseRobotTest.setUp   sE    DOO,668((88:%     c                X    \        V\        4      '       d   Vw  r!W!3# V P                  V3# r   )
isinstancetupleagentr   urlr    s   && r   get_agent_and_urlBaseRobotTest.get_agent_and_url   s,    c5!!JE:zz3r   c           	        V P                    Fc  pV P                  V4      w  r!V P                  WR 7      ;_uu_ 4        V P                  V P                  P                  W!4      4       RRR4       Ke  	  R#   + '       g   i     Kz  ; i)r"   r    N)goodr#   subTest
assertTruer   	can_fetchr!   s   &  r   test_good_urlsBaseRobotTest.test_good_urls   s`    99C//4JE#33 5 5e AB 43 333   +A66Bc           	        V P                    Fc  pV P                  V4      w  r!V P                  WR 7      ;_uu_ 4        V P                  V P                  P                  W!4      4       RRR4       Ke  	  R#   + '       g   i     Kz  ; ir&   )badr#   r(   assertFalser   r*   r!   s   &  r   test_bad_urlsBaseRobotTest.test_bad_urls$   sb    88C//4JE#33  !6!6u!BC 43 333r-   c                n    V P                  V P                  P                  4       V P                  4       R # r   )assertEqualr   	site_mapsr   s   &r   test_site_mapsBaseRobotTest.test_site_maps*   s#    ..0$..Ar   )r   )__name__
__module____qualname____firstlineno__r   r    r'   r/   r5   r   r#   r+   r1   r7   __static_attributes____classdictcell____classdict__s   @r   r	   r	      s@     JED
CI!
CDB Br   r	   c                   *    ] tR t^.tRtRR.t. ROtRtR# )UserAgentWildcardTestzUser-agent: *
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
Disallow: /tmp/ # these will soon disappear
Disallow: /foo.html
    /
/test.html N)/cyberworld/map/index.htmlz/tmp/xxx	/foo.htmlr9   r:   r;   r<   r   r'   r/   r=   rE   r   r   rB   rB   .   s    J D
ACr   rB   c                   (    ] tR t^9tRt. ROtR.tRtR# )CrawlDelayAndCustomAgentTestz# robots.txt for http://www.example.com/

User-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/ # This is an infinite virtual URL space

# Cybermapper knows where to go.
User-agent: cybermapper
Disallow:
    rF   rE   N)rC   rD   )cybermapperrF   rH   rE   r   r   rJ   rJ   9   s    J ND'
(Cr   rJ   c                   0    ] tR t^JtRtRR.tR.tRR.tRtR# )	SitemapTesta  # robots.txt for http://www.example.com/

User-agent: *
Sitemap: http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xml
Sitemap: http://www.google.com/hostednews/sitemap_index.xml
Request-rate: 3/15
Disallow: /cyberworld/map/ # This is an infinite virtual URL space

    rC   rD   rF   z7http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xmlz2http://www.google.com/hostednews/sitemap_index.xmlrE   N)	r9   r:   r;   r<   r   r'   r/   r5   r=   rE   r   r   rM   rM   J   s+    	J D'
(CJEGIr   rM   c                   &    ] tR t^[tRt. t. ROtRtR# )RejectAllRobotsTestz(# go away
User-agent: *
Disallow: /
    rE   N)rF   rC   /tmp/rH   rE   r   r   rO   rO   [   s    J
 D
6Cr   rO   c                   .   a  ] tR t^et o RtRtR tRtV tR# )BaseRequestRateTestNc                   V P                   pV P                  V P                  ,            EF)  pV P                  V4      w  r2V P	                  W#R 7      ;_uu_ 4        V P                  VP                  V4      V P                  4       VP                  V4      pV P                  W@P                  4       V P                  e   V P                  V\        P                  P                  4       V P                  VP                  V P                  P                  4       V P                  VP                  V P                  P                  4       RRR4       EK,  	  R#   + '       g   i     EKB  ; ir&   )r   r'   r/   r#   r(   r4   crawl_delayrequest_rateassertIsInstancer   r   RequestRaterequestsseconds)r   r   r"   r    parsed_request_rates   &    r   test_request_rate%BaseRequestRateTest.test_request_ratei   s   99txx''C//4JE#33  !3!3E!:D<L<LM&,&9&9%&@#  !46G6GH$$0))+**66 $$+44))22 $$+33))11 43 (333s   C0EE,rE   )	r9   r:   r;   r<   rU   rT   r[   r=   r>   r?   s   @r   rR   rR   e   s     LK r   rR   c                        ] tR t^tRtR.tRtR# )EmptyFileTestr
   z/foorE   N)r9   r:   r;   r<   r   r'   r=   rE   r   r   r^   r^      s    J8Dr   r^   c                   h    ] tR t^tRtRt]P                  P                  ^	^4      t	^t
R.t. ROtRtR# )CrawlDelayAndRequestRateTestzUser-agent: figtree
Crawl-delay: 3
Request-rate: 9/30
Disallow: /tmp
Disallow: /a%3cd.html
Disallow: /a%2fb.html
Disallow: /%7ejoe/index.html
    figtreerE   N)ra   rG   )/tmpz	/tmp.html/tmp/a.html/a%3cd.html/a%3Cd.htmlz/a%2fb.htmlz/~joe/index.html)r9   r:   r;   r<   r   r    r   r   rW   rU   rT   r'   r/   r=   rE   r   r   r`   r`      s<    J E%%11!R8LK$%D.Cr   r`   c                       ] tR t^tRtRtR# )DifferentAgentTestzFigTree Robot libwww-perl/5.04rE   Nr9   r:   r;   r<   r    r=   rE   r   r   rg   rg      s    ,Er   rg   c                   ,    ] tR t^tRtR.t. ROt^tRtR# )InvalidRequestRateTestzUser-agent: *
Disallow: /tmp/
Disallow: /a%3Cd.html
Disallow: /a/b.html
Disallow: /%7ejoe/index.html
Crawl-delay: 3
Request-rate: 9/banana
    rb   rE   N)rP   rc   rd   re   z	/a/b.htmlz/%7Ejoe/index.html)	r9   r:   r;   r<   r   r'   r/   rT   r=   rE   r   r   rj   rj      s    J 8D!CKr   rj   c                   $    ] tR t^tRtR.t. tRtR# )InvalidCrawlDelayTestz2User-Agent: *
Disallow: /.
Crawl-delay: pears
    rG   rE   NrH   rE   r   r   rl   rl      s    J
 =D
Cr   rl   c                   *    ] tR t^tRtRtR.tR.tRtR# )AnotherInvalidRequestRateTestzeUser-agent: Googlebot
Allow: /folder1/myfile.html
Disallow: /folder1/
Request-rate: whale/banana
    	Googlebot/folder1/myfile.html/folder1/anotherfile.htmlrE   N	r9   r:   r;   r<   r   r    r'   r/   r=   rE   r   r   rn   rn      s     J E"#D&
'Cr   rn   c                   $    ] tR t^tRtRtR.tRtR# )UserAgentOrderingTestzMUser-agent: Googlebot
Disallow: /

User-agent: Googlebot-Mobile
Allow: /
    ro   z/something.jpgrE   N)r9   r:   r;   r<   r   r    r/   r=   rE   r   r   rt   rt      s    J E
Cr   rt   c                       ] tR t^tRtRtR# )UserAgentGoogleMobileTestzGooglebot-MobilerE   Nrh   rE   r   r   rv   rv      s    Er   rv   c                   *    ] tR t^tRtRtR.tR.tRtR# )GoogleURLOrderingTestzJUser-agent: Googlebot
Allow: /folder1/myfile.html
Disallow: /folder1/
    	googlebotrp   rq   rE   Nrr   rE   r   r   rx   rx      s     J
 E"#D&
'Cr   rx   c                   &    ] tR t^tRtR.tR.tRtR# )DisallowQueryStringTestz2User-agent: *
Disallow: /some/path?name=value
    
/some/pathz/some/path?name=valuerE   NrH   rE   r   r   r{   r{      s    J >D"
#Cr   r{   c                   &    ] tR t^tRtR.tR.tRtR# )UseFirstUserAgentWildcardTestzNUser-agent: *
Disallow: /some/path

User-agent: *
Disallow: /another/path
    z/another/pathr|   rE   NrH   rE   r   r   r~   r~      s    J D.Cr   r~   c                   &    ] tR t^tRtR.tR.tRtR# )EmptyQueryStringTestz>User-agent: *
Allow: /some/path?
Disallow: /another/path?
    z/some/path?z/another/path?rE   NrH   rE   r   r   r   r      s    J
 ?D
Cr   r   c                   d    ] tR tRtRt]P                  P                  ^^4      t^t	RR.t
R.tRtR# )DefaultEntryTesti  zOUser-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/
    rC   rD   rF   rE   N)r9   r:   r;   r<   r   r   r   rW   rU   rT   r'   r/   r=   rE   r   r   r   r     s:    J %%11!R8LKD'
(Cr   r   c                   .   a  ] tR tRt o RtRtR tRtV tR# )StringFormattingTesti  zUser-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/ # This is an infinite virtual URL space

# Cybermapper knows where to go.
User-agent: cybermapper
Disallow: /some/path
    zxUser-agent: cybermapper
Disallow: /some/path

User-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/c                d    V P                  \        V P                  4      V P                  4       R # r   )r4   strr   expected_outputr6   s   &r   test_string_formatting+StringFormattingTest.test_string_formatting*  s!    T[[)4+?+?@r   rE   N)	r9   r:   r;   r<   r   r   r   r=   r>   r?   s   @r   r   r     s     	JOA Ar   r   c                   ,   a  ] tR tRt o R tR tRtV tR# )RobotHandleri.  c                *    V P                  R R4       R# )i  zForbidden accessN)
send_errorr6   s   &r   do_GETRobotHandler.do_GET0  s    /0r   c                    R # r   rE   )r   formatargss   &&*r   log_messageRobotHandler.log_message3  s    r   rE   N)r9   r:   r;   r<   r   r   r=   r>   r?   s   @r   r   r   .  s     1 r   r   z&Socket server requires working socket.c                   P   a  ] tR tRt o R tR t]P                  R 4       tRt	V t
R# )PasswordProtectedSiteTestCasei7  c                `   V P                  \        P                  P                  4       \	        \
        P                  ^ 3\        4      V n        \        P                  ! RV P                  P                  RR/R7      V n        RV P                  n        V P                  P                  4        R# )r   zHTTPServer servingpoll_intervalg{Gz?)nametargetkwargsTN)
addCleanupr   request
urlcleanupr   r   HOSTr   server	threadingThreadserve_forevertdaemonstartr6   s   &r   r   #PasswordProtectedSiteTestCase.setUp=  sw    112 -"4"4a!8,G!!%;;,, $D)+ r   c                    V P                   P                  4        V P                  P                  4        V P                   P	                  4        R # r   )r   shutdownr   joinserver_closer6   s   &r   tearDown&PasswordProtectedSiteTestCase.tearDownM  s/      "r   c                n   V P                   P                  pR \        P                  ,           R,           \	        V^,          4      ,           pVR,           p\
        P                  P                  4       pVP                  V4       VP                  4        V P                  VP                  RV4      4       R# )zhttp://:z/robots.txt*N)r   server_addressr   r   r   r   r   r   set_urlreadr0   r*   )r   addrr"   
robots_urlr   s   &    r   testPasswordProtectedSite7PasswordProtectedSiteTestCase.testPasswordProtectedSiteR  s    {{))-,,,s2Sa\A=(
##335s))#z:;r   )r   r   N)r9   r:   r;   r<   r   r   r   reap_threadsr   r=   r>   r?   s   @r   r   r   7  s)      #
 ""< #<r   r   c                   n   a  ] tR tRt o RtRP                  ]4      t]R 4       tR t	R t
R tR tR	tV tR
# )NetworkTestCasei]  zhttp://www.pythontest.net/z{}elsewhere/robots.txtc                L   \         P                  ! R 4       \        P                  ! V P                  4      ;_uu_ 4        \
        P                  P                  V P                  4      V n	        V P                  P                  4        RRR4       R#   + '       g   i     R# ; i)networkN)r   requiresr   transient_internetbase_urlr   r   r   r   r   r   )clss   &r   
setUpClassNetworkTestCase.setUpClassc  s^    #--cll;;++;;CNNKCJJJOO <;;;s   A	BB#	c                    R P                  V P                  T\        P                  P	                  V4      ^,          '       g   R4      # R4      # )z{}{}{}rC   r
   )r   r   ospathsplitext)r   r   s   &&r   r"   NetworkTestCase.urlj  sD    MM4BGG,<,<T,B1,E,E
 	
KM
 	
r   c                   V P                  V P                  P                  4       V P                  V P                  P                  4       V P	                  V P                  P                  4       ^ 4       V P                  V P                  P                  R4      4       V P                  V P                  P                  R4      4       R# )r   r   N)r0   r   disallow_all	allow_allassertGreatermtimerT   rU   r6   s   &r   
test_basicNetworkTestCase.test_basico  s    112../4;;,,.2005611#67r   c                   V P                  V P                  P                  R V P                  R4      4      4       V P	                  V P                  P                  RV P
                  4      4       V P	                  V P                  P                  RV P                  R4      4      4       V P	                  V P                  P                  RV P                  R4      4      4       V P	                  V P                  P                  R V P                  R4      4      4       V P                  V P                  P                  R V P
                  4      4       R# )r   	elsewhereNutchbrianwebstatsN)r)   r   r*   r"   r0   r   r6   s   &r   test_can_fetchNetworkTestCase.test_can_fetchv  s    --c488K3HIJ..wFG..w8IJK..w8LMN..sDHHZ4HIJ--c4==ABr   c                   \         P                  P                  V P                  R 4      4      pVP	                  4        V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       ^ 4       V P                  VP                  R4      4       V P                  VP                  R4      4       R# )zi-robot.txtr   N)r   r   r   r"   r   r)   r   r0   r   r4   r   assertIsNonerT   rU   )r   r   s   & r   test_read_404NetworkTestCase.test_read_404~  s    ##33DHH]4KL((),,-+&,,S12&--c23r   rE   N)r9   r:   r;   r<   r   r   r   classmethodr   r"   r   r   r   r=   r>   r?   s   @r   r   r   ]  sH      ,H)00:J 

8C4 4r   r   __main__)+r   r   r   unittesturllib.robotparserr   testr   test.supportr   r   http.serverr   r   r	   TestCaserB   rJ   rM   rO   rR   r^   r`   rg   rj   rl   rn   rt   rv   rx   r{   r~   r   r   r   r   
skipUnlesshas_socket_supportr   requires_working_socketr   r9   mainrE   r   r   <module>r      s%   	 	     & ) :B BDBM8+<+< B)=(2C2C )"G-!2!2 G"7-):): 7- 8'):): 
.#68I8I .$-5 -]H,=,=  	M8+<+< 	
(M83D3D 
(M8+<+<  5 
(M8+<+< 
($mX->-> $
M83D3D 
=(*;*; 
)*H,=,= 
)A=(*;*; A4)  
,<H$5$5 <	<D 	  "'4h'' '4 #'4R ZMMO r   