PROXY  WHOIS  RQUOTE  TEXTS  SOFT  FOREX  BBOARD
 Music  Philosophy  Code  Literature  Russian

= ROOT|Technical|Proxy_Docs|_Perl_code|httpproxy-1.5.3.pl =

page 5 of 8



	      quickresp 502,"Error decoding chunked body",$sck;
	      serverclose $sck;
	      next READ_FHS;
	    }
	  }
	  # html filter
	  if ($html_filter and $st{$st{$sck}{ch}}{resp_fields} =~ m|^Content-Type:\s*text/html|im) {
	    debug "Filtering HTML...", $sck;
	    htmlfilter \$st{$sck}{chunked_buff};
	  }
	  $st{$st{$sck}{ch}}{resp_fields} .= join "", "Content-Length: ", length($st{$sck}{chunked_buff}), "\r\n";
	  $st{$st{$sck}{ch}}{resp} = join "",$st{$st{$sck}{ch}}{resp_line}, $st{$st{$sck}{ch}}{resp_fields}, "\r\n", 
$st{$sck}{chunked_buff};
	  delete $st{$sck}{chunked_buff};
	  $st{$st{$sck}{ch}}{resp_len} = length $st{$st{$sck}{ch}}{resp};
	  $st{$st{$sck}{ch}}{resp_offset} = 0;

	  $sl_write->add($st{$sck}{ch});
	  serverclose $sck;
	}
	elsif (defined($byte_read) and $byte_read == 0) { # No more data from server
	  $st{$st{$sck}{ch}}{resp_offset} = 0;	  
	  if ($html_filter and $st{$st{$sck}{ch}}{resp_fields} =~ m|^Content-Type:\s*text/html|im) {
	    debug "Filtering HTML2...", $sck;
	    htmlfilter \$st{$st{$sck}{ch}}{resp};
	  }
	  # prepare select to write client
	  $sl_write->add($st{$sck}{ch});
	  serverclose $sck;
	}
	else { # header is sent but there're still data
	  if ($html_filter and $st{$st{$sck}{ch}}{resp_fields} =~ m|^Content-Type:\s*text/html|im) { # html filter
	    debug "Filtering HTML2...", $sck;
	    htmlfilter \$st{$st{$sck}{ch}}{resp};
	  }

	  # Fast passing method
	  # prepare select to write Client
	  $sl_read->remove($sck); 
	  $sl_write->add($st{$sck}{ch}); 
	  $st{$st{$sck}{ch}}{resp_offset} = 0;
	  debug "Fast-Passing to Client", $sck;
	}
      }
    }
  }

 WRITE_FHS: for my $sck (@$aref_write) { # let's server writable handles

    if ($st{$sck}{tipe} == 2) { # Server is ready to write
      debug "#select# => Server writeable",$sck,1;
      my $index = 0;
      my $byte_written;
      while (1) {	
	last if $st{$st{$sck}{ch}}{req_len} <= 0;
	++$index;
	if ($index > $max_iter) {
	  debug "$max_iter iteration reached, switching task",$sck;
	  next WRITE_FHS;
	}
	$byte_written = syswrite $sck, $st{$st{$sck}{ch}}{req}, $st{$st{$sck}{ch}}{req_len}, $st{$st{$sck}{ch}}{req_offset};

	if (defined $byte_written ) {
	  if ($byte_written == 0) { # remote client/server just closed the connection
	    debug "Server closed then connection when sending to Server",$sck;
	    quickresp 502,"Connection to server broke when writing", $sck;
	    serverclose $sck;
	    next WRITE_FHS;
	  }
	  debug "Proxy->Server ($byte_written bytes)",$sck;
	  $st{$st{$sck}{ch}}{req_len} -= $byte_written;
	  $st{$st{$sck}{ch}}{req_offset} += $byte_written;
	}
	elsif ($! == EAGAIN()) { #server overloaded, return later to finish sending request
	  debug "Server overloaded, skipping... (non-blocking)",$sck;
	  next WRITE_FHS; #this loop
	}
	else { # Something weird happens
	  debug "Server connection error when sending to Server",$sck;
	  quickresp 502,"Connection to server broke when writing",$sck;
	  serverclose $sck;
	  next WRITE_FHS;
	}
      }

      #prepare select to read srver
      $sl_write->remove($sck);
      $sl_read->add($sck);
    }

    elsif ($st{$sck}{tipe} == 1) { #Client is ready to write
      debug "#select# => Client writeable",$sck,1;
      my $index = 0;
      my $byte_written;
      $st{$sck}{resp_offset} ||= 0; # give default value
      while (1) {
	++$index;
	if ($index > $max_iter) {
	  debug "$max_iter iteration reached...going to next task",$sck;	  
	  next WRITE_FHS;
	}
	if ($st{$sck}{resp_len} <= 0) { # if finish writing data, get some more from server
=5=

1|2|3|4| < PREV = PAGE 5 = NEXT > |6|7|8

UP TO ROOT | UP TO DIR | TO FIRST PAGE

Google
 


E-mail Facebook Google Digg del.icio.us BlinkList Fark Furl Ma.gnolia Netscape NewsVine Reddit Slashdot Spurl StumbleUpon Technorati YahooMyWeb LiveJournal Blogmarks TwitThis Live News2.ru BobrDobr.ru Memori.ru MoeMesto.ru

0.0165191 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU)