All,

I have a perl handler that invokes a servlet (HTTP IO) running on a
remote server. The servlet returns a single word response (INVALID or
VALID). The handler is supposed to redirect the URL to some other
website. For testing I redirect it to Google. 
The handler uses plain Socket implementation.  What I am noticing is
that the handler does invoke the servlet but does read the response
back. It seems like the connection gets closed before the handler gets
to read the response. 

But, if I run the handler as a standalone Perl script it works as
expected. Below is the handler code. It is under Apache 1.3.x and
Mod_perl 1.

I would appreciate any suggestions that you may have. 

Thanks
Sumit

########################################################################
######
package Apache::Proxy;

use strict;
use mod_perl 1.17_01;
use Apache::Constants qw(REDIRECT); 
use Apache::Constants qw(OK); 
use Socket;
$Apache::Proxy::VERSION = "1.00";

sub handler {

        my $r = shift;  
        
        my $url =
"http://38.118.10.36/SSOWeb/servlet/SsoProxyServlet?ssotoken=0ee1978f-72
9f-4554-a4d2-5a7df7db7243";
        $url=~m/http\:\/\/([^\:^\/]*)(?:\:(\d+))?\/(.*)/;
        my $host = $1;
        my $port = $2;
        $port = 80 unless($port);
        my $file = '/'.$3;
        
        my $proto = getprotobyname('tcp');
        socket(SOCK, PF_INET, SOCK_STREAM, $proto);
        
        my $sin = sockaddr_in($port, inet_aton($host));
        
        connect(SOCK, $sin) || die "Connect failed: $!\n";
        
        my $old_fh = select(SOCK);
        $|=1;
        select($old_fh);
        
        print SOCK "GET $file HTTP/1.0\n";
        print SOCK "Accept: */*\n";
        print SOCK "User-Agent: webamp\n\n";
        
        my $header = <SOCK>;
        my $content; 
        my $out;
        
        #This part of the code reads the RESPONSE HEADER
        while($content = &sockread())
        {
              $out .= $content;   
              last if ($content =~ /^\015?\012?$/);
        }
        
        my $result='';

        #READ THE RESPONSE BODY
        while (defined($content = <SOCK>)) {
                $result = $result . $content;
        }        
        
        #Check the status       
        if ($result =~ m/INVALID/i){    
                my $url1 = 'http://www.google.com';
                $r->content_type('text/html');
                $r->headers_out->set('Location' => $url1);
                $r->status(Apache::Constants::REDIRECT);
                return Apache::Constants::REDIRECT;
        }
        return;
}

#####################################################
# Attempt to read a line.
sub sockread () {
  my $line;
  
  eval {
      
        local$SIG{ALRM} = sub { die 'timeout!' };
        $line = <SOCK>;
        
  };
  if ($@ and $@ !~ /timeout!/) {warn("during socket read: [EMAIL PROTECTED]")}
  return $line;
} #end

Reply via email to