Philipp Hasenfratz: Proxi-Dienst

Beitrag lesen

Halihallo Forumer

Der Thread, wovon dieses Posting abstammt (die Ursache, warum ich das Programmiere) ist leider schon verschwunden, jedoch noch nicht im Archiv. Deshalb kann ich noch keine URL posten. Es ging jedoch darum, um auf dem IIS Server (nur eine IP, nur eine Website möglich) dennoch verschiedene Websites zu verwalten. Frank hat mir hierbei eine Möglichkeit über Virtual Directories aufgezeigt, die ich im Moment verfolge. Hierzu leite ich Requests auf Websites in Virtuelle Directories auf dem IIS weiter, über einen "pseudo-Proxi". Dieses Programm besteht bereits, jedoch ist mir etwas "komisches" aufgefallen, was ich mir noch nicht erklären kann:

Wenn der Browser eine Connection zu meinem Proxi aufbaut, bekomme ich alle Informationen. Sende ich jedoch die Datei an den Browser, kann ich keine HTTP-Header Daten mitsenden. Jetzt frage ich mich, warum?

Connection aufbauen:
my $sock = new IO::Socket::INET( LocalAddr => 'localhost',
     LocalPort => 8080,
     Listen  => 5,
     Reuse  => 1,
     Proto  => 'tcp' )
  or die 'cannot initialise listener';

über Requests iterieren:
while ( my $client = $sock->accept ) {

Daten einlesen:
   while ( my $line = $client->getline ) {
      unless ($content) {
         push @header, $line;
      } else {
         push @content, $line;
      }
      $content=1 if ($line =~ /^\015\012$/ );
   }

Testrückgabe:
@headers = ('Content-Type: text/html', 'Set-Cookie: ...');
print $client join("\015\012", @headers) . "\015\012" . &LWP::Simple::get($url);

Aber dann werden mir die Headerdaten als Test im Browser angezeigt. Als ob der Browser gar keine Headerdaten erwarten würde und den ganzen Content ausgibt.
Weiss da jemand Rat?

2 Frage: (zu Sockets eigentlich allgemein)
Ich habe schon seit eh und jeh ein kleines Problem, was mir auf'm Herzen liegt: Der Browser sendet einen Header (eventuell mit Content für POST-Request) über das Socket. Diese kann ich dann über getline z. B. auslesen, oder ganz einfach als Filehandler (über'n Diamantoperator, oder wie der heisst). Aber wie zum ... kann ich testen, ob noch mehr Daten über das Socket gesendet wurden, bzw. wie kann ich wissen, dass ich alle Daten ausgelesen habe? - Wie muss ich die Bedinung formulieren, dass das Auslesen des Sockets fertig ist, wenn die letzten Daten eingelesen sind? - Gibt es da eine EOF Methode?

Viele Grüsse

Philipp