@@ -773,6 +773,65 @@ def testServiceUnavailable(self):
773773 self .assertFalse (parser .can_fetch ("*" , url + '/path/file.html' ))
774774
775775
776+ class UserAgentRobotHandler (BaseHTTPRequestHandler ):
777+
778+ def do_GET (self ):
779+ if self .headers .get ('User-Agent' ).startswith ('Python-urllib' ):
780+ self .send_error (403 , "Forbidden access" )
781+ else :
782+ self .send_response (200 )
783+ self .end_headers ()
784+ self .wfile .write (b"User-agent: *\n Disallow:" )
785+
786+ def log_message (self , format , * args ):
787+ pass
788+
789+
790+ @unittest .skipUnless (
791+ support .has_socket_support ,
792+ "Socket server requires working socket."
793+ )
794+ class UserAgentSiteTestCase (unittest .TestCase ):
795+
796+ def setUp (self ):
797+ # clear _opener global variable
798+ self .addCleanup (urllib .request .urlcleanup )
799+
800+ self .server = HTTPServer ((socket_helper .HOST , 0 ), UserAgentRobotHandler )
801+
802+ self .t = threading .Thread (
803+ name = 'HTTPServer serving' ,
804+ target = self .server .serve_forever ,
805+ # Short poll interval to make the test finish quickly.
806+ # Time between requests is short enough that we won't wake
807+ # up spuriously too many times.
808+ kwargs = {'poll_interval' :0.01 })
809+ self .t .daemon = True # In case this function raises.
810+ self .t .start ()
811+
812+ def tearDown (self ):
813+ self .server .shutdown ()
814+ self .t .join ()
815+ self .server .server_close ()
816+
817+ @threading_helper .reap_threads
818+ def testUserAgentFilteringSite (self ):
819+ addr = self .server .server_address
820+ url = 'http://' + socket_helper .HOST + ':' + str (addr [1 ])
821+ robots_url = url + "/robots.txt"
822+ file_url = url + "/document"
823+ parser = urllib .robotparser .RobotFileParser ()
824+ parser .set_url (robots_url )
825+ parser .read ()
826+ self .assertTrue (parser .disallow_all )
827+ self .assertFalse (parser .can_fetch ("*" , file_url ))
828+ parser = urllib .robotparser .RobotFileParser ()
829+ parser .set_url (urllib .request .Request (robots_url , headers = {'User-Agent' : 'cybermapper' }))
830+ parser .read ()
831+ self .assertFalse (parser .disallow_all )
832+ self .assertTrue (parser .can_fetch ("*" , file_url ))
833+
834+
776835@support .requires_working_socket ()
777836class NetworkTestCase (unittest .TestCase ):
778837
0 commit comments