home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / robotparser.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  5.8 KB  |  206 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. import urlparse
  5. import urllib
  6. __all__ = [
  7.     'RobotFileParser']
  8.  
  9. class RobotFileParser:
  10.     
  11.     def __init__(self, url = ''):
  12.         self.entries = []
  13.         self.default_entry = None
  14.         self.disallow_all = False
  15.         self.allow_all = False
  16.         self.set_url(url)
  17.         self.last_checked = 0
  18.  
  19.     
  20.     def mtime(self):
  21.         return self.last_checked
  22.  
  23.     
  24.     def modified(self):
  25.         import time
  26.         self.last_checked = time.time()
  27.  
  28.     
  29.     def set_url(self, url):
  30.         self.url = url
  31.         (self.host, self.path) = urlparse.urlparse(url)[1:3]
  32.  
  33.     
  34.     def read(self):
  35.         opener = URLopener()
  36.         f = opener.open(self.url)
  37.         lines = [ line.strip() for line in f ]
  38.         f.close()
  39.         self.errcode = opener.errcode
  40.         if self.errcode in (401, 403):
  41.             self.disallow_all = True
  42.         elif self.errcode >= 400:
  43.             self.allow_all = True
  44.         elif self.errcode == 200 and lines:
  45.             self.parse(lines)
  46.  
  47.     
  48.     def _add_entry(self, entry):
  49.         if '*' in entry.useragents or self.default_entry is None:
  50.             self.default_entry = entry
  51.         
  52.         self.entries.append(entry)
  53.  
  54.     
  55.     def parse(self, lines):
  56.         state = 0
  57.         linenumber = 0
  58.         entry = Entry()
  59.         for line in lines:
  60.             linenumber += 1
  61.             if not line:
  62.                 if state == 1:
  63.                     entry = Entry()
  64.                     state = 0
  65.                 elif state == 2:
  66.                     self._add_entry(entry)
  67.                     entry = Entry()
  68.                     state = 0
  69.                 
  70.             i = line.find('#')
  71.             if i >= 0:
  72.                 line = line[:i]
  73.             line = line.strip()
  74.             if not line:
  75.                 continue
  76.             line = line.split(':', 1)
  77.             if len(line) == 2:
  78.                 line[0] = line[0].strip().lower()
  79.                 line[1] = urllib.unquote(line[1].strip())
  80.                 if line[0] == 'user-agent':
  81.                     if state == 2:
  82.                         self._add_entry(entry)
  83.                         entry = Entry()
  84.                     entry.useragents.append(line[1])
  85.                     state = 1
  86.                 elif line[0] == 'disallow' or state != 0:
  87.                     entry.rulelines.append(RuleLine(line[1], False))
  88.                     state = 2
  89.                 
  90.             elif line[0] == 'allow':
  91.                 if state != 0:
  92.                     entry.rulelines.append(RuleLine(line[1], True))
  93.                     state = 2
  94.                 
  95.             
  96.         
  97.         if state == 2:
  98.             self._add_entry(entry)
  99.  
  100.     
  101.     def can_fetch(self, useragent, url):
  102.         if self.disallow_all:
  103.             return False
  104.         if None.allow_all:
  105.             return True
  106.         parsed_url = None.urlparse(urllib.unquote(url))
  107.         url = urlparse.urlunparse(('', '', parsed_url.path, parsed_url.params, parsed_url.query, parsed_url.fragment))
  108.         url = urllib.quote(url)
  109.         if not url:
  110.             url = '/'
  111.         for entry in self.entries:
  112.             if entry.applies_to(useragent):
  113.                 return entry.allowance(url)
  114.         
  115.         if self.default_entry:
  116.             return self.default_entry.allowance(url)
  117.  
  118.     
  119.     def __str__(self):
  120.         return ''.join([ str(entry) + '\n' for entry in self.entries ])
  121.  
  122.  
  123.  
  124. class RuleLine:
  125.     
  126.     def __init__(self, path, allowance):
  127.         if path == '' and not allowance:
  128.             allowance = True
  129.         self.path = urllib.quote(path)
  130.         self.allowance = allowance
  131.  
  132.     
  133.     def applies_to(self, filename):
  134.         if not self.path == '*':
  135.             pass
  136.         return filename.startswith(self.path)
  137.  
  138.     
  139.     def __str__(self):
  140.         if not self.allowance or 'Allow':
  141.             pass
  142.         return 'Disallow' + ': ' + self.path
  143.  
  144.  
  145.  
  146. class Entry:
  147.     
  148.     def __init__(self):
  149.         self.useragents = []
  150.         self.rulelines = []
  151.  
  152.     
  153.     def __str__(self):
  154.         ret = []
  155.         for agent in self.useragents:
  156.             ret.extend([
  157.                 'User-agent: ',
  158.                 agent,
  159.                 '\n'])
  160.         
  161.         for line in self.rulelines:
  162.             ret.extend([
  163.                 str(line),
  164.                 '\n'])
  165.         
  166.         return ''.join(ret)
  167.  
  168.     
  169.     def applies_to(self, useragent):
  170.         useragent = useragent.split('/')[0].lower()
  171.         for agent in self.useragents:
  172.             if agent == '*':
  173.                 return True
  174.             agent = None.lower()
  175.             if agent in useragent:
  176.                 return True
  177.         
  178.         return False
  179.  
  180.     
  181.     def allowance(self, filename):
  182.         for line in self.rulelines:
  183.             if line.applies_to(filename):
  184.                 return line.allowance
  185.         
  186.         return True
  187.  
  188.  
  189.  
  190. class URLopener(urllib.FancyURLopener):
  191.     
  192.     def __init__(self, *args):
  193.         urllib.FancyURLopener.__init__(self, *args)
  194.         self.errcode = 200
  195.  
  196.     
  197.     def prompt_user_passwd(self, host, realm):
  198.         return (None, None)
  199.  
  200.     
  201.     def http_error_default(self, url, fp, errcode, errmsg, headers):
  202.         self.errcode = errcode
  203.         return urllib.FancyURLopener.http_error_default(self, url, fp, errcode, errmsg, headers)
  204.  
  205.  
  206.