tomservo has asked for the wisdom of the Perl Monks concerning the following question:

Hola, senioritas muy bonita! I am writing an encrypted tunneling proxy for HTTP using Perl on one end and I am having trouble receiving data from the browser due to the header having a variable number of lines and the number of lines to read from the incoming socket can change. If I use something like this:
while ( $buffer = <$client> ) { $input = $input.$buffer; }

The code will keep blocking waiting for more input after all the data has come through. Sometimes, the browser adds the If-modified-since line in the header so if I use a static number of reads, the data will be without this line and the terminating character that comes with it and the browser won't understand the request.

Any help that you can give is greatly appreciated.

-Tom Servo

Replies are listed 'Best First'.
Re: Reading from a socket
by ozone (Friar) on May 17, 2002 at 12:31 UTC
    Well, you don't say whether you're using standard sockets, but if you are, the easier way is to use IO::Socket::INET to connect to the server, then set it to non-blocking mode like so:
    my $socket = IO::Socket::INET->new(.....); $socket->blocking(0);
    You can the use IO::Select to find out when some data is ready for reading.
    HTH.
      Oops, that is somewhat of an important detail. Yes, I am using IO::Socket::INET. Thank you for the response. Also, I read over the sections on IO::Select in the "Perl Cookbook" and though the theory sounded great, the application of it appeared to be extremely obtuse and I ended up generating more problems that way. Right now, I am just going to stay as basic and clean as possible since this is my first stab at sockets with Perl.

      As a note, the program that I am writing uses a Perl proxy that runs on a box that is inside a firewall and receives requests from a browser that is inside the same firewall. The Perl script then encrypts the request and sends it through the firewall to the other part of the "tunnel" which is an app written in C that decrypts the request and sends it to the appropriate web server and the process is reversed. When I have finished it I will post all of the code here for anyone that is curious or interested. It is not very practical since not everyone has a Linux box outside a firewall to tunnel requests to but it is just an academic exercise to pick up some network skills.

      -Tom Servo

        Hmmm, well, I've had a similar problem, and I basically just used Squid to handle the HTTP side and then an ssh tunnel to get through the firewall. Most browsers support proxies natively. :-)

        Also, LWP::Simple Perl module would probably do the job in for the HTTP requests, if you're absolutely stuck. Why reinvent the wheel? ;-)