LINUX.ORG.RU
ФорумAdmin

Прозрачное проксирование и парсер для http


0

0

В общем, хочется странного.

Есть сервер, через который должны ходить пользователи (прозрачный http-proxy). И эти самые пользователи, конечно, любят отправлять всякие разные post и get данные. А серверы, на которые они ходят, отвечают им всяческими http-заголовками и собственно отдают html.

А хотелось бы контроллировать весь http-трафик. То есть берем какой-нибудь python+re+BeautifulSoup, пишем скрипт, и заставляем этот скрипт выполняться на любой чих (любой запрос) на наш прозрачный прокси. И каким-нибудь образом передаем нашему скрипту url и все данные (headers+html), чтобы он смог их потом обрабатывать. Ну, и так же хотелось бы, чтобы скрипт умел опознавать заголовок Content-Type, и запускался только для text/html, text/plain, text/xml, text/json, к примеру.

Понимаю, что нужно копать в сторону squid+squidguard, читал документацию, но так не представил, как это можно реализовать. Есть идеи?

Ответ на: комментарий от power

В общем, я пришел к тому, что squid и его директива url_rewrite_program мне должны помочь. Надеюсь, что я не ошибаюсь. Но так я не нашел, как решить свою задачу "изкоробки", то, видимо, мне придется реализовать собственный реврайтер на питоне. Нагуглил вот такую ссылку — http://www.rejik.ru/index140.html. Сам он написан на си, но си я не знаю, поэтому чтобы разобраться в нем и переписать на питоне, придется затратить немало времени.

Нужно, чтобы скрипт получал всю страницу с хедерами, потом искал, например какой-то хедер до первого входждения, менял его, и отдавал клиенту. Или заменял ссылки на свои. И так далее и тому подобное.

А еще, дело в том, что клиентов у сквида моего прокси будет не мало, поэтому нужно найти какое-нибудь не очень дорогое решение.

Про l7 не уверен. Важно очень быстро решить задачу. И иметь красивый парсер html в видe python+re+BeautifulSoup. А пока погуглю про l7.

cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

В общем, я пришел к тому, что squid и его директива url_rewrite_program мне должны помочь. Надеюсь, что я не ошибаюсь.

Ты ошибся. Реврайтеры (которым является и rejik, и squidGuard и куча других подобных примочек к squid'у) получают на вход запрошенные URL'ы и на выход выдают так же URL'ы, те же или изменённые (например URL на баннер заменяют на URL на пустой файл). Самого контента они никак не касаются и не могут.

Нужно, чтобы скрипт получал всю страницу с хедерами, потом искал, например какой-то хедер до первого входждения, менял его, и отдавал клиенту. Или заменял ссылки на свои. И так далее и тому подобное.

Смотри в сторону протокола ICAP или libecap. По протоколу ICAP squid может отдавать запросы от клиента и контент стороннему серверу, который может делать со всем этим что хочет, в том числе изменять. libecap предназначена для того же, но это не протокол, а библиотека, с помощью которой можно писать модули для прокси-сервера (пока это поддерживает только squid 3.1).

Deleted
()
Ответ на: комментарий от Deleted

Да, действительно. Найдя в сети squidredirector.py и рассмотрев исходники я понял, что это действительно не то, что мне нужно.

На gentoo.ru предложили использовать nginx как прокси, и прикрутить к нему скриптец, который позволит скачивать и парсить контент. В эту степь стоит идти?

cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

На gentoo.ru предложили использовать nginx как прокси, и прикрутить к нему скриптец, который позволит скачивать и парсить контент. В эту степь стоит идти?

Работать по идее будет, но ИМХО обычный CGI будет медленнее, чем ICAP-сервер и тем более ecap-модуль для прокси-сервера. Хотя намного проще для разработки.

Deleted
()
Ответ на: комментарий от cheerfulboy

У меня в генте нет ни одного ебилда с именем icap, или ecap, кроме libecap.

Поддержка icap встроена в squid искаропки довольно давно. Поддержка ecap появится в версии 3.1 (на данный момент в состоянии беты, собирать с USE=ecap).

Deleted
()
Ответ на: комментарий от Deleted

И просто скрипт ты не сможешь прикрутить ни с icap, ни с libecap. В случае icap придётся писать либо свой icap-сервер с полной реализацией протокола, либо писать модуль для существующего icap-сервера. В случае libecap придётся писать модуль на C++.

Deleted
()
Ответ на: комментарий от Deleted

этот самый icap+squid умеет, например поглядеть cookie с именем login, сделать select count(*) from users where login='login' в mysql, потом получить по http, регекспы, yaml, json?

cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

этот самый icap+squid умеет, например поглядеть cookie с именем login, сделать select count(*) from users where login='login' в mysql, потом получить по http, регекспы, yaml, json?

ICAP - это протокол. В squid'е есть встроенная реализация icap-клиента. Если ты напишешь icap-сервер, который будет «поглядеть cookie с именем login, сделать select count(*) from users where login='login' в mysql, потом получить по http, регекспы, yaml, json?», то да, умеет =). Смысл icap в том, что он даёт возможность прокси-серверу передавать весь трафик между клиентом и реальным сервером на обработку (фильтацию, модификацию и т.п.) стороннему серверу.

Ты прежде чем вопросы задавать, погугли хотя бы. Ссылку на wiki и RFC я давал, там всё разжёвано.

Deleted
()
Ответ на: комментарий от Deleted

Прости, я правда на шею подсел. Всю ночь искал решение, а щас носом клюю. Высплюсь — обязательно все изучу. Спасибо огромное!

cheerfulboy
() автор топика
Ответ на: комментарий от Deleted

про ICAP не знал, спасибо. Похожее раньше делал на перловом HTTP::Proxy

a_andry
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.