Class: BinProxy::WebConsole::WebSocketHandler

Inherits:
Object
  • Object
show all
Includes:
Logger
Defined in:
lib/binproxy/web_console.rb

Instance Method Summary collapse

Methods included from Logger

log

Constructor Details

#initialize(proxy, socket) ⇒ WebSocketHandler

Returns a new instance of WebSocketHandler.



99
100
101
102
103
104
105
106
107
# File 'lib/binproxy/web_console.rb', line 99

def initialize(proxy, socket)
  @proxy = proxy
  @socket = socket
  @pending_messages = []

  socket.onopen { self.onopen }
  socket.onmessage {|m| self.onmessage(m) }
  socket.onclose { self.onclose }
end

Instance Method Details

#bindata_error(operation, err) ⇒ Object



182
183
184
185
186
187
# File 'lib/binproxy/web_console.rb', line 182

def bindata_error(operation, err)
  socket_send :error, {
    message: "Internal Error in #{operation}: #{err.class}: #{err.message}",
    detail: err.backtrace.join("\n")
  }
end

#message_received(message) ⇒ Object



171
172
173
174
# File 'lib/binproxy/web_console.rb', line 171

def message_received(message)
  log.debug "sending WS message to front-end for message #{message.id}"
  socket_send_message message
end

#oncloseObject



165
166
167
168
169
# File 'lib/binproxy/web_console.rb', line 165

def onclose
  @proxy.delete_observer(self)
#rescue Exception => e
#  puts "caught #{e}", e.backtrace
end

#onmessage(raw_ws_message) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/binproxy/web_console.rb', line 121

def onmessage(raw_ws_message)
  log.debug "websocket message received: #{raw_ws_message}"
  ws_message = JSON.parse(raw_ws_message, symbolize_names: true)
  case ws_message[:action]
  when 'ping'
    socket_send :pong, status: @proxy.status
  when 'forward'
    message = @proxy.update_message_from_hash(ws_message[:message])
    @proxy.send_message(message, :manual)
    socket_send :update, message.to_hash #XXX send all of this, or just update?
  when 'drop'
    #XXX just doing this to get the message object
    message = @proxy.update_message_from_hash(ws_message[:message])
    @proxy.drop_message(message, :manual)
    socket_send :update, message.to_hash #XXX same as above
  when 'setIntercept'
    log.debug "setIntercept: #{ws_message[:value]}"
    @proxy.hold = ws_message[:value]
  when 'load'
    log.debug "load: #{ws_message[:value]}"
    socket_send_message @proxy.buffer[ws_message[:value]]
  when 'getHistory'
    log.error 'unexpected getHistory'
  #  log.debug "getHistory"
  #  @proxy.buffer.each do |message|
  #    socket_send_message message
  #  end
  when 'reloadParser'
    log.debug 'reloadParser'
    begin
      @proxy.configure #XXX this relies on configure to always trigger reload, which is considered a bug
      socket_send :info, message: 'Parser Reloaded'
    rescue Exception => e
      socket_send :error, message: "Parser Reload Failed: #{e.message}", detail: e.backtrace
      log.err_trace(e, 'Reloading Parser')
    end
  else
    log.error 'Unexpected WS message: ' + ws_message.inspect
  end
  log.debug 'Finished processing WS message'
#rescue Exception => e
#  puts "caught #{e}", e.backtrace
end

#onopenObject



116
117
118
119
# File 'lib/binproxy/web_console.rb', line 116

def onopen
  @proxy.add_observer(self, :send)
  socket_send :message_count, @proxy.history_size
end

#session_event(event) ⇒ Object



176
177
178
179
180
# File 'lib/binproxy/web_console.rb', line 176

def session_event(event)
  log.debug "session event #{event}"
  socket_send :event, event.to_hash
  #TODO delete observer if event is connection close
end

#socket_send(type, data) ⇒ Object



109
110
111
112
113
114
# File 'lib/binproxy/web_console.rb', line 109

def socket_send(type, data)
  @socket.send( JSON.generate({
    type: type,
    data: data
  }, max_nesting: 99)) #XXX
end