Advertisement
Guest User

anonymous.py

a guest
May 7th, 2015
345
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.44 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3.  
  4. from urllib2 import urlopen
  5.  
  6. # Простой пример «анонимайзера».
  7. # Предупреждение: он не является полноценным и носит исключительно
  8. # демонстрационный характер с целью показать принцип работы.
  9. # Не использовать всерьёз.
  10. # И уж тем более не копировать отсюда код исправления ссылок.
  11.  
  12. logo = '<div style="position: fixed; top: 0; left: 0; background-color: rgba(255, 32, 32, 0.7); padding: 0.5em">Anonymous</div>'
  13.  
  14. def application(environ, start_response):
  15.     # получаем URL, который необходимо загрузить
  16.     url = environ['PATH_INFO'].lstrip('/')
  17.  
  18.     # скачиваем документ
  19.     req = urlopen(url)
  20.     data = req.read(2 * 1024 ** 3)
  21.  
  22.     if url.find('/', 8) < 0:
  23.         baseurl = url + '/'
  24.     else:
  25.         baseurl = url[:url.find('/', 8)] + '/'
  26.  
  27.     # получаем тип документа
  28.     ctype = req.headers.get('Content-Type', 'text/plain')
  29.     ctype_short = ctype.split(';', 1)[0]
  30.  
  31.     # если это html или css, то исправляем ссылки, чтобы они вели на «анонимайзер»
  32.     if ctype_short == 'text/html':
  33.         for prefix in ('href="', 'src="', "href='", "src='"):
  34.             data = data.replace(' %s//' % prefix, ' %shttp://' % prefix)
  35.             data = data.replace(' %s/' % prefix, (' %s/' % prefix) + baseurl)
  36.             for proto in ('http://', 'https://'):
  37.                 data = data.replace(' ' + prefix + proto, ' ' + prefix + '/' + proto)
  38.  
  39.         # добавляем плашку, уведомляющую об «анонимайзере»
  40.         if '</body>' in data:
  41.             data = data.replace('</body>', logo + '\n</body>')
  42.         else:
  43.             data += logo
  44.  
  45.     if ctype_short in ('text/html', 'text/css') or url.endswith('.css'):
  46.         data = data.replace('url(//', 'url(http://')
  47.         data = data.replace('url(/', 'url(/' + baseurl)
  48.         for proto in ('http://', 'https://'):
  49.             data = data.replace('url(' + proto, 'url(/' + proto)
  50.  
  51.     # отправляем ответ пользователю
  52.     start_response('%d %s' % (req.code, req.msg), [('Content-Type', ctype), ('Content-Length', str(len(data)))])
  53.     return [data]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement