MiniProxy на Perl или PHP

Форум для программистов

Сообщение FSA » Ср окт 01, 2003 5:08 pm

Ну не знаю как тему лучше назвать, так что пояняю что я хочу.
Имеется хостинг с поддержкой Perl, PHP. Хостинг платный.
Также имеется некий сайт на этом же хостинге, но он любит добавлять в страничку всякую лабуду: шапку с баннерами и пр. Однако этим сайтом периодически приходится пользоваться.
Интересно, возможно ли каким-то образом запросив страницу со своего хостинга вместо неё отображать информацию с другого сайта, но только определённым образом обработанную??? При этом должна быть поддержка cookie (куки в принципе можно хранить и на моём хостинге, все равно кроме меня этим никто пользоваться не должен) и передачи данных из форм методом POST.
"Скажи мне свой IP, и я скажу кто ты!"
Подпись: nslookup
FSA
Подполковник
 
Сообщений: 748
Зарегистрирован: Сб апр 20, 2002 8:38 pm
Откуда: Тавда, Россия.
Пункты репутации: 0

Сообщение SiMM » Ср окт 01, 2003 5:11 pm

Не проще ли поставить на локальной машине обычную баннерорезку?
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)
SiMM
Подполковник
 
Сообщений: 588
Зарегистрирован: Чт июн 13, 2002 8:41 am
Пункты репутации: 0

Сообщение FSA » Ср окт 01, 2003 6:02 pm

И так стоит. Но проблема в том, что я не всегда на одном компе работаю. Да и включать иногда забываю. А про тот сайт, что порезать надо, я точно знаю, что существует центральная часть и к ней прицепом шапку делают и низ, которые никакой полезной инфы не несут, а один мусор. Если их убить у меня трафик раза в 3 уменьшится, а с моим каналом огромное увеличение скорости!!!
"Скажи мне свой IP, и я скажу кто ты!"
Подпись: nslookup
FSA
Подполковник
 
Сообщений: 748
Зарегистрирован: Сб апр 20, 2002 8:38 pm
Откуда: Тавда, Россия.
Пункты репутации: 0

Сообщение ita » Чт окт 02, 2003 6:11 am

2FSA
сделать можно, тебе под один сайт это затачивать?
делается все с пом fsokopen(), данные постом без проблем отправятся, с куками.. помоему и с куками получится. все равно они в заголовке отправляются\принимаются.
как должно работать:
твой скрипт получает запрос от пользователя, берет все переменные окружения (куки, пост, гет..) и формирует из них запрос.
дальше открывает соединение с нужным тебе сайтом, отправляет запрос, читает ответ. обрабатывает ответ, вырезает из текста ненужные тебе куски, меняет ссылки к картинка на полные до этих картинок, обычные ссылки и пути в формах - на пути к твоему сайту.
вроде все, да, с картинками могут быть проблемы если их ихний сервер не будет выпускать.

так вроде все, но намучаешься ты с ним прилично <!--emo&:)-->Изображение<!--endemo-->
Последний раз редактировалось ita Чт окт 02, 2003 6:45 am, всего редактировалось 1 раз.
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение FSA » Чт окт 02, 2003 6:58 am

<!--QuoteBegin--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->сделать можно, тебе под один сайт это затачивать?<!--QuoteEnd--></td></tr></table><span class='postcolor'><!--QuoteEEnd-->
да, под один.
С передачей данных разобрался, осталось доку по протоколу HTTP найти, чтобы правильно заголовки сформировать. Пока получилось заPOSTить данные и в ответ получить нужную страницу. Теперь надо узнать как куки отправлять.
<!--QuoteBegin--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->вроде все, да, с картинками могут быть проблемы если их ихний сервер не будет выпускать.<!--QuoteEnd--></td></tr></table><span class='postcolor'><!--QuoteEEnd-->
Картинки мало нужны, можно и к себе перекинуть, всё равно пути к ним относительные и их немного.
Ещё немного не разобрался как всю структуру сайта через один скрипт иммитировать. В принципе сделал 404(да и не только, все ошибки на неё перенаправил) страницу и в неё всё запихнул. Вроде работает, но кто его знает.
"Скажи мне свой IP, и я скажу кто ты!"
Подпись: nslookup
FSA
Подполковник
 
