All,

I was able to figure out the issue below. However, I am now facing an
issue where if the response is 'VALID' it is not fetching the requested
page as could be implied by the return statement. Also, sometimes I
observed that even if the response is VALID, it still redirects to
GOOGLE. 

        #Check the status       
        if ($result ="INVALID"){        
                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;

I would appreciate if you could point me to what I am doing wrong. 

Thanks
Sumit


> -----Original Message-----
> From: Sumit Shah 
> Sent: Wednesday, November 08, 2006 7:35 PM
> To: modperl@perl.apache.org
> Subject: Mod_perl and HTTP IO issue
> 
>  
> 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=0
> ee1978f-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