2 package VCS
::Git
::Torrent
::PWP
::Message
::Peers
;
6 VCS::Git::Torrent::PWP::Message::Peers
10 Implements the Peers message from the RFC.
11 L<http://gittorrent.utsl.gen.nz/rfc.html#pwp-peers>
16 with
"VCS::Git::Torrent::PWP::Message";
18 use VCS
::Git
::Torrent
::PWP
qw(:pwp_constants unpack_hex pack_hex pack_num unpack_num);
21 isa
=> "ArrayRef[VCS::Git::Torrent::Peer]",
29 for my $peer ( @
{ $self->peers } ) {
30 $payload .= $peer->peer_id;
31 $payload .= pack('n', $peer->port);
32 $payload .= pack_num
(length($peer->address));
33 $payload .= $peer->address;
45 while ( length($payload) ) {
46 my $peer_id = substr($payload, 0, 20);
47 my $peer_port = unpack('n', substr($payload, 20, 2));
48 my $addr_len = unpack_num
(substr($payload, 22, 4));
49 die 'invalid size' if ( 26 + $addr_len > length($payload) );
50 my $peer_addr = substr($payload, 26, $addr_len);
52 substr($payload, 0, 26 + $addr_len) = '';
54 push @
{ $temp_peers }, [ $peer_id, $peer_port, $peer_addr ];
62 if ( ref($_[0]) eq 'ARRAY' ) {
64 push @
{ $peers }, @
{ $_ };
71 return( peers
=> $peers );
76 my $local_peer = shift;
77 my $connection = shift;
79 if ( scalar(@
{ $temp_peers }) ) { # we got some peers from someone
82 for my $peer (@
{ $temp_peers }) {
83 push @peers, VCS
::Git
::Torrent
::Peer
->new(
84 repo_hash
=> $local_peer->repo_hash,
85 peer_id
=> $peer->[0],
86 peer_port
=> $peer->[1],
87 peer_addr
=> $peer->[2],
91 $self->peers(\
@peers);
93 # check for duplicates
98 $peer->peer_id eq $_->peer_id # && ?
99 } @
{ $local_peer->knows };
104 push @
{ $local_peer->knows }, @new_peers;
105 # push @{ $connection->remote->peers }, @{ $self->peers };
107 else { # it was a request for our peers
109 $_->remote->port ?
$_->remote : ()
110 } @
{ $local_peer->connections };
112 $local_peer->send_message($connection->remote, GTP_PWP_PEERS
,
116 scalar(@
{ $local_peer->knows }) ||