Changeset 813
- Timestamp:
- 01/28/09 20:02:26 (10 months ago)
- Location:
- trunk
- Files:
-
- 2 modified
-
CHANGES (modified) (1 diff)
-
lib/Perlbal/ClientHTTPBase.pm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/CHANGES
r812 r813 1 -- Fix X-REPROXY-FILE to work with SSL connections (Greg Denton) 2 1 3 -- Syslog as 'crit' rather than 'critical' (noticed by Richard Bronosky) 2 4 -
trunk/lib/Perlbal/ClientHTTPBase.pm
r809 r813 295 295 } 296 296 297 sub reproxy_file_done { 298 my Perlbal::ClientHTTPBase $self = shift; 299 return if $self->{service}->run_hook('reproxy_fh_finished', $self); 300 # close the sendfile fd 301 CORE::close($self->{reproxy_fh}); 302 $self->{reproxy_fh} = undef; 303 if (my $cb = $self->{post_sendfile_cb}) { 304 $cb->(); 305 } else { 306 $self->http_response_sent; 307 } 308 } 309 297 310 # client is ready for more of its file. so sendfile some more to it. 298 311 # (called by event_write when we're actually in this mode) … … 302 315 my $remain = $self->{reproxy_file_size} - $self->{reproxy_file_offset}; 303 316 $self->tcp_cork(1) if $self->{reproxy_file_offset} == 0; 317 $self->watch_write(0); 318 319 if ($self->{service}->{listener}->{sslopts}) { # SSL (sendfile does not do SSL) 320 return if $self->{closed}; 321 if ($remain <= 0) { #done 322 print "REPROXY SSL done\n" if Perlbal::DEBUG >= 2; 323 $self->reproxy_file_done; 324 return; 325 } 326 # queue up next read 327 Perlbal::AIO::set_file_for_channel($self->{reproxy_file}); 328 my $len = $remain > 4096 ? 4096 : $remain; # buffer size 329 my $buffer = ''; 330 Perlbal::AIO::aio_read( 331 $self->{reproxy_fh}, 332 $self->{reproxy_file_offset}, 333 $len, 334 $buffer, 335 sub { 336 return if $self->{closed}; 337 # we have buffer to send 338 my $rv = $_[0]; # arg is result of sysread 339 if (!defined($rv) || $rv <= 0) { # read error 340 # sysseek is called after sysread so $! not valid 341 $self->close('sysread_error'); 342 print STDERR "Error w/ reproxy sysread\n"; 343 return; 344 } 345 $self->{reproxy_file_offset} += $rv; 346 $self->tcp_cork(1); # by setting reproxy_file_offset above, 347 # it won't cork, so we cork it 348 $self->write($buffer); # start socket send 349 $self->watch_write(1); 350 } 351 ); 352 return; 353 } 304 354 305 355 # cap at 128k sendfiles 306 356 my $to_send = $remain > 128 * 1024 ? 128 * 1024 : $remain; 307 308 $self->watch_write(0);309 357 310 358 my $postread = sub { … … 327 375 328 376 if ($sent >= $remain) { 329 return if $self->{service}->run_hook('reproxy_fh_finished', $self); 330 331 # close the sendfile fd 332 CORE::close($self->{reproxy_fh}); 333 334 $self->{reproxy_fh} = undef; 335 if (my $cb = $self->{post_sendfile_cb}) { 336 $cb->(); 337 } else { 338 $self->http_response_sent; 339 } 377 $self->reproxy_file_done; 340 378 } else { 341 379 $self->watch_write(1);
