Changeset 813

Show
Ignore:
Timestamp:
01/28/09 20:02:26 (10 months ago)
Author:
ask
Message:

Fix X-REPROXY-FILE to work with SSL connections (Greg Denton)

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/CHANGES

    r812 r813  
     1    -- Fix X-REPROXY-FILE to work with SSL connections (Greg Denton) 
     2 
    13    -- Syslog as 'crit' rather than 'critical' (noticed by Richard Bronosky) 
    24 
  • trunk/lib/Perlbal/ClientHTTPBase.pm

    r809 r813  
    295295} 
    296296 
     297sub 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 
    297310# client is ready for more of its file.  so sendfile some more to it. 
    298311# (called by event_write when we're actually in this mode) 
     
    302315    my $remain = $self->{reproxy_file_size} - $self->{reproxy_file_offset}; 
    303316    $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    } 
    304354 
    305355    # cap at 128k sendfiles 
    306356    my $to_send = $remain > 128 * 1024 ? 128 * 1024 : $remain; 
    307  
    308     $self->watch_write(0); 
    309357 
    310358    my $postread = sub { 
     
    327375 
    328376        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; 
    340378        } else { 
    341379            $self->watch_write(1);