Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Apache2 IO write: (103) Software caused...


Автор: infarch 6.11.2012, 14:16
Возникает странная ошибка на сервере у заказчика : Apache2 IO write: (103) Software caused connection abort at... 

Ни на девелоперских машинах под виндой, ни на тестовом сервере под убунтой такого нет. А вот в продукции периодически вылезает. Меня туда не пустят посмотреть, заказчик трясется как Кощей над яйцом. Так что приходится доходить эмпирически.

Вот функция в которой происходит ошибка:

Код

sub send_as_attachment {
    my ($path, $filename, $params) = @_;
    
    throw Exception::ScriptError( message => "File $path is not found" )
        unless -e $path && !-d $path;
    
    my $size = -s $path;
    
    my $mimetype = "application/octet-stream";
        my $disposition = 'attachment';
        my $printfilename = $filename;
    if(defined $params){
        $mimetype = $params->{file_type} if exists $params->{file_type};
        $disposition = $params->{disposition} if exists $params->{disposition};
        $printfilename = $params->{filename} if exists $params->{filename};
    }
    
    # open file
    open( INFILE, $path ) ||
        throw Backbone::Exception::ScriptError( message => "File $path could not be opened" );
    # print headers
    print "Content-Disposition: $disposition; filename=\"$printfilename\"\r\n";
    print "Content-Length: $size\r\n";
    print "Content-Type: $mimetype\r\n";
    print "Content-Transfer-Encoding: binary\r\n";
    print "Expires: 0\r\n\r\n";

    # send file
    binmode(INFILE);
    binmode(STDOUT);
    my $buffer;
    while ( read(INFILE, $buffer, 4096) ) {
        print $buffer; <-------------------------------------------- HERE
    }
    close(INFILE);
}



Я отметил строку на которой все падает. Еще в контроллере есть одна опция: binmode( STDOUT, ':encoding(utf8)' );
Добавлено для автоматического перекодирования в ютф8 при отправке контента. А эта функция отсылает файлы, поэтому и binmode(STDOUT); Может в этом и дело?

Однако, как я говорил, у меня все работает нормально... Помогите, знатоки, советами!

Автор: Pfailed 6.11.2012, 15:04
А как это работает? Через  ModPerl::Registry?

Автор: infarch 6.11.2012, 15:18
Да, апач и модперл. Касаемо конфигурации, то вот:

Код

<VirtualHost *:80>
    
    DocumentRoot "C:/bb_projekt/VVS/webserver/htdocs/"
    
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    
    <Directory "c:/bb_projekt/VVS/webserver/htdocs">
        Options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
        
    ScriptAlias /controller "c:/bb_projekt/VVS/webserver/cgi-shl/controller.pl"
    <Location /controller>
        SetHandler perl-script
        PerlResponseHandler ModPerl::Registry
        Options +ExecCGI
        PerlOptions +ParseHeaders
    </Location>

</VirtualHost>



Это с моей машины, а в продукции только пути отличаются.

Автор: Pfailed 6.11.2012, 15:55
Ну да, ModPerl::Registry - это такой костыль, который позволяет пускать CGI-подобные скрипты под mod_perl.
Не удивительно, что там могут происходить странные вещи. Советую погуглить по поводу STDOUT и ModPerl::Registry, Apache::Registry, mod_perl.
Вполне возможно что эти binmode влияют на STDOUT (который вроде бы tied) не должным образом.
Здесь есть что-то (хотя это про первый mod_perl) http://perl.apache.org/docs/1.0/guide/porting.html#STDIN__STDOUT_and_STDERR_streams

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)