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= |