Apache2-SSI
view release on metacpan or search on metacpan
lib/Apache2/SSI/File/Type.pm view on Meta::CPAN
sub as_json
{
my $self = shift( @_ );
my $data = $self->{magic_data};
my $j = JSON->new->relaxed->allow_nonref;
my $json = $j->pretty->encode( $data );
return( $json );
}
sub check
{
my $self = shift( @_ );
my $file = shift( @_ );
my $prev = $self->check_magic;
$self->check_magic( 1 );
my $io = IO::File->new( "<$file" ) || return( $self->error( "Unable to open magic file \"$file\": $!" ) );
$io->binmode;
$self->{magic}->{io} = $io;
my $data = [];
while( !$io->eof() )
{
$self->read_magic_entry( $data );
}
$io->close();
$self->dump( $data );
$self->check_magic( $prev );
return( $self );
}
sub check_magic { return( shift->_set_get_boolean( 'check_magic', @_ ) ); }
sub data
{
my $self = shift( @_ );
my $data = shift( @_ );
my $type = '';
if( length( $data ) <= 0 )
{
return( $self->{default_type} ? 'application/octet-stream' : '' );
}
$type = $self->with_magic( $data );
# 4) Check if it's text or binary.
# If it's text, then do a bunch of searching for special tokens
if( !defined( $type ) )
{
$type = $self->with_data( $data );
}
if( !defined( $type ) )
{
$type = $self->{default_type} ? 'text/plain' : '';
}
return( $type );
}
sub default_type { return( shift->_set_get_scalar( 'default_type', @_ ) ); }
# Recursively write the magic file to stderr.
# Numbers are written in decimal.
sub dump
{
my $self = shift( @_ );
my $data = shift( @_ ) || $self->{magic_data};
my $depth = shift( @_ );
$data = [] unless( defined( $data ) );
$depth = 0 unless( defined( $depth ) );
our $err = IO::File->new;
$err->autoflush( 1 );
$err->fdopen( fileno( STDERR ), 'w' ) || return( $self->error( "Cannot write to STDERR: $!" ) );
$err->binmode;
foreach my $entry ( @$data )
{
# Delayed evaluation.
$entry = $self->parse_magic_line( @$entry ) if( scalar( @$entry ) == 3 );
next if( !defined( $entry ) );
my( $offtype, $offset, $numbytes, $type, $mask, $op, $testval, $template, $message, $subtests ) = @$entry;
$err->print( '>' x $depth );
if( $offtype == 1 )
{
$offset->[2] =~ tr/c/b/;
$err->printf( "(%s.%s%s)", $offset->[0], $offset->[2], $offset->[3] );
}
elsif( $offtype == 2 )
{
$err->print( "&", $offset );
}
else
{
# offtype == 0
$err->print( $offset );
}
$err->print( "\t", $type );
if( $mask )
{
$err->print( "&", $mask );
}
$err->print( "\t", $op, $testval, "\t", $message, "\n" );
if( $subtests )
{
$self->dump( $subtests, $depth + 1 );
}
}
}
sub error_returns_undef { return( shift->_set_get_boolean( 'error_returns_undef', @_ ) ); }
sub file
{
my $self = shift( @_ );
# The description line. append info to this string
my $desc = '';
my $type = '';
# Iterate over each file explicitly so we can seek
my $file = shift( @_ ) || do
{
if( $self->{error_returns_undef} )
( run in 3.760 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )