App-KGB

 view release on metacpan or  search on metacpan

lib/App/KGB/Client/ServerRef.pm  view on Meta::CPAN

        author     => $commit_author,
        branch     => $branch,
        module     => $module,
        extra      => $extra,
    };

    my $meth;
    if ( $protocol_ver eq 'auto' ) {
        $meth = 'send_changes_v4';
    }
    else {
        $meth = "send_changes_v$protocol_ver";
        die "Unsupported protocol version requested ($protocol_ver)\n"
            unless $self->can($meth);
    }

    $self->$meth($info);
}

sub relay_message {
    my ( $self, $client, $message, $opts ) = @_;

    $self->send_changes_json( $client->repo_id,
        { method => 'relay_message', params => [$message, $opts] } );
}

sub send_changes_soap {
    my ( $self, $message ) = @_;

    require SOAP::Lite;

    if ( $self->verbose ) {
        printf "SOAP call: %s/%s\n", $self->uri, $self->proxy;
        print "Message:\n", YAML::Dump($message);
    }
    if ( $self->dry_run ) {
        return;
    }

    my $s = SOAP::Lite->new( uri => $self->uri, proxy => $self->proxy );
    $s->transport->proxy->timeout( $self->timeout // 15 );

    my $res = $s->commit($message);

    # SOAP error?
    if ( $res->fault ) {
        die 'SOAP FAULT while talking to '
            . $self->uri . "\n"
            . 'FAULT MESSAGE: ', $res->fault->{faultstring}, "\n"
            . (
            $res->fault->{detail}
            ? 'FAULT DETAILS: ' . $res->fault->{detail}
            : ''
            );
    }
}

sub send_changes_json {
    my ( $self, $repo_id, $message ) = @_;

    require JSON::XS;
    require JSON::RPC::Client::Any;
    my $rpc = JSON::RPC::Client::Any->new();

    $rpc->ua->timeout($self->timeout // 15);
    $message->{id} = 1;
    $message->{version} = '1.1';
    my $json = eval { JSON::XS::encode_json($message); };
    unless ($json) {
        my $dump;
        if ( require Devel::PartialDump ) {
            $dump = Devel::PartialDump->new->dump($message);
        }
        elsif ( require Data::Dumper ) {
            $dump = Data::Dumper::Dump($message);
        }
        else {
            $dump = '(Neither Devel::PartialDump nor Data::Dumper available)';
        }

        confess "Unable to encode message structure as JSON\n" . $dump . "\n"
            . $@;
    }

    my $hash = sha1_hex( $self->password, $repo_id, $json );

    $rpc->ua->default_header( 'X-KGB-Auth', $hash );
    $rpc->ua->default_header( 'X-KGB-Project', $repo_id );

    if ( $self->verbose ) {
        printf "JSON/RPC call: %s/json-rpc\n", $self->uri;
        print "Headers:\n", $rpc->ua->default_headers->as_string;
        print "Message:\n", YAML::Dump($message);
    }
    if ( $self->dry_run ) {
        return;
    }

    my $res = $rpc->call( $self->uri . '/json-rpc', $message );

    die "Transport error: " . $rpc->status_line . "\n" unless $res;
    die "Server returned error: " . $res->error_message . "\n"
        if $res->is_error;
}

sub send_changes_v2 {
    my ( $self, $info ) = @_;

    my $message = join( "",
        $info->{repo_id},
        $info->{commit_id} // (),
        map( "$_", @{ $info->{changes} } ),
        $info->{commit_log},
        $info->{author} // (),
        $info->{branch} // (),
        $info->{module} // (),
        $self->password );
    utf8::encode($message);
    my $checksum = sha1_hex($message);
    # SOAP::Transport::HTTP tries to convert all characters to byte sequences,
    # but fails. See around line 204
    my @message = (
        2,
        (   map {
                SOAP::Data->type(
                    string => Encode::encode( 'UTF-8', $_ ) )
            } ( $info->{repo_id}, $checksum, $info->{rev_prefix}, $info->{commit_id} )
        ),



( run in 1.224 second using v1.01-cache-2.11-cpan-13bb782fe5a )