Module: GameServer::BaseListner
Overview
Базовый модуль для прослушивания JSON запросов от клиента
Constant Summary
collapse
- MAX_INPUT_BUFFER_SIZE =
128 * 1024
Instance Attribute Summary collapse
-
#input_buffer ⇒ Object
В этом буфере хранится начало сообщения от клиента, если оно вдруг разбилось на несколько кусоков данных.
Instance Method Summary
collapse
#log, #log_exception, #with_exception_logging
Instance Attribute Details
В этом буфере хранится начало сообщения от клиента, если оно вдруг разбилось на несколько кусоков данных
59
60
61
|
# File 'lib/base_listner.rb', line 59
def input_buffer
@input_buffer
end
|
Instance Method Details
#connection_info ⇒ Object
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)
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)
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..empty?) ? ':' + e. : ''}")
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 super(data)
end
|
#send_error(name, comment = "") ⇒ Object
23
24
25
|
# File 'lib/base_listner.rb', line 23
def send_error(name, = "")
send_line(['error', name, ].to_json )
end
|
#send_json(object) ⇒ Object
36
37
38
39
|
# File 'lib/base_listner.rb', line 36
def send_json(object)
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
|