dango 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|