Christian Kruse: Sockets... HTTP... Proxi... ARGHHH!

Beitrag lesen

Hallo Philipp,

while ( my $client = $sock->accept ) {
   xxx
}

bei xxx hab ich so ziemlich alles ausprobiert, was ich kenne, um den ganzen
HTTP-Request einzulesen... @arr = <$client>; $t = <$client>,
while ( <$client> ), ... alles, alles, sogar mit $client->eof...

Das funktioniert so nicht :)
Du musst das anders machen. Du musst den Header zeilenweise einlesen und
verarbeiten, z. B. so:

my %headers;
$headers{_firstline} = <$sock>;

while(<$sock>) {
  last if m/^\s*$/;
  if(m/^(\S+): (.*)$/) {
    $headers{$1} = $2;
  }
}

my $data;
if($headers{_firstline} =~ /^POST/) {
  read $sock, $data, $headers{Content-Length};
}

my $ssock = new IO::Socket::INET(
  PeerPort => 80,
  PeerAddr => adresse
);

delete $headers{Connection} if exists $headers{Connection};

print delete $headers{_firstline},"\015\012";

print $ssock $_,": ",$headers{$_},"\015\012" foreach keys %headers;
print $ssock "Connection: close\015\012\015\012";

Und dann die Daten vom Server abholen und an den Client schicken. Hier kannst
du recht einfach mit @lines = <$ssock> arbeiten, weil du dem Server ja gesagt
hast, 'du, ich will, dass die Verbindung geschlossen wird!'.

Beim einlesen vom Client funktioniert das deshalb nicht, weil der Socket ja
die ganze Zeit offen bleibt. Der <>-Operator blockt dann, wenn der Client
nichts mehr schickt, weil er auf weitere Daten wartet.

Gruesse,
 CK