2007-08-08 22:03:29 -03:00
|
|
|
import io
|
2016-09-18 05:21:57 -03:00
|
|
|
import os
|
2017-09-07 13:56:24 -03:00
|
|
|
import threading
|
2008-06-18 17:49:58 -03:00
|
|
|
import unittest
|
|
|
|
import urllib.robotparser
|
2015-10-08 06:27:06 -03:00
|
|
|
from collections import namedtuple
|
2008-05-20 18:35:26 -03:00
|
|
|
from test import support
|
2014-06-25 06:58:15 -03:00
|
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
|
|
|
2002-02-28 11:24:47 -04:00
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class BaseRobotTest:
|
|
|
|
robots_txt = ''
|
|
|
|
agent = 'test_robotparser'
|
|
|
|
good = []
|
|
|
|
bad = []
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
lines = io.StringIO(self.robots_txt).readlines()
|
|
|
|
self.parser = urllib.robotparser.RobotFileParser()
|
|
|
|
self.parser.parse(lines)
|
|
|
|
|
|
|
|
def get_agent_and_url(self, url):
|
|
|
|
if isinstance(url, tuple):
|
|
|
|
agent, url = url
|
|
|
|
return agent, url
|
|
|
|
return self.agent, url
|
|
|
|
|
|
|
|
def test_good_urls(self):
|
|
|
|
for url in self.good:
|
|
|
|
agent, url = self.get_agent_and_url(url)
|
|
|
|
with self.subTest(url=url, agent=agent):
|
|
|
|
self.assertTrue(self.parser.can_fetch(agent, url))
|
|
|
|
|
|
|
|
def test_bad_urls(self):
|
|
|
|
for url in self.bad:
|
|
|
|
agent, url = self.get_agent_and_url(url)
|
|
|
|
with self.subTest(url=url, agent=agent):
|
|
|
|
self.assertFalse(self.parser.can_fetch(agent, url))
|
|
|
|
|
|
|
|
|
|
|
|
class UserAgentWildcardTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
2002-02-28 11:24:47 -04:00
|
|
|
User-agent: *
|
|
|
|
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
|
|
|
|
Disallow: /tmp/ # these will soon disappear
|
|
|
|
Disallow: /foo.html
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/', '/test.html']
|
|
|
|
bad = ['/cyberworld/map/index.html', '/tmp/xxx', '/foo.html']
|
2002-02-28 11:24:47 -04:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class CrawlDelayAndCustomAgentTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
2002-02-28 11:24:47 -04:00
|
|
|
# robots.txt for http://www.example.com/
|
|
|
|
|
|
|
|
User-agent: *
|
2015-10-08 06:27:06 -03:00
|
|
|
Crawl-delay: 1
|
|
|
|
Request-rate: 3/15
|
2002-02-28 11:24:47 -04:00
|
|
|
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
|
|
|
|
|
|
|
|
# Cybermapper knows where to go.
|
|
|
|
User-agent: cybermapper
|
|
|
|
Disallow:
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/', '/test.html', ('cybermapper', '/cyberworld/map/index.html')]
|
|
|
|
bad = ['/cyberworld/map/index.html']
|
2002-02-28 11:24:47 -04:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class RejectAllRobotsTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
2002-02-28 11:24:47 -04:00
|
|
|
# go away
|
|
|
|
User-agent: *
|
|
|
|
Disallow: /
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = []
|
|
|
|
bad = ['/cyberworld/map/index.html', '/', '/tmp/']
|
2002-02-28 11:24:47 -04:00
|
|
|
|
|
|
|
|
2016-09-18 14:17:58 -03:00
|
|
|
class BaseRequestRateTest(BaseRobotTest):
|
2016-09-11 08:53:16 -03:00
|
|
|
|
|
|
|
def test_request_rate(self):
|
2016-09-18 14:17:58 -03:00
|
|
|
for url in self.good + self.bad:
|
2016-09-11 08:53:16 -03:00
|
|
|
agent, url = self.get_agent_and_url(url)
|
|
|
|
with self.subTest(url=url, agent=agent):
|
|
|
|
if self.crawl_delay:
|
|
|
|
self.assertEqual(
|
|
|
|
self.parser.crawl_delay(agent), self.crawl_delay
|
|
|
|
)
|
2016-09-18 14:17:58 -03:00
|
|
|
if self.request_rate:
|
2016-09-11 08:53:16 -03:00
|
|
|
self.assertEqual(
|
|
|
|
self.parser.request_rate(agent).requests,
|
|
|
|
self.request_rate.requests
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
|
|
|
self.parser.request_rate(agent).seconds,
|
|
|
|
self.request_rate.seconds
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2016-09-18 14:17:58 -03:00
|
|
|
class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
|
|
|
User-agent: figtree
|
|
|
|
Crawl-delay: 3
|
|
|
|
Request-rate: 9/30
|
|
|
|
Disallow: /tmp
|
|
|
|
Disallow: /a%3cd.html
|
|
|
|
Disallow: /a%2fb.html
|
|
|
|
Disallow: /%7ejoe/index.html
|
|
|
|
"""
|
|
|
|
agent = 'figtree'
|
|
|
|
request_rate = namedtuple('req_rate', 'requests seconds')(9, 30)
|
|
|
|
crawl_delay = 3
|
|
|
|
good = [('figtree', '/foo.html')]
|
|
|
|
bad = ['/tmp', '/tmp.html', '/tmp/a.html', '/a%3cd.html', '/a%3Cd.html',
|
|
|
|
'/a%2fb.html', '/~joe/index.html']
|
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class DifferentAgentTest(CrawlDelayAndRequestRateTest):
|
|
|
|
agent = 'FigTree Robot libwww-perl/5.04'
|
|
|
|
# these are not actually tested, but we still need to parse it
|
|
|
|
# in order to accommodate the input parameters
|
|
|
|
request_rate = None
|
|
|
|
crawl_delay = None
|
|
|
|
|
|
|
|
|
|
|
|
class InvalidRequestRateTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
2002-02-28 11:24:47 -04:00
|
|
|
User-agent: *
|
|
|
|
Disallow: /tmp/
|
|
|
|
Disallow: /a%3Cd.html
|
|
|
|
Disallow: /a/b.html
|
|
|
|
Disallow: /%7ejoe/index.html
|
2015-10-08 06:27:06 -03:00
|
|
|
Crawl-delay: 3
|
|
|
|
Request-rate: 9/banana
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/tmp']
|
|
|
|
bad = ['/tmp/', '/tmp/a.html', '/a%3cd.html', '/a%3Cd.html', '/a/b.html',
|
|
|
|
'/%7Ejoe/index.html']
|
|
|
|
crawl_delay = 3
|
2002-02-28 11:24:47 -04:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class InvalidCrawlDelayTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# From bug report #523041
|
|
|
|
robots_txt = """\
|
2002-02-28 11:24:47 -04:00
|
|
|
User-Agent: *
|
|
|
|
Disallow: /.
|
2015-10-08 06:27:06 -03:00
|
|
|
Crawl-delay: pears
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/foo.html']
|
|
|
|
# bug report says "/" should be denied, but that is not in the RFC
|
|
|
|
bad = []
|
2015-10-08 06:27:06 -03:00
|
|
|
|
2002-02-28 11:24:47 -04:00
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class AnotherInvalidRequestRateTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# also test that Allow and Diasallow works well with each other
|
|
|
|
robots_txt = """\
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
User-agent: Googlebot
|
|
|
|
Allow: /folder1/myfile.html
|
|
|
|
Disallow: /folder1/
|
2015-10-08 06:27:06 -03:00
|
|
|
Request-rate: whale/banana
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
agent = 'Googlebot'
|
|
|
|
good = ['/folder1/myfile.html']
|
|
|
|
bad = ['/folder1/anotherfile.html']
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class UserAgentOrderingTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# the order of User-agent should be correct. note
|
|
|
|
# that this file is incorrect because "Googlebot" is a
|
|
|
|
# substring of "Googlebot-Mobile"
|
|
|
|
robots_txt = """\
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
User-agent: Googlebot
|
|
|
|
Disallow: /
|
|
|
|
|
|
|
|
User-agent: Googlebot-Mobile
|
|
|
|
Allow: /
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
agent = 'Googlebot'
|
|
|
|
bad = ['/something.jpg']
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class UserAgentGoogleMobileTest(UserAgentOrderingTest):
|
|
|
|
agent = 'Googlebot-Mobile'
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class GoogleURLOrderingTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# Google also got the order wrong. You need
|
|
|
|
# to specify the URLs from more specific to more general
|
|
|
|
robots_txt = """\
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
User-agent: Googlebot
|
|
|
|
Allow: /folder1/myfile.html
|
|
|
|
Disallow: /folder1/
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
agent = 'googlebot'
|
|
|
|
good = ['/folder1/myfile.html']
|
|
|
|
bad = ['/folder1/anotherfile.html']
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class DisallowQueryStringTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# see issue #6325 for details
|
|
|
|
robots_txt = """\
|
2010-07-28 13:27:56 -03:00
|
|
|
User-agent: *
|
|
|
|
Disallow: /some/path?name=value
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/some/path']
|
|
|
|
bad = ['/some/path?name=value']
|
2010-07-28 13:27:56 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class UseFirstUserAgentWildcardTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# obey first * entry (#4108)
|
|
|
|
robots_txt = """\
|
2010-07-29 14:55:01 -03:00
|
|
|
User-agent: *
|
|
|
|
Disallow: /some/path
|
|
|
|
|
|
|
|
User-agent: *
|
|
|
|
Disallow: /another/path
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/another/path']
|
|
|
|
bad = ['/some/path']
|
2010-07-29 14:55:01 -03:00
|
|
|
|
|
|
|
|
2016-09-11 08:53:16 -03:00
|
|
|
class EmptyQueryStringTest(BaseRobotTest, unittest.TestCase):
|
|
|
|
# normalize the URL first (#17403)
|
|
|
|
robots_txt = """\
|
2013-05-29 09:54:31 -03:00
|
|
|
User-agent: *
|
|
|
|
Allow: /some/path?
|
|
|
|
Disallow: /another/path?
|
2016-09-11 08:53:16 -03:00
|
|
|
"""
|
|
|
|
good = ['/some/path?']
|
|
|
|
bad = ['/another/path?']
|
2013-05-29 09:54:31 -03:00
|
|
|
|
Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line
Finish-up the partial conversion from int to Py_ssize_t for deque indices and length.
........
r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line
Parse to the correct datatype.
........
r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line
fix spacing
........
r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line
fix markup
........
r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line
add some documentation for 2to3
........
r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line
Finish conversion from int to Py_ssize_t.
........
r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line
Convert from long to Py_ssize_t.
........
r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines
Fix indentation.
........
r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line
teach .bzrignore about doc tools
........
r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line
document default value for fillvalue
........
r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line
Issue 1592: Better error reporting for operations on closed shelves.
........
r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line
fix indentation
........
r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line
This sentence continues to bug me; rewrite it for the second time
........
r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line
Remove extra words
........
r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines
Close issue 3437 - missing state change when Allow lines are processed.
Adds test cases which use Allow: as well.
........
r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines
note robotparser bug fix.
........
2008-07-31 13:23:04 -03:00
|
|
|
|
2016-09-18 14:17:58 -03:00
|
|
|
class DefaultEntryTest(BaseRequestRateTest, unittest.TestCase):
|
|
|
|
robots_txt = """\
|
|
|
|
User-agent: *
|
|
|
|
Crawl-delay: 1
|
|
|
|
Request-rate: 3/15
|
|
|
|
Disallow: /cyberworld/map/
|
|
|
|
"""
|
|
|
|
request_rate = namedtuple('req_rate', 'requests seconds')(3, 15)
|
|
|
|
crawl_delay = 1
|
|
|
|
good = ['/', '/test.html']
|
|
|
|
bad = ['/cyberworld/map/index.html']
|
|
|
|
|
|
|
|
|
2014-06-25 06:58:15 -03:00
|
|
|
class RobotHandler(BaseHTTPRequestHandler):
|
|
|
|
|
|
|
|
def do_GET(self):
|
|
|
|
self.send_error(403, "Forbidden access")
|
|
|
|
|
|
|
|
def log_message(self, format, *args):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
class PasswordProtectedSiteTestCase(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.server = HTTPServer((support.HOST, 0), RobotHandler)
|
|
|
|
|
|
|
|
self.t = threading.Thread(
|
|
|
|
name='HTTPServer serving',
|
|
|
|
target=self.server.serve_forever,
|
|
|
|
# Short poll interval to make the test finish quickly.
|
|
|
|
# Time between requests is short enough that we won't wake
|
|
|
|
# up spuriously too many times.
|
|
|
|
kwargs={'poll_interval':0.01})
|
|
|
|
self.t.daemon = True # In case this function raises.
|
|
|
|
self.t.start()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self.server.shutdown()
|
|
|
|
self.t.join()
|
|
|
|
self.server.server_close()
|
|
|
|
|
2016-09-11 09:17:53 -03:00
|
|
|
@support.reap_threads
|
2008-07-18 17:59:44 -03:00
|
|
|
def testPasswordProtectedSite(self):
|
2014-06-25 06:58:15 -03:00
|
|
|
addr = self.server.server_address
|
|
|
|
url = 'http://' + support.HOST + ':' + str(addr[1])
|
|
|
|
robots_url = url + "/robots.txt"
|
|
|
|
parser = urllib.robotparser.RobotFileParser()
|
|
|
|
parser.set_url(url)
|
|
|
|
parser.read()
|
|
|
|
self.assertFalse(parser.can_fetch("*", robots_url))
|
|
|
|
|
|
|
|
|
|
|
|
class NetworkTestCase(unittest.TestCase):
|
Merged revisions 57620-57771 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r57771 | thomas.wouters | 2007-08-30 23:54:39 +0200 (Thu, 30 Aug 2007) | 5 lines
Don't lie in __all__ attributes when SSL is not available: only add the SSL
classes when they are actually created.
........
r57620 | walter.doerwald | 2007-08-28 18:38:26 +0200 (Tue, 28 Aug 2007) | 5 lines
Fix title endtag in HTMLCalender.formatyearpage(). Fix documentation for
HTMLCalender.formatyearpage() (there's no themonth parameter).
This fixes issue1046.
........
r57622 | georg.brandl | 2007-08-28 20:54:44 +0200 (Tue, 28 Aug 2007) | 2 lines
Add a crasher for the thread-unsafety of file objects.
........
r57626 | skip.montanaro | 2007-08-29 01:22:52 +0200 (Wed, 29 Aug 2007) | 1 line
fixes 813986
........
r57628 | walter.doerwald | 2007-08-29 01:35:33 +0200 (Wed, 29 Aug 2007) | 2 lines
Fix test output.
........
r57631 | skip.montanaro | 2007-08-29 03:24:11 +0200 (Wed, 29 Aug 2007) | 2 lines
Install pygettext (once the scriptsinstall target is working again).
........
r57633 | skip.montanaro | 2007-08-29 03:33:45 +0200 (Wed, 29 Aug 2007) | 2 lines
Recent items.
........
r57650 | neal.norwitz | 2007-08-29 08:15:33 +0200 (Wed, 29 Aug 2007) | 1 line
Add Bill as a developer
........
r57651 | facundo.batista | 2007-08-29 12:28:28 +0200 (Wed, 29 Aug 2007) | 5 lines
Ignore test failures caused by 'resource temporarily unavailable'
exceptions raised during FailingServerTestCase tests.
[GSoC - Alan McIntyre]
........
r57680 | bill.janssen | 2007-08-30 00:35:05 +0200 (Thu, 30 Aug 2007) | 17 lines
This contains a number of things:
1) Improve the documentation of the SSL module, with a fuller
explanation of certificate usage, another reference, proper
formatting of this and that.
2) Fix Windows bug in ssl.py, and general bug in sslsocket.close().
Remove some unused code from ssl.py. Allow accept() to be called on
sslsocket sockets.
3) Use try-except-else in import of ssl in socket.py. Deprecate use of
socket.ssl().
4) Remove use of socket.ssl() in every library module, except for
test_socket_ssl.py and test_ssl.py.
........
r57714 | georg.brandl | 2007-08-30 12:09:42 +0200 (Thu, 30 Aug 2007) | 2 lines
Stronger urge to convert filenames to str before using them as argument to ZipFile.write().
........
r57716 | georg.brandl | 2007-08-30 12:38:56 +0200 (Thu, 30 Aug 2007) | 2 lines
Patch #1680959: add test suite for pipes module.
........
r57717 | georg.brandl | 2007-08-30 14:32:23 +0200 (Thu, 30 Aug 2007) | 3 lines
* Skip test_pipes on non-POSIX.
* Don't raise TestSkipped within a test function.
........
r57723 | mark.summerfield | 2007-08-30 17:03:03 +0200 (Thu, 30 Aug 2007) | 3 lines
Added more cross-references.
........
r57726 | walter.doerwald | 2007-08-30 17:30:09 +0200 (Thu, 30 Aug 2007) | 2 lines
Rewrap line.
........
r57727 | walter.doerwald | 2007-08-30 17:34:55 +0200 (Thu, 30 Aug 2007) | 2 lines
Set startinpos before calling the error handler.
........
r57730 | bill.janssen | 2007-08-30 19:07:28 +0200 (Thu, 30 Aug 2007) | 3 lines
Added docstrings to methods and functions.
........
r57743 | bill.janssen | 2007-08-30 20:08:06 +0200 (Thu, 30 Aug 2007) | 1 line
added note on new ssl module and deprecation of socket.ssl
........
r57747 | martin.v.loewis | 2007-08-30 20:14:01 +0200 (Thu, 30 Aug 2007) | 1 line
Fix popen usage.
........
r57748 | martin.v.loewis | 2007-08-30 20:15:22 +0200 (Thu, 30 Aug 2007) | 1 line
Fix typo.
........
r57750 | martin.v.loewis | 2007-08-30 20:25:47 +0200 (Thu, 30 Aug 2007) | 1 line
Bug #1746880: Correctly install DLLs into system32 folder on Win64.
........
r57760 | martin.v.loewis | 2007-08-30 21:04:09 +0200 (Thu, 30 Aug 2007) | 1 line
Bug #1709599: Run test_1565150 only if the file system is NTFS.
........
r57762 | martin.v.loewis | 2007-08-30 22:10:57 +0200 (Thu, 30 Aug 2007) | 2 lines
Bump autoconf minimum version to 2.61.
........
r57764 | lars.gustaebel | 2007-08-30 22:24:31 +0200 (Thu, 30 Aug 2007) | 2 lines
Warn about possible risks when extracting untrusted archives.
........
r57769 | thomas.wouters | 2007-08-30 23:01:17 +0200 (Thu, 30 Aug 2007) | 7 lines
Somewhat-preliminary slice-object and extended slicing support for ctypes.
The exact behaviour of omitted and negative indices for the Pointer type may
need a closer look (especially as it's subtly different from simple slices)
but there's time yet before 2.6, and not enough before 3.0a1 :-)
........
2007-08-30 19:15:33 -03:00
|
|
|
|
2016-09-18 05:21:57 -03:00
|
|
|
base_url = 'http://www.pythontest.net/'
|
|
|
|
robots_txt = '{}elsewhere/robots.txt'.format(base_url)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls):
|
(partially)
Merged revisions 79534,79537,79539,79558,79606 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r79534 | florent.xicluna | 2010-03-31 23:21:54 +0200 (mer, 31 mar 2010) | 2 lines
Fix test for xml.etree when using a non-ascii path. And use check_warnings instead of catch_warnings.
........
r79537 | florent.xicluna | 2010-03-31 23:40:32 +0200 (mer, 31 mar 2010) | 2 lines
Fix typo
........
r79539 | florent.xicluna | 2010-04-01 00:01:03 +0200 (jeu, 01 avr 2010) | 2 lines
Replace catch_warnings with check_warnings when it makes sense. Use assertRaises context manager to simplify some tests.
........
r79558 | florent.xicluna | 2010-04-01 20:17:09 +0200 (jeu, 01 avr 2010) | 2 lines
#7092: Fix some -3 warnings, and fix Lib/platform.py when the path contains a double-quote.
........
r79606 | florent.xicluna | 2010-04-02 19:26:42 +0200 (ven, 02 avr 2010) | 2 lines
Backport some robotparser test and skip the test if the external resource is not available.
........
2010-04-02 15:52:12 -03:00
|
|
|
support.requires('network')
|
2016-09-18 05:21:57 -03:00
|
|
|
with support.transient_internet(cls.base_url):
|
|
|
|
cls.parser = urllib.robotparser.RobotFileParser(cls.robots_txt)
|
|
|
|
cls.parser.read()
|
|
|
|
|
|
|
|
def url(self, path):
|
|
|
|
return '{}{}{}'.format(
|
|
|
|
self.base_url, path, '/' if not os.path.splitext(path)[1] else ''
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_basic(self):
|
|
|
|
self.assertFalse(self.parser.disallow_all)
|
|
|
|
self.assertFalse(self.parser.allow_all)
|
|
|
|
self.assertGreater(self.parser.mtime(), 0)
|
|
|
|
self.assertFalse(self.parser.crawl_delay('*'))
|
|
|
|
self.assertFalse(self.parser.request_rate('*'))
|
|
|
|
|
|
|
|
def test_can_fetch(self):
|
|
|
|
self.assertTrue(self.parser.can_fetch('*', self.url('elsewhere')))
|
|
|
|
self.assertFalse(self.parser.can_fetch('Nutch', self.base_url))
|
|
|
|
self.assertFalse(self.parser.can_fetch('Nutch', self.url('brian')))
|
|
|
|
self.assertFalse(self.parser.can_fetch('Nutch', self.url('webstats')))
|
|
|
|
self.assertFalse(self.parser.can_fetch('*', self.url('webstats')))
|
|
|
|
self.assertTrue(self.parser.can_fetch('*', self.base_url))
|
|
|
|
|
|
|
|
def test_read_404(self):
|
|
|
|
parser = urllib.robotparser.RobotFileParser(self.url('i-robot.txt'))
|
|
|
|
parser.read()
|
|
|
|
self.assertTrue(parser.allow_all)
|
|
|
|
self.assertFalse(parser.disallow_all)
|
|
|
|
self.assertEqual(parser.mtime(), 0)
|
2016-09-18 14:17:58 -03:00
|
|
|
self.assertIsNone(parser.crawl_delay('*'))
|
|
|
|
self.assertIsNone(parser.request_rate('*'))
|
2008-07-18 17:59:44 -03:00
|
|
|
|
2002-02-28 11:24:47 -04:00
|
|
|
if __name__=='__main__':
|
2013-03-12 02:49:12 -03:00
|
|
|
unittest.main()
|