Skip to content

Instantly share code, notes, and snippets.

@brevno
Forked from anonymous/habraproxy.py
Last active July 10, 2016 12:42
Show Gist options
  • Save brevno/8bd64d1400680c641c9599af4106473b to your computer and use it in GitHub Desktop.
Save brevno/8bd64d1400680c641c9599af4106473b to your computer and use it in GitHub Desktop.
# -*- 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()
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