-
-
Save brevno/8bd64d1400680c641c9599af4106473b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# habraproxy.py — это простейший http-прокси-сервер, запускаемый локально | |
# (порт на ваше усмотрение), который показывает содержимое страниц Хабра. | |
# С одним исключением: после каждого слова из шести букв должен стоять | |
# значок «™». Примерно так: | |
# | |
# http://habrahabr.ru/company/yandex/blog/258673/ | |
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
# Сейчас на фоне уязвимости Logjam все в индустрии в очередной раз обсуждают | |
# проблемы и особенности TLS. Я хочу воспользоваться этой возможностью, чтобы | |
# поговорить об одной из них, а именно — о настройке ciphersiutes. | |
# | |
# http://127.0.0.1:8232/company/yandex/blog/258673/ | |
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
# Сейчас™ на фоне уязвимости Logjam™ все в индустрии в очередной раз обсуждают | |
# проблемы и особенности TLS. Я хочу воспользоваться этой возможностью, чтобы | |
# поговорить об одной из них, а именно™ — о настройке ciphersiutes. | |
# | |
# Условия: | |
# * Python 2.x | |
# * можно использовать любые общедоступные библиотеки, | |
# которые сочтёте нужным | |
# * чем меньше кода, тем лучше. PEP8 — обязательно | |
# * в случае, если не хватает каких-то данных, следует опираться | |
# на здравый смысл | |
# | |
# Если задача кажется слишом простой, можно добавить следующее: | |
# * параметры командной строки (порт, хост, сайт, отличный от хабра и т.п.) | |
# * после старта локального сервера автоматически запускается браузер | |
# с открытой обработанной™ главной страницей | |
from flask import Flask, Response, request | |
import requests | |
from bs4 import BeautifulSoup | |
from bs4.element import NavigableString | |
import re | |
app = Flask(__name__) | |
@app.route('/') | |
@app.route('/<path:url>') | |
def home(url=''): | |
req = requests.get('http://habrahabr.ru/%s' % url, params=request.args) | |
if req.headers['content-type'].startswith('text/html'): | |
return Response(process_html(req.text), | |
content_type=req.headers['content-type']) | |
else: | |
return Response(req.iter_content(), | |
content_type=req.headers['content-type']) | |
def process_html(html): | |
# Новый адрес - нужен для подстановки в ссылки вместо http://habrahabr.ru | |
new_address = re.sub('/$', '', request.host_url) | |
bs = BeautifulSoup(html, 'html5lib') | |
tags = bs.body.find_all(text=True) | |
for tag in tags: | |
if type(tag) != NavigableString\ | |
or tag.parent.name in ['script', 'style']: | |
continue | |
# TODO: Узнать, нужно ли заменять адрес в ссылках на странице. | |
# По умолчанию считаю, что нужно | |
if tag.parent.name == 'a' and 'href' in tag.parent.attrs: | |
tag.parent.attrs['href'] = re.sub(ur'^https?://habrahabr\.ru', | |
new_address, | |
tag.parent.attrs['href']) | |
tag.replace_with(re.sub(ur'\b(\w{6})\b', | |
ur'\1™', tag, | |
flags=re.U | re.I | re.S | re.M)) | |
return str(bs) | |
if __name__ == '__main__': | |
app.run() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
beautifulsoup4==4.4.1 | |
Flask==0.11.1 | |
requests==2.10.0 | |
html5lib==0.9999999 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment