WebSocket
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/WebSocket/Version.pm view on Meta::CPAN
if( $dict->{version} == $opts->{version} )
{
# Return a copy
return( { %$dict } );
}
}
return( {} );
}
elsif( exists( $opts->{draft} ) && length( $opts->{draft} ) )
{
return( $self->error( "draft option value contains illegal characters." ) ) if( $opts->{draft} !~ /^[\w\-]+$/ );
my $draft = lc( $opts->{draft} );
for( my $i = 0; $i < scalar( @$IETF_VERSIONS ); $i += 2 )
{
if( $IETF_VERSIONS->[$i] eq $draft )
{
# Return a copy
return( { %{$IETF_VERSIONS->[ $i + 1 ]} } );
}
}
return( {} );
}
elsif( $opts->{type} && $opts->{revision} )
{
return( $self->error( "Unknow draft type \"$opts->{type}\"." ) ) if( $opts->{type} !~ /^(hixie|hybi)$/i );
my $draft = lc( $opts->{type} ) eq 'hybi'
? sprintf( 'draft-ietf-hybi-%02d', $opts->{revision} )
: sprintf( 'draft-hixie-%02d', $opts->{revision} );
return( $self->get_dictionary( draft => $draft ) );
}
elsif( $opts->{serial} )
{
return( $self->error( "Serial option provided is not an integer." ) ) if( $opts->{serial} !~ /^\d+$/ );
for( my $i = 0; $i < scalar( @$IETF_VERSIONS ); $i += 2 )
{
my $dict = $IETF_VERSIONS->[ $i + 1 ];
if( $dict->{serial} == $opts->{serial} )
{
return( { %$dict } );
}
}
return( {} );
}
else
{
return( $self->error( "Unknown arguments: '", join( "', '", @_ ), "'" ) );
}
}
sub issued { return( shift->_set_get_datetime( 'issued', @_ ) ); }
sub new_from_request
{
my $self = shift( @_ );
my $class = ref( $self ) || $self;
my $req = shift( @_ ) || return( $self->error( "No WebSocket::Request object was provided." ) );
return( $self->error( "Object provided (", overload::StrVal( $req ), ") is not a WebSocket::Request object." ) ) if( !$self->_is_a( $req, 'WebSocket::Request' ) );
my $h = $req->headers || return( $self->error( "Unable to find the WebSocket::Headers object." ) );
unless( ref( $self ) )
{
$self = bless( {} => $class )->SUPER::init( @_ );
}
my $new;
# From version 4 onward
if( $h->header( 'Sec-WebSocket-Version' )->length ||
$h->header( 'Sec-WebSocket-Key' )->length )
{
if( $h->header( 'Sec-WebSocket-Version' )->length &&
$h->header( 'Sec-WebSocket-Version' )->match( qr/^\d{1,2}$/ ) )
{
$new = $self->new( $h->header( 'Sec-WebSocket-Version' )->scalar, debug => $self->debug ) || return( $self->pass_error );
}
# Version 10 or lower; From version 11, it uses 'Origin' only; but from version 0 to 3, it uses also Origin
elsif( $h->header( 'Sec-WebSocket-Origin' )->length )
{
$new = $self->new( 'draft-ietf-hybi-10', debug => $self->debug ) || return( $self->pass_error );
}
# Sec-WebSocket-Key has started to be used since version 4
# We default to the latest version 17
else
{
$new = $self->new( 'draft-ietf-hybi-17', debug => $self->debug ) || return( $self->pass_error );
}
}
# From version 2 to 3 for Sec-WebSocket-Draft and from version Hixie 76 for Sec-WebSocket-Key1 and Sec-WebSocket-Key2
elsif( $h->header( 'Sec-WebSocket-Draft' )->length ||
( $h->header( 'Sec-WebSocket-Key1' ) && $h->header( 'Sec-WebSocket-Key2' ) ) )
{
if( $h->header( 'Sec-WebSocket-Draft' ) )
{
$new = $self->new( $h->header( 'Sec-WebSocket-Draft' )->scalar, debug => $self->debug ) || return( $self->pass_error );
}
# draft version 3 is the latest one using key1 and key2
else
{
$new = $self->new( 'draft-ietf-hybi-03', debug => $self->debug ) || return( $self->pass_error );
}
}
# No Sec-WebSocket-Key1? then it is Hixie75
else
{
if( $h->header( 'Sec-WebSocket-Protocol' )->length )
{
# $new would stringify to undef since there is no version in the WebSocket protocol for those early drafts
$new = $self->new( 'draft-hixie-76', debug => $self->debug );
return( $self->pass_error ) if( !defined( $new ) );
}
elsif( $h->header( 'WebSocket-Protocol' )->length )
{
$new = $self->new( 'draft-hixie-75', debug => $self->debug );
return( $self->pass_error ) if( !defined( $new ) );
}
# No WebSocket headers found, so this looks like a draft version 7 when there was only
# Connect, Upgrade, Host and Origin
else
{
$new = $self->new( 'draft-hixie-07', debug => $self->debug );
return( $self->pass_error ) if( !defined( $new ) );
}
}
return( $new );
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.730 second using v1.00-cache-2.02-grep-82fe00e-cpan-48ebf85a1963 )