Philipp Hasenfratz: Sockets... HTTP... Proxi... ARGHHH!

Beitrag lesen

Halihallo Christian

Das funktioniert so nicht :)

Das musste ich schmerzlich auch feststellen :-)

Du musst das anders machen.

und das die logische Folge ;)

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;
  }
}

soweit war ich schon mal...

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

OK. Also, dann muss ich das so machen, wie ihr (micha hat das ja ebenfalls genannt).

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.

Das verwirrt mich jetzt etwas. Bei anderen Scripts hat das bei mir bestens funktioniert, oder irre ich mich? (also: ist es normalerweise nicht so, dass Perl merkt, wann keine Daten mehr gesendet wurden? - Und ich spreche von Sockets, die nicht geschlossen wurden)...

Also sowas:

Server:

print $client 'hello world'
my @answer = <$sock>;
print $client join("\n", @answer);

Client:

@server = <$sock>;
print $sock 'Re: hello world';
print 'I wrote: '.join('', <$sock>);

ich glaube, dass ich sowas in der Art schon realisieren konnte, also mit offenen Sockets dennoch den <>-Operator verwenden.

Besten dank euch beiden. Hat mir sehr geholfen

Viele Grüsse

Philipp