Сообщений: 748
Зарегистрирован: Сб апр 20, 2002 8:38 pm
Откуда: Тавда, Россия.
Пункты репутации: 0

Сообщение ita » Чт окт 02, 2003 7:07 am

2FSA
поставь програмку, Proxomitron <a href='http://www.proxomitron.org/' target='_blank'>http://www.proxomitron.org/</a>, я в ней смотрел как заголовки выглядят.
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение MAPA3bM » Чт окт 02, 2003 11:41 pm

В поставке UT2003 есть скрипт, занимающийся как раз этим:
Код: выделить все
#!/usr/bin/perl -w -T
#
# This code is public domain, and has NO WARRANTY. It's barely tested.
#
# Run this as root (really), and let it listen on port 80 (root privs are
# dropped after opening the port). It then passes data through to a port on
# the localhost. This lets you run UT2003 dedicated servers as regular users
# but still use WebAdmin on port 80.
#
# Either put it in your /etc/inetd.conf or run it with --daemonize to put it
#  in the background.
#
# Tweak the below vars to your liking.
#
#  --ryan. (ryan@epicgames.com)
#
use strict;
use warnings;
use IO::Socket::INET;
use IO::Select;
my $version = "1.0";
my $daemonize = 0;   # can be changed on cmdline.
my $use_syslog = 1;  # can be changed on cmdline.
my $wanted_uid = 99;  # "nobody" on my box.
my $wanted_gid = 98;  # "nobody" on my box.
my $server_port = 80; # port we listen on. 80 is standard HTTP.
my $passthru_host = 'localhost'; # host to passthru to.
my $passthru_port = 8080; # port to connect to for passthrough.
my $max_connects = 10; # maximum connections we accept at once.
my $safe_path = "";
sub syslog_and_die {
   my $err = shift;
   $err .= "\n";
   syslog("info", $err) if ($use_syslog);
   die($err);
}
sub telluser {
   my $text = shift;
   if ($use_syslog) {
syslog("info", "$text\n");
   }
}
sub passthru_mainline {
   my $sock = IO::Socket::INET->new(PeerAddr => $passthru_host,
    PeerPort => $passthru_port,
                                    Type => SOCK_STREAM,
                                    Proto => 'tcp');
   telluser("couldn't create passthru socket: $!"), return 1 if (not $sock);
   # FIXME: This is probably the wrong way to do this.
   my $sel = new IO::Select();
   my $sel1 = new IO::Select();
   $sel->add(fileno(STDIN));
   $sel->add($sock);
   $sel1->add(fileno(STDIN));
   my $ch;
   while (1) {
if (scalar($sel->can_read())) {
   if (scalar($sel1->can_read(0))) {
last if (sysread(STDIN, $ch, 1) != 1);
last if (syswrite($sock, $ch, 1) != 1);
   } else {
last if (sysread($sock, $ch, 1) != 1);
last if (syswrite(STDOUT, $ch, 1) != 1);
   }
}
   }
   telluser("ending passthru");
   close($sock);
}
sub go_to_background {
   use POSIX 'setsid';
   chdir('/') or syslog_and_die("Can't chdir to '/': $!");
   open STDIN,'/dev/null' or syslog_and_die("Can't read '/dev/null': $!");
   open STDOUT,'>/dev/null' or syslog_and_die("Can't write '/dev/null': $!");
   defined(my $pid=fork) or syslog_and_die("Can't fork: $!");
   exit if $pid;
   setsid or syslog_and_die("Can't start new session: $!");
   open STDERR,'>&STDOUT' or syslog_and_die("Can't duplicate stdout: $!");
   telluser("Daemon process is now detached");
}
sub drop_privileges {
   delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
   $ENV{'PATH'} = $safe_path;
   $) = $wanted_gid if (defined $wanted_gid);
   $> = $wanted_uid if (defined $wanted_uid);
}
sub signal_catcher {
   my $sig = shift;
   telluser("Got signal $sig. Shutting down.");
   exit 0;
}
my @kids;
use POSIX ":sys_wait_h";
sub reap_kids {
   my $i = 0;
   my $x = scalar(@kids);
   while ($i < scalar(@kids)) {
       my $rc = waitpid($kids[$i], &WNOHANG);
       if ($rc != 0) {  # reaped a zombie.
           splice(@kids, $i, 1); # take it out of the array.
       } else {  # still alive, try next one.
           $i++;
       }
   }
   $SIG{CHLD} = \&reap_kids;  # make sure this works on crappy SysV systems.
}
# Mainline.
foreach (@ARGV) {
   $daemonize = 1, next if $_ eq '--daemonize';
   $daemonize = 1, next if $_ eq '-d';
   $daemonize = 0, next if $_ eq '--no-daemonize';
   $use_syslog = 1, next if $_ eq '--syslog';
   $use_syslog = 1, next if $_ eq '-s';
   $use_syslog = 0, next if $_ eq '--no-syslog';
   die("Unknown command line \"$_\".\n");
}
if ($use_syslog) {
   use Sys::Syslog qw(:DEFAULT setlogsock);
   setlogsock("unix");
   openlog("ip_passthru", "user") or die("Couldn't open syslog: $!\n");
}
my $retval = 0;
if (not $daemonize) {
   drop_privileges();
   exit passthru_mainline();
}
# The daemon.
telluser("$0 $version starting up...");
go_to_background() if ($daemonize);
# reap zombies from client forks...
$SIG{CHLD} = \&reap_kids;
$SIG{TERM} = \&signal_catcher;
$SIG{INT} = \&signal_catcher;
my $listensock = IO::Socket::INET->new(LocalPort => $server_port,
                                      Type => SOCK_STREAM,
                                      ReuseAddr => 1,
                                      Listen => $max_connects);
