Class: Rubtella::Sender
- Inherits:
-
Object
- Object
- Rubtella::Sender
- Defined in:
- lib/rubtella/rubtella.rb
Instance Attribute Summary collapse
-
#connected ⇒ Object
Returns the value of attribute connected.
-
#peer ⇒ Object
Returns the value of attribute peer.
Instance Method Summary collapse
- #connect ⇒ Object
- #handshake_req ⇒ Object
- #handshake_resp ⇒ Object
- #init_peers ⇒ Object
-
#initialize(peer = nil) ⇒ Sender
constructor
A new instance of Sender.
- #manage_connection(stream) ⇒ Object
- #parse(message) ⇒ Object
- #send_ping ⇒ Object
- #send_query(text) ⇒ Object
Constructor Details
#initialize(peer = nil) ⇒ Sender
Returns a new instance of Sender.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/rubtella/rubtella.rb', line 69 def initialize peer = nil @peers = Array.new init_peers if peer @peers << peer end raise RubtellaError, "No peer address! Pleas add peers to hosts file!" if @peers.empty? @peer = @peers.pop @standard_headers = {"User-Agent" => "Rubtella", "X-Ultrapeer" => "False", "X-Query-Routing" => "0.1"} rescue => e @@logger.info e.to_s end |
Instance Attribute Details
#connected ⇒ Object
Returns the value of attribute connected.
67 68 69 |
# File 'lib/rubtella/rubtella.rb', line 67 def connected @connected end |
#peer ⇒ Object
Returns the value of attribute peer.
67 68 69 |
# File 'lib/rubtella/rubtella.rb', line 67 def peer @peer end |
Instance Method Details
#connect ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/rubtella/rubtella.rb', line 89 def connect @@logger.info "connecting to: #{@peer.ip}:#{@peer.port}" stream = nil timeout(5) do stream = TCPSocket.new @peer.ip, @peer.port stream.send handshake_req, 0 @@logger.info handshake_req end @response = stream.recv 1000 resp = HTTPData::Parser.new @response @@logger.info @response if resp.ok? stream.send handshake_resp, 0 @@logger.info handshake_resp #connection established @@logger.info 'connection established' @connected = @peer @@logger.info "Connected with #{@connected.ip} #{@connected.port}" manage_connection stream else @@logger.info 'failed to connect' @peers.concat resp.peers @peer = @peers.pop connect end rescue Timeout::Error,Errno::ECONNREFUSED @@logger.info "Timeout" @peer = @peers.shift retry rescue => e @@logger.info e.to_s end |
#handshake_req ⇒ Object
125 126 127 128 |
# File 'lib/rubtella/rubtella.rb', line 125 def handshake_req req = HTTPData::Builder.new GNUTELLA_REQUEST, @standard_headers req.build end |
#handshake_resp ⇒ Object
130 131 132 133 |
# File 'lib/rubtella/rubtella.rb', line 130 def handshake_resp resp = HTTPData::Builder.new GNUTELLA_RESPONSE_OK, @standard_headers resp.build end |
#init_peers ⇒ Object
182 183 184 185 186 187 188 189 |
# File 'lib/rubtella/rubtella.rb', line 182 def init_peers if File.exist?(ENV["HOME"] + "/.rubtella/hosts") hosts_file = File.open ENV["HOME"] + "/.rubtella/hosts" hosts = hosts_file.read hosts.split("\n") hosts.each {|h| @peers << Peer.new(*(h.split(":")))} end end |
#manage_connection(stream) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/rubtella/rubtella.rb', line 135 def manage_connection stream loop do @@logger.info 'we\'re listening..' resp = stream.recv 10000 @@logger.info resp if parse(resp) == "ping" pong = TCPData::Builder::Pong.new stream.send pong.build , 0 @@logger.info 'pong send..' stream.close @@logger.info 'connection closed' break end end end |
#parse(message) ⇒ Object
154 155 156 157 158 159 160 |
# File 'lib/rubtella/rubtella.rb', line 154 def parse parsed = TCPData::Parser.new @@logger.info parsed. parsed. end |
#send_ping ⇒ Object
162 163 164 165 166 167 168 169 170 |
# File 'lib/rubtella/rubtella.rb', line 162 def send_ping stream = TCPSocket.new @connected.ip, @connected.port query = TCPData::Builder::Ping.new @@logger.info "sending ping" stream.send query.build, 0 @@logger.info 'we\'re listening..' resp = stream.recv 1000 parse(resp) end |
#send_query(text) ⇒ Object
172 173 174 175 176 177 178 179 180 |
# File 'lib/rubtella/rubtella.rb', line 172 def send_query(text) stream = TCPSocket.new @connected.ip, @connected.port query = TCPData::Builder::Query.new(:criteria => text) @@logger.info "sending query - #{text}" stream.send query.build, 0 @@logger.info 'we\'re listening..' resp = stream.recv 1000 parse(resp) end |