WebSocket

 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 distribution
 view release on metacpan -  search on metacpan

( run in 1.730 second using v1.00-cache-2.02-grep-82fe00e-cpan-48ebf85a1963 )