Class: Rubtella::Sender

Inherits:
Object
  • Object
show all
Defined in:
lib/rubtella/rubtella.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#connectedObject

Returns the value of attribute connected.



67
68
69
# File 'lib/rubtella/rubtella.rb', line 67

def connected
  @connected
end

#peerObject

Returns the value of attribute peer.



67
68
69
# File 'lib/rubtella/rubtella.rb', line 67

def peer
  @peer
end

Instance Method Details

#connectObject



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_reqObject



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_respObject



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_peersObject



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 message
  parsed = TCPData::Parser.new message
  @@logger.info parsed.message
  
  parsed.message

end

#send_pingObject



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