Module: GameServer::BaseListner

Includes:
DaemonLogger::Mixins
Defined in:
lib/base_listner.rb

Overview

Базовый модуль для прослушивания JSON запросов от клиента

Constant Summary collapse

MAX_INPUT_BUFFER_SIZE =
128 * 1024

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from DaemonLogger::Mixins

#log, #log_exception, #with_exception_logging

Instance Attribute Details

#input_bufferObject

В этом буфере хранится начало сообщения от клиента, если оно вдруг разбилось на несколько кусоков данных



59
60
61
# File 'lib/base_listner.rb', line 59

def input_buffer
  @input_buffer
end

Instance Method Details

#connection_infoObject



31
32
33
# File 'lib/base_listner.rb', line 31

def connection_info
  "CONNECTION"
end

#critical_error(e) ⇒ Object



51
52
53
54
55
# File 'lib/base_listner.rb', line 51

def critical_error(e)
  log_exception e
  send_error(e.class.to_s.underscore)
#    close_connection_after_writing
end

#find_controller(request) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/base_listner.rb', line 14

def find_controller(request)
  return unless request.name =~ /^[A-Za-z_]+$/
  x = (controllers_classes_root + "::" + request.name.camelize)
  log x
  x.constantize
rescue NameError
  return
end

#initialize(*args) ⇒ Object



9
10
11
12
# File 'lib/base_listner.rb', line 9

def initialize(*args)
  super(*args)
  self.input_buffer = ""
end

#policy_file_request(data) ⇒ Object



103
104
105
106
107
108
109
110
# File 'lib/base_listner.rb', line 103

def policy_file_request(data)
  if data =~ /^<policy-file-request/
    send_data(File.open(Rails.root + 'config/crossdomain.xml' + "\000").read)
    #close_connection_after_writing
    return true
  end
  return false
end

#process_query(query_string) ⇒ Object

Обработать один запрос



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/base_listner.rb', line 87

def process_query(query_string)
  request = GameServer::RequestParser.new(query_string).parse
  controller = find_controller(request)
  return send_error('unknown_request', request.name) unless controller
  controller.new(self, request, GameServer::ObjectSpace.instance).run
rescue GameServer::RequestParser::ParserError
  send_error('bad_syntax')
rescue GameServer::ServerError => e
  send_error("server_error", "#{e.name} #{!(e.comment.empty?) ? ':' + e.comment : ''}")
rescue GameError => e
  send_error(e.class.to_s.underscore)
rescue => e
  critical_error(e)
end

#receive_data(data) ⇒ Object

Обработать входящие данные (может быть несклько строк запросов в одном пакете данных)



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/base_listner.rb', line 62

def receive_data(data)
  data.gsub!("\000", "")

  complete_message = input_buffer + data
  if complete_message[-1] != "\n"
    self.input_buffer = complete_message
    if input_buffer.size >= MAX_INPUT_BUFFER_SIZE
      self.input_buffer.clear
      raise "OVERFLOW OF INPUT BUFFER #{input_buffer.size}"
    end
    return
  else
    input_buffer.clear
  end

  log "Received from #{connection_info} (size #{complete_message.size}): " + complete_message.inspect
  return if policy_file_request(complete_message)
  complete_message.split("\n").each do |query_string|
    process_query(query_string)
  end
rescue => e
  critical_error(e)
end

#send_data(data) ⇒ Object



45
46
47
48
# File 'lib/base_listner.rb', line 45

def send_data(data)
  log "Data sended to #{connection_info}: " + data#.inspect
  super(data)
end

#send_error(name, comment = "") ⇒ Object



23
24
25
# File 'lib/base_listner.rb', line 23

def send_error(name, comment = "")
  send_line(['error', name, comment].to_json )
end

#send_json(object) ⇒ Object



36
37
38
39
# File 'lib/base_listner.rb', line 36

def send_json(object)
  #send_line '<?xml version="1.0" encoding="UTF-8"?>' + "\n<message>\n" + object.to_json + "\n</message>\n\000"
  send_line object.to_json
end

#send_json_with_marker(marker, object) ⇒ Object



41
42
43
# File 'lib/base_listner.rb', line 41

def send_json_with_marker(marker, object)
  send_json [marker, object]
end

#send_line(string) ⇒ Object



27
28
29
# File 'lib/base_listner.rb', line 27

def send_line(string)
  send_data(string + "\000\n" )
end