syslog_and_die("couldn't create listen socket: $!") if (not $listensock);
my $selection = new IO::Select( $listensock );
drop_privileges();
telluser("Now accepting connections (max $max_connects" .
" simultaneous on port $server_port).");
while (1)
{
   # prevent connection floods.
   sleep(1) while (scalar(@kids) >= $max_connects);
   $selection->can_read();  # block until we get a connection.
   # we've got a connection!
   my $client = $listensock->accept();
   if (not $client) {
       telluser("accept() failed: $!");
       next;
   }
   my $ip = $client->peerhost();
   telluser("connection from $ip");
   my $kidpid = fork();
   if (not defined $kidpid) {
       telluser("fork() failed: $!");
       close($client);
       next;
   }
   if ($kidpid) {  # this is the parent process.
       close($client);  # parent has no use for client socket.
       push @kids, $kidpid;
   } else {
       $ENV{'TCPREMOTEIP'} = $ip;
       close($listensock);   # child has no use for listen socket.
       local *FH = $client;
       open(STDIN, "<&FH") or syslog_and_die("no STDIN reassign: $!");
       open(STDERR, ">&FH") or syslog_and_die("no STDERR reassign: $!");
       open(STDOUT, ">&FH") or syslog_and_die("no STDOUT reassign: $!");
       my $retval = passthru_mainline();
       close(*FH);
       exit $retval;  # kill child.
   }
}
close($listensock);  # shouldn't ever hit this.
exit $retval;
# end


Пойдёт?
MAPA3bM
Полковник
 
Сообщений: 1270
Зарегистрирован: Вт дек 31, 2002 12:54 am
Откуда: Приморье
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1