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.
@@ -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
- # cs_logger.debug "size=#{size}:size_str=#{size_str.inspect}"
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
- # cs_logger.debug "ret_data_orig:#{ret_data_orig.inspect}"
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
- # cs_client_send_receive_data用の共有メモリ
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
- # @config:cache_classesによる処理分け
102
- # if @config['server']['cache_classes'] != true
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
- # changed = nil
116
- # if changed
117
- if @server_reload
118
- @server_reload = nil
119
-
120
- puts "-- stopping server"
121
-
122
- # 強制的に接続しているsocketをクローズ
123
- cs_logger.debug "socket_list.keys:#{socket_list.keys.inspect}"
124
- socket_list.keys.each do |sk|
125
- cs_logger.debug "sk:#{socket_list[sk].inspect}"
126
- socket_list[sk].close if ! socket_list[sk].closed?
127
- socket_list[sk]
128
- end
129
-
130
- # サーバーを停止
131
- @gserver.shutdown
132
- @gserver.stop
133
- while(!@gserver.stopped?) do
134
- sleep 1
135
- puts "waiting... #{@gserver.stopped?}"
136
- cs_logger.debug "waiting... #{@gserver.stopped?} #{@gserver.connections}"
137
- end
138
-
139
- @gserver = nil
140
-
141
- puts "-- stopped server"
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
- # serverファイル名一覧を取得
152
- load_files = []
153
- glob_str = 'dango/server/*.rb'
154
- Dir.glob(glob_str) do |srv_file|
155
- load_files.push({:file=>srv_file, :mtime=>File.mtime(srv_file)})
156
- end
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
- load_files = load_files.sort_by{|f| f[:file] }
160
- load_files.each do |f|
161
- begin
162
- load f[:file]
163
- rescue Exception
164
- p $!.class
165
- p $!.message
166
- p $!.backtrace
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
- # end
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
- rescue
218
-
197
+ is_flash_policy_file = false
198
+ rescue DangoFrameworkFlashPolicyError
199
+ is_flash_policy_file = true
219
200
  end
220
201
 
221
- if ret_obj != {} # 受信データがあれば
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 == 'monitor_all_info' # メンテナンスアクション名なら
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] || 6
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
- send_receive_shared[notice_name] = nil
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
- (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
585
- if Time.now > end_reserved_time
586
- cs_logger.debug "timeout:#{notice_name}"
587
- break
588
- # raise(DangoFrameworkTimeoutError, "timeout:#{notice_name}")
589
- end
590
-
591
- # 送信スレッドが開始していなければ開始
592
- if !receive_thread
593
- receive_thread = Thread.start do
594
- begin
595
- cs_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
596
- # cs_logger.debug "cs_server_send_data:send data notice_name=#{notice_name.inspect}\n"
597
- rescue DangoFrameworkError
598
- cs_logger.debug "cs_server_send_data:notice_name=#{notice_name.inspect}\n"
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
- end
602
-
603
- # 戻ってきたデータがあれば
604
- if send_receive_shared[notice_name]
605
- cs_logger.debug "notice_name:#{send_receive_shared[notice_name].inspect}"
606
- break
607
- end
608
-
609
- sleep SendReceiveSleepIntervalSec # スリープ
610
- end # タイムアウト処理終わり
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 !send_receive_shared[notice_name] # 戻ってきたデータがあるかどうかチェック
613
- # raise(DangoFrameworkError, "received data is none")
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
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 5
5
+ TINY = 7
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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.5
7
- date: 2007-10-09 00:00:00 +09:00
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