Thread Kleiner HTTP-Proxy (0 answers)
Opened by topeg at 2008-10-25 15:46

topeg
 2008-10-25 15:46
#115745 #115745
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich wollte mal sehen wie klein man einen Proxy in perl schreiben kann.
Jetzt überlege ich, wo man, durch geschickte Verwendung von Modulen, noch ein paar Zeilen einsparen könnte.
Möglicherweise weiß einer von euch wo es noch Einsparpotentiale gibt.
Hier der Code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
use URI;
$SIG{CHLD} = 'IGNORE' ;

my $server=IO::Socket::INET->new(
    LocalAddr => shift(@ARGV) || 'localhost',
    LocalPort => shift(@ARGV) || 2258,
    Listen => 5,
    Proto => 'tcp' );
die "ERROR Create Server Socket\n" unless($server);

while (my $client = $server->accept())
{
  binmode($client);
  unless(fork)
  {
    $server->close();
    # Header vom Client lesen
    my ($head,$b_length)=read_head($client);
    # Die ZielURL herausschneiden
    my $url;
    $head =~s/\A(\w+\s+)(\S+)/
            $url = URI->new($2); $_=$1.$url->path_query/es;
    my $socket = IO::Socket::INET->new(
            PeerAddr => $url->host, PeerPort => $url->port );
    die "$$ ERROR Open $url" unless $socket;
    binmode($socket);
    # Wenn Content da ist, auslesen
    my $body= $b_length ? read_body($client,$b_length) : '';
    # alles an den Zielserver schicken
    print $socket $head.$body;
    # Head vom Server lesen
    ($head,$b_length)=read_head($socket);
    # Wenn Content da ist, auslesen
    $body= $b_length ? read_body($socket,$b_length) : '';
    # alles an den Client schicken
    print $client $head.$body;
    # sterben
    exit();
  }
}

sub read_body
{
  shift()->read(my $d,shift());
  return $d;
}

sub read_head
{
  my $sock=shift;
  local $/="\x0D\x0A";
  my ($data,$bl)=('',0);
  while (my $line = <$sock>)
  {
    $data.=$line;
    # Der Header endet einer leeren Zeile
    last if ($line=~m|^$/$|s);
    $bl=$1 if $line=~/Content-length: +(\d+)/i;
  }
  return ($data,$bl);
}

View full thread Kleiner HTTP-Proxy