dango 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/dango/framework_base.rb +17 -3
- data/lib/dango/server_framework.rb +115 -136
- data/lib/dango/version.rb +1 -1
- metadata +2 -2
data/lib/dango/framework_base.rb
CHANGED
@@ -50,6 +50,7 @@ end
|
|
50
50
|
class DangoFrameworkError < StandardError; end
|
51
51
|
class DangoFrameworkTimeoutError < DangoFrameworkError; end
|
52
52
|
class DangoFrameworkConnectionError < DangoFrameworkError; end
|
53
|
+
class DangoFrameworkFlashPolicyError < DangoFrameworkError; end
|
53
54
|
|
54
55
|
# エラー出力用モジュール
|
55
56
|
module ErrorMessage
|
@@ -145,7 +146,19 @@ module DangoFrameworkModule
|
|
145
146
|
|
146
147
|
raise(DangoFrameworkConnectionError, "size=#{size}:size_str=#{size_str.inspect}") if size == nil || size == 0
|
147
148
|
|
148
|
-
|
149
|
+
## Flash のpolicyファイルだった場合(特殊)
|
150
|
+
if size == 1886350441
|
151
|
+
cs_logger.debug "size=#{size}:size_str=#{size_str.inspect}"
|
152
|
+
receive_data = sock.recv(20)
|
153
|
+
cs_logger.debug "receive_data=#{receive_data}"
|
154
|
+
if size_str + receive_data =~ /^\<policy\-file\-request/ # <policy-file-request/>なら
|
155
|
+
raise(DangoFrameworkFlashPolicyError)
|
156
|
+
else # そうじゃなきゃ普通のエラー
|
157
|
+
raise(DangoFrameworkConnectionError, "too big... size=#{size}:size_str=#{size_str.inspect}")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
cs_logger.debug "size=#{size}:size_str=#{size_str.inspect}"
|
149
162
|
|
150
163
|
ret_data_orig = ""
|
151
164
|
|
@@ -166,7 +179,7 @@ module DangoFrameworkModule
|
|
166
179
|
# cs_logger.debug "size:#{size.inspect}"
|
167
180
|
end
|
168
181
|
|
169
|
-
|
182
|
+
cs_logger.debug "ret_data_orig:#{ret_data_orig.inspect}"
|
170
183
|
|
171
184
|
ret_data = cs_receive_decrypt(ret_data_orig[0..-2])
|
172
185
|
|
@@ -212,7 +225,8 @@ module DangoFrameworkModule
|
|
212
225
|
|
213
226
|
size = send_data.size
|
214
227
|
|
215
|
-
if size >= 4294967296
|
228
|
+
# if size >= 4294967296 # 本当はuint最大値なんだけれど、policyファイルの都合で変えてある
|
229
|
+
if size >= 1886350440
|
216
230
|
raise(DangoFrameworkError, "max size over. size:#{size} >= 4294967296")
|
217
231
|
end
|
218
232
|
|
@@ -6,6 +6,7 @@
|
|
6
6
|
|
7
7
|
require 'gserver'
|
8
8
|
require 'ipaddr'
|
9
|
+
require 'digest/md5'
|
9
10
|
|
10
11
|
require "dango/framework_base"
|
11
12
|
|
@@ -13,15 +14,9 @@ require "dango/framework_base"
|
|
13
14
|
class DangoServerFramework
|
14
15
|
include DangoFrameworkModule
|
15
16
|
|
16
|
-
SendReceiveSleepIntervalSec = 0.1
|
17
|
-
|
18
|
-
#
|
19
|
-
def send_receive_shared_init
|
20
|
-
@send_receive_shared = SharedMemoryStore.new
|
21
|
-
end
|
22
|
-
def send_receive_shared
|
23
|
-
@send_receive_shared
|
24
|
-
end
|
17
|
+
SendReceiveSleepIntervalSec = 0.1 # データ送信後の順の際のタイムアウトチェック間隔秒
|
18
|
+
SendReceiveTimeoutDefaultSec = 0.5 # データ送受信時のデフォルトタイムアウト秒数
|
19
|
+
# SendReceiveTimeoutDefaultSec = 3 # データ送受信時のデフォルトタイムアウト秒数
|
25
20
|
|
26
21
|
class DangoGServer < GServer
|
27
22
|
def initialize(parent, *args)
|
@@ -84,10 +79,12 @@ class DangoServerFramework
|
|
84
79
|
notice_shared_init() # 通知共有メモリを初期化
|
85
80
|
socket_list_init() # ソケット一覧を初期化
|
86
81
|
mutex_socket_list_init(cs_logger()) # ソケット毎用のmutexを初期化
|
87
|
-
send_receive_shared_init() # データ送受信用の共有メモリ初期化
|
88
82
|
@mutex_proc_thread = Mutex.new # スレッドが同時起動しないようにするためのMutex
|
89
83
|
cs_server_init() # 初期設定読み込み
|
90
84
|
|
85
|
+
@mutex_send_response = Mutex.new # 送信レスポンス用のMutex
|
86
|
+
@arr_send_response = [] # 送信レスポンス用のキャッシュ
|
87
|
+
|
91
88
|
@gserver = DangoGServer.new(self, @connection_server_port,
|
92
89
|
@connection_server_host,
|
93
90
|
@connection_server_max_connections)
|
@@ -98,82 +95,65 @@ class DangoServerFramework
|
|
98
95
|
# サーバーのループ時のクラス読み直し処理
|
99
96
|
def check_reload_class()
|
100
97
|
begin
|
101
|
-
|
102
|
-
|
98
|
+
if @server_reload
|
99
|
+
@server_reload = nil
|
103
100
|
|
104
|
-
|
105
|
-
# changed = false
|
106
|
-
# @config['load_files'].each do |f|
|
107
|
-
# this_mtime = File.mtime(f[:file])
|
108
|
-
# if this_mtime > f[:mtime]
|
109
|
-
# f[:mtime] = this_mtime
|
110
|
-
# changed = true
|
111
|
-
# end
|
112
|
-
# end
|
101
|
+
puts "-- stopping server"
|
113
102
|
|
114
|
-
#
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
# GCを行う
|
144
|
-
GC.start
|
145
|
-
|
146
|
-
# サーバーファイルを読み直し
|
147
|
-
puts "-- reload classes"
|
148
|
-
tmp_verbose = $VERBOSE
|
149
|
-
$VERBOSE = nil
|
103
|
+
# 強制的に接続しているsocketをクローズ
|
104
|
+
cs_logger.debug "socket_list.keys:#{socket_list.keys.inspect}"
|
105
|
+
socket_list.keys.each do |sk|
|
106
|
+
cs_logger.debug "sk:#{socket_list[sk].inspect}"
|
107
|
+
socket_list[sk].close if ! socket_list[sk].closed?
|
108
|
+
socket_list[sk]
|
109
|
+
end
|
110
|
+
|
111
|
+
# サーバーを停止
|
112
|
+
@gserver.shutdown
|
113
|
+
@gserver.stop
|
114
|
+
while(!@gserver.stopped?) do
|
115
|
+
sleep 1
|
116
|
+
puts "waiting... #{@gserver.stopped?}"
|
117
|
+
cs_logger.debug "waiting... #{@gserver.stopped?} #{@gserver.connections}"
|
118
|
+
end
|
119
|
+
|
120
|
+
@gserver = nil
|
121
|
+
|
122
|
+
puts "-- stopped server"
|
123
|
+
|
124
|
+
# GCを行う
|
125
|
+
GC.start
|
126
|
+
|
127
|
+
# サーバーファイルを読み直し
|
128
|
+
puts "-- reload classes"
|
129
|
+
tmp_verbose = $VERBOSE
|
130
|
+
$VERBOSE = nil
|
150
131
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
132
|
+
# serverファイル名一覧を取得
|
133
|
+
load_files = []
|
134
|
+
glob_str = 'dango/server/*.rb'
|
135
|
+
Dir.glob(glob_str) do |srv_file|
|
136
|
+
load_files.push({:file=>srv_file, :mtime=>File.mtime(srv_file)})
|
137
|
+
end
|
157
138
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
end
|
139
|
+
# ファイル名順にソート
|
140
|
+
load_files = load_files.sort_by{|f| f[:file] }
|
141
|
+
load_files.each do |f|
|
142
|
+
begin
|
143
|
+
load f[:file]
|
144
|
+
rescue Exception
|
145
|
+
p $!.class
|
146
|
+
p $!.message
|
147
|
+
p $!.backtrace
|
168
148
|
end
|
169
|
-
|
170
|
-
$VERBOSE = tmp_verbose
|
171
|
-
|
172
|
-
# サーバーを再度起動
|
173
|
-
puts "-- start server"
|
174
|
-
server_start() # サーバー開始
|
175
149
|
end
|
176
|
-
|
150
|
+
|
151
|
+
$VERBOSE = tmp_verbose
|
152
|
+
|
153
|
+
# サーバーを再度起動
|
154
|
+
puts "-- start server"
|
155
|
+
server_start() # サーバー開始
|
156
|
+
end
|
177
157
|
rescue Exception
|
178
158
|
cs_logger.error "#{$!.class}:#{$!.message}\n#{$!.backtrace.pretty_inspect}"
|
179
159
|
end
|
@@ -214,11 +194,19 @@ class DangoServerFramework
|
|
214
194
|
ret_obj = nil
|
215
195
|
begin
|
216
196
|
ret_obj = cs_receive_data(sock) # データ受信処理
|
217
|
-
|
218
|
-
|
197
|
+
is_flash_policy_file = false
|
198
|
+
rescue DangoFrameworkFlashPolicyError
|
199
|
+
is_flash_policy_file = true
|
219
200
|
end
|
220
201
|
|
221
|
-
if
|
202
|
+
if is_flash_policy_file && @policy_file_request # Flashのポリシーファイルが来たら
|
203
|
+
cs_logger.debug "is_flash_policy_file"
|
204
|
+
policy_data = '<cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>'
|
205
|
+
sock.send(policy_data, 0)
|
206
|
+
sock.flush
|
207
|
+
raise(DangoFrameworkError, "policy file sent. disconnectiong...")
|
208
|
+
|
209
|
+
elsif ret_obj != {} # 受信データがあれば
|
222
210
|
if !(ret_obj && ret_obj["action"]) # actionが無い場合はエラー
|
223
211
|
cs_logger.error "no action error:#{ret_obj.inspect}"
|
224
212
|
raise(DangoFrameworkError, "no action error")
|
@@ -230,7 +218,9 @@ class DangoServerFramework
|
|
230
218
|
|
231
219
|
@mutex_proc_thread.synchronize do
|
232
220
|
|
233
|
-
if action_name == '
|
221
|
+
if action_name == '_response' # 送信パケットの返事なら
|
222
|
+
action_name_is_response(ret_obj)
|
223
|
+
elsif action_name == 'monitor_all_info' # メンテナンスアクション名なら
|
234
224
|
cs_check_monitor_error(sock, "return_monitor_all_info")
|
235
225
|
cs_server_monitor_all_info()
|
236
226
|
elsif action_name == 'monitor_server_reload' # メンテナンスアクション名なら
|
@@ -276,6 +266,13 @@ class DangoServerFramework
|
|
276
266
|
end
|
277
267
|
end
|
278
268
|
|
269
|
+
# action_nameが送信パケットの返事なら
|
270
|
+
def action_name_is_response(ret_obj)
|
271
|
+
@mutex_send_response.synchronize do
|
272
|
+
@arr_send_response.push(ret_obj["_id"])
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
279
276
|
# 各種サーバー仕様の変数設定
|
280
277
|
def set_server_variables()
|
281
278
|
# debug
|
@@ -287,6 +284,7 @@ class DangoServerFramework
|
|
287
284
|
@connection_server_host = @config['server']['host'] || "localhost"
|
288
285
|
@connection_server_max_connections = @config['server']['max_connections'] || 10
|
289
286
|
@log_file = @config['server']['log_file'] || ""
|
287
|
+
@policy_file_request = @config['server']['policy_file_request'] || true
|
290
288
|
|
291
289
|
log_level_hash = {
|
292
290
|
"FATAL" => Logger::FATAL,
|
@@ -536,7 +534,7 @@ class DangoServerFramework
|
|
536
534
|
|
537
535
|
raise(DangoFrameworkError, "send_obj is not Hash.") if ! send_obj.is_a?(Hash)
|
538
536
|
|
539
|
-
timeout = options[:timeout] ||
|
537
|
+
timeout = options[:timeout] || SendReceiveTimeoutDefaultSec
|
540
538
|
dtype = options[:type] || 0
|
541
539
|
|
542
540
|
sock = socket_list[session_id]
|
@@ -546,6 +544,7 @@ class DangoServerFramework
|
|
546
544
|
# cs_logger.debug "cs_server_send_data:sending data notice_name=#{notice_name.inspect}"
|
547
545
|
send_obj_dup = send_obj.deep_dup
|
548
546
|
send_obj_dup["notice"] = notice_name.to_s
|
547
|
+
send_obj_dup["_id"] = Digest::MD5.hexdigest(session_id.to_s + Time.now.to_i.to_s)
|
549
548
|
|
550
549
|
# データ送信時にクライアントからのレスポンスを確認する(Flashのバグらしきもの対策)
|
551
550
|
# if notice_name.to_s =~ /^return_/
|
@@ -555,66 +554,46 @@ class DangoServerFramework
|
|
555
554
|
Thread.start do
|
556
555
|
begin
|
557
556
|
mutex_socket_list.synchronize(session_id) do
|
558
|
-
|
557
|
+
have_came_response = nil
|
559
558
|
|
560
559
|
receive_thread = nil
|
561
560
|
end_reserved_time = Time.now + timeout
|
562
561
|
|
563
|
-
# 戻ってきたデータのチェック
|
564
|
-
notice_name_sym = (notice_name.class == Symbol) ? (":"+notice_name.to_s) : ('"'+notice_name+'"')
|
565
|
-
instance_method_name = "cs_receive_response_#{notice_name}"
|
566
|
-
# cs_logger.debug "instance_eval notice_name_sym=" + notice_name_sym.inspect
|
567
|
-
expr = <<-EOF
|
568
|
-
def self.#{instance_method_name}(ret_obj)
|
569
|
-
begin
|
570
|
-
send_receive_shared[#{notice_name_sym}] = ret_obj
|
571
|
-
rescue Exception
|
572
|
-
cs_logger.debug "instance_eval Error=" + $!.class.to_s
|
573
|
-
cs_logger.debug "instance_eval Error=" + $!.message.to_s
|
574
|
-
cs_logger.debug "instance_eval Error=" + $!.backtrace.pretty_inspect
|
575
|
-
end
|
576
|
-
end
|
577
|
-
cs_logger.debug "defined:#{instance_method_name}"
|
578
|
-
EOF
|
579
|
-
# cs_logger.debug "expr:#{expr.inspect}"
|
580
|
-
# cs_logger.debug "send_receive_shared:#{self.send_receive_shared().inspect}"
|
581
|
-
instance_eval expr
|
582
|
-
|
583
562
|
# タイムアウトチェック
|
584
|
-
(
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
563
|
+
catch(:send_timeout) do
|
564
|
+
(timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
|
565
|
+
if Time.now > end_reserved_time
|
566
|
+
cs_logger.debug "timeout:#{notice_name}"
|
567
|
+
break
|
568
|
+
end
|
569
|
+
|
570
|
+
# 送信スレッドが開始していなければ開始
|
571
|
+
if !receive_thread
|
572
|
+
receive_thread = Thread.start do
|
573
|
+
begin
|
574
|
+
cs_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
|
575
|
+
# cs_logger.debug "cs_server_send_data:send data notice_name=#{notice_name.inspect} #{send_obj_dup['_id']}"
|
576
|
+
rescue DangoFrameworkError
|
577
|
+
cs_logger.debug "cs_server_send_data:DangoFrameworkError:notice_name=#{notice_name.inspect}\n"
|
578
|
+
end
|
599
579
|
end
|
600
580
|
end
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
581
|
+
|
582
|
+
@mutex_send_response.synchronize do
|
583
|
+
if @arr_send_response.delete(send_obj_dup["_id"])
|
584
|
+
have_came_response = true
|
585
|
+
# cs_logger.debug "response check ok:#{notice_name} #{send_obj_dup['_id'].inspect}"
|
586
|
+
throw(:send_timeout)
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
sleep SendReceiveSleepIntervalSec # スリープ
|
591
|
+
end # タイムアウト処理終わり
|
592
|
+
end # catch 終わり
|
611
593
|
|
612
|
-
if !
|
613
|
-
|
614
|
-
cs_logger.warn "!!! received data is none. #{notice_name} #{send_receive_shared[notice_name].inspect}"
|
594
|
+
if !have_came_response # 戻ってきたデータがあるかどうかチェック
|
595
|
+
cs_logger.warn "!!! received data is none. #{notice_name} #{send_obj_dup['_id']}"
|
615
596
|
end
|
616
|
-
|
617
|
-
remove_method(instance_method_name) # 定義したインスタンスメソッドを削除しておく
|
618
597
|
end
|
619
598
|
rescue
|
620
599
|
cs_logger.debug "send_response_thread error:#{error_message($!, 'u')}"
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dango
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-10-
|
6
|
+
version: 0.0.7
|
7
|
+
date: 2007-10-11 00:00:00 +09:00
|
8
8
|
summary: Ruby - Flash conneciton network flamework
|
9
9
|
require_paths:
|
10
10
|
- lib
|