dango 0.0.5 → 0.0.7

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