spiderfw 0.6.23 → 0.6.24

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.
Files changed (74) hide show
  1. data/CHANGELOG +10 -1
  2. data/README.rdoc +1 -1
  3. data/VERSION +1 -1
  4. data/apps/config_editor/_init.rb +1 -2
  5. data/apps/config_editor/controllers/config_editor_controller.rb +1 -7
  6. data/apps/core/admin/controllers/admin_controller.rb +1 -1
  7. data/apps/core/admin/public/css/sass/admin.css +35 -31
  8. data/apps/core/admin/public/sass/admin.scss +6 -1
  9. data/apps/core/components/widgets/crud/crud.shtml +2 -2
  10. data/apps/core/components/widgets/table/table.rb +5 -5
  11. data/apps/core/forms/tags/element_row.erb +15 -10
  12. data/apps/core/forms/widgets/form/form.rb +35 -22
  13. data/apps/core/forms/widgets/inputs/checkbox/checkbox.shtml +2 -2
  14. data/apps/core/forms/widgets/inputs/date_time/date_time.shtml +2 -2
  15. data/apps/core/forms/widgets/inputs/file_input/file_input.shtml +2 -2
  16. data/apps/core/forms/widgets/inputs/html_area/html_area.shtml +2 -2
  17. data/apps/core/forms/widgets/inputs/input/input.shtml +2 -2
  18. data/apps/core/forms/widgets/inputs/password/password.shtml +2 -2
  19. data/apps/core/forms/widgets/inputs/search_select/search_select.shtml +1 -1
  20. data/apps/core/forms/widgets/inputs/select/select.shtml +2 -2
  21. data/apps/core/forms/widgets/inputs/text/text.shtml +2 -2
  22. data/apps/core/forms/widgets/inputs/text_area/text_area.shtml +2 -2
  23. data/apps/core/forms/widgets/inputs/time_span/time_span.shtml +1 -1
  24. data/blueprints/home/config.ru +8 -0
  25. data/lib/spiderfw/app.rb +416 -224
  26. data/lib/spiderfw/cmd/commands/app.rb +243 -239
  27. data/lib/spiderfw/cmd/commands/cert.rb +421 -417
  28. data/lib/spiderfw/cmd/commands/config.rb +85 -82
  29. data/lib/spiderfw/cmd/commands/console.rb +64 -40
  30. data/lib/spiderfw/cmd/commands/content.rb +29 -25
  31. data/lib/spiderfw/cmd/commands/create.rb +58 -54
  32. data/lib/spiderfw/cmd/commands/model.rb +118 -114
  33. data/lib/spiderfw/cmd/commands/setup.rb +55 -51
  34. data/lib/spiderfw/cmd/commands/test.rb +63 -59
  35. data/lib/spiderfw/cmd/commands/webserver.rb +56 -51
  36. data/lib/spiderfw/config/options/spider.rb +4 -3
  37. data/lib/spiderfw/controller/controller.rb +2 -0
  38. data/lib/spiderfw/controller/http_controller.rb +1 -2
  39. data/lib/spiderfw/controller/mixins/static_content.rb +3 -3
  40. data/lib/spiderfw/controller/mixins/visual.rb +30 -15
  41. data/lib/spiderfw/controller/response.rb +84 -0
  42. data/lib/spiderfw/controller/session/file_session.rb +2 -2
  43. data/lib/spiderfw/http/adapters/rack.rb +12 -13
  44. data/lib/spiderfw/http/server.rb +80 -46
  45. data/lib/spiderfw/i18n/cldr.rb +6 -9
  46. data/lib/spiderfw/model/base_model.rb +103 -23
  47. data/lib/spiderfw/model/condition.rb +110 -25
  48. data/lib/spiderfw/model/mappers/db_mapper.rb +14 -6
  49. data/lib/spiderfw/model/mappers/mapper.rb +440 -197
  50. data/lib/spiderfw/model/model.rb +105 -21
  51. data/lib/spiderfw/model/model_hash.rb +9 -1
  52. data/lib/spiderfw/model/query.rb +50 -9
  53. data/lib/spiderfw/model/query_set.rb +211 -44
  54. data/lib/spiderfw/model/request.rb +28 -21
  55. data/lib/spiderfw/model/storage/base_storage.rb +125 -10
  56. data/lib/spiderfw/model/storage/db/db_storage.rb +7 -4
  57. data/lib/spiderfw/model/storage.rb +8 -1
  58. data/lib/spiderfw/setup/spider_setup_wizard.rb +9 -7
  59. data/lib/spiderfw/spider.rb +270 -43
  60. data/lib/spiderfw/templates/layout.rb +9 -4
  61. data/lib/spiderfw/templates/resources/sass.rb +3 -2
  62. data/lib/spiderfw/templates/template.rb +1 -0
  63. data/lib/spiderfw/utils/annotations.rb +3 -1
  64. data/lib/spiderfw/utils/logger.rb +1 -1
  65. data/lib/spiderfw/utils/monkey/symbol.rb +4 -2
  66. data/lib/spiderfw/utils/shared_store/file_shared_store.rb +2 -2
  67. data/lib/spiderfw/utils/thread_out.rb +3 -1
  68. data/public/css/error_page.css +83 -0
  69. data/public/js/error_page.js +5 -0
  70. data/spider.gemspec +4 -1
  71. data/templates/email/error.erb +9 -0
  72. metadata +28 -12
  73. data/apps/config_editor/widgets/edit_bool/edit_bool.rb +0 -8
  74. data/apps/config_editor/widgets/edit_bool/edit_bool.shtml +0 -5
@@ -1,7 +1,7 @@
1
1
  module Spider
2
2
 
3
3
  config_option('runmode', "production, test, devel", :default => 'devel', :choices => ['production', 'test', 'devel'],
4
- :action => Proc.new{ |option| Spider.runmode = option unless Spider.runmode || $SPIDER_RUNMODE}
4
+ :action => Proc.new{ |option| $SPIDER_RUNMODE = option }
5
5
  )
6
6
 
7
7
  config_option('apps', _('Apps to load'), :type => Array, :yaml_style => :inline)
@@ -34,8 +34,6 @@ module Spider
34
34
  config_option 'webserver.timeout', _("Time allowed for each request (in seconds)"), :type=> Fixnum, :default => nil
35
35
  config_option 'webserver.respawn_on_change', _("Restart the webserver when application code changes"), :type => Spider::Bool,
36
36
  :default => Proc.new{ RUBY_PLATFORM !~ /win32|mingw32/ && Spider.config.get('runmode') == 'devel' ? true : false }
37
- config_option 'webserver.respawn.core_devel', _('Respawn on changes to the framework'),
38
- :type => Spider::Bool, :default => false
39
37
  config_option 'process.shutdown_timeout', _("Number of seconds a process is given to end"), :type => Fixnum, :default => 60
40
38
  config_option 'static_content.mode', _("Mode to use for serving static files"), :type => String,
41
39
  :choices => [nil, 'x-sendfile', 'x-accel-redirect', 'published'], :default => nil
@@ -81,6 +79,9 @@ module Spider
81
79
 
82
80
  config_option 'debugger.start', _("Start the debugger"), :type => Spider::DataTypes::Bool,
83
81
  :default => lambda{ ['test', 'devel'].include?(Spider.runmode) ? true : false }
82
+ config_option 'debugger.pry', _("User Pry for debugging"), :type => Spider::Bool, :default => lambda{
83
+ RUBY_VERSION_PARTS[1] == '9'
84
+ }
84
85
  config_option 'profiling.enable', _("Enable on-request profiling"), :type => Spider::DataTypes::Bool
85
86
  config_option 'request.mutex', _("Respond to requests sequentially"), :default => false
86
87
 
@@ -235,6 +235,7 @@ module Spider
235
235
  end
236
236
 
237
237
  def call_before(action='', *arguments)
238
+ return if respond_to?(:serving_static?) && self.serving_static?
238
239
  @call_path = action
239
240
  before(action, *arguments)
240
241
  catch(:done) do
@@ -251,6 +252,7 @@ module Spider
251
252
 
252
253
 
253
254
  def call_after(action='', *arguments)
255
+ return if respond_to?(:serving_static?) && self.serving_static?
254
256
  after(action, *arguments)
255
257
  catch(:done) do
256
258
  d_next = dispatch_next(action)
@@ -11,8 +11,7 @@ module Spider
11
11
  def initialize(request, response, scene=nil)
12
12
  response.status = Spider::HTTP::OK
13
13
  response.headers = {
14
- 'Content-Type' => 'text/plain',
15
- 'Connection' => 'close'
14
+ 'Content-Type' => 'text/plain'
16
15
  }
17
16
  @previous_stdout = $stdout
18
17
  Thread.current[:stdout] = response.server_output
@@ -103,8 +103,8 @@ module Spider; module ControllerMixins
103
103
  ct = ct.to_s if ct
104
104
  ct ||= "application/octet-stream"
105
105
  end
106
- @response.headers['Content-Type'] = ct
107
- @response.headers['Content-Length'] = stat.size
106
+ @response.content_type = ct
107
+ @response.content_length = stat.size
108
108
  @response.headers['Last-Modified'] = mtime.httpdate
109
109
 
110
110
  if mode == 'x-sendfile'
@@ -112,7 +112,7 @@ module Spider; module ControllerMixins
112
112
  elsif mode == 'x-accel-redirect'
113
113
  @response.headers['X-Accel-Redirect'] = full_path
114
114
  else
115
- f = File.open(full_path, 'r')
115
+ f = File.open(full_path, 'rb')
116
116
  while (block = f.read(1024)) do
117
117
  $out << block
118
118
  end
@@ -22,8 +22,20 @@ module Spider; module ControllerMixins
22
22
  end
23
23
 
24
24
  def before(action='', *params)
25
- @layout ||= self.class.get_layout(action)
26
- @layout ||= @dispatcher_layout
25
+ unless self.respond_to?(:serving_static?) && self.serving_static?
26
+ @layout ||= self.class.get_layout(action)
27
+ @layout ||= @dispatcher_layout
28
+ n_route = dispatch_next(action)
29
+ obj = n_route.obj if n_route
30
+ if obj.is_a?(Visual) && !(obj.respond_to?(:serving_static?) && obj.serving_static?)
31
+ set_layout = @layout
32
+ if set_layout
33
+ set_layout = [set_layout] unless set_layout.is_a?(Array)
34
+ set_layout.map{ |l| self.class.load_layout(l) }
35
+ obj.dispatcher_layout = set_layout
36
+ end
37
+ end
38
+ end
27
39
  return super unless action_target?
28
40
  format = nil
29
41
  req_format = self.is_a?(Widget) && @is_target && @request.params['_wf'] ? @request.params['_wf'].to_sym : @request.format
@@ -44,16 +56,7 @@ module Spider; module ControllerMixins
44
56
  if Spider.runmode != 'devel' && File.exists?(File.join(Spider.paths[:tmp], 'maintenance.txt'))
45
57
  raise Spider::Controller::Maintenance
46
58
  end
47
- n_route = dispatch_next(action)
48
- obj = n_route.obj if n_route
49
- if obj.is_a?(Visual) && !(obj.respond_to?(:serving_static?) && obj.serving_static?)
50
- set_layout = @layout || @dispatcher_layout
51
- if set_layout
52
- set_layout = [set_layout] unless set_layout.is_a?(Array)
53
- set_layout.map{ |l| self.class.load_layout(l) }
54
- obj.dispatcher_layout = set_layout
55
- end
56
- end
59
+
57
60
  super
58
61
  end
59
62
 
@@ -144,6 +147,13 @@ module Spider; module ControllerMixins
144
147
  @template = template
145
148
  return template
146
149
  end
150
+
151
+ def load_template_from_path(path, definer)
152
+ t = Spider::Template.new(path)
153
+ t.owner_class = self.class
154
+ t.definer_class = definer
155
+ t
156
+ end
147
157
 
148
158
  def prepare_template(template)
149
159
  template.owner = self
@@ -543,12 +553,17 @@ module Spider; module ControllerMixins
543
553
  search_paths ||= template_paths
544
554
  resource = Spider::Template.find_resource(name, cur_path, owner, search_paths)
545
555
  raise "Template #{name} not found" unless resource && resource.path
546
- t = Spider::Template.new(resource.path)
547
- t.owner_class = self
548
- t.definer_class = resource.definer
556
+ t = load_template_from_path(resource.path, resource.definer)
549
557
  return t
558
+ end
550
559
 
560
+ def load_template_from_path(path, definer)
561
+ t = Spider::Template.new(path)
562
+ t.owner_class = self
563
+ t.definer_class = definer
564
+ t
551
565
  end
566
+
552
567
 
553
568
  def template_exists?(name, paths=nil)
554
569
  if (name[0..5] == 'SPIDER' || name[0..3] == 'ROOT')
@@ -49,6 +49,90 @@ module Spider
49
49
  # end
50
50
  end
51
51
 
52
+ def buffering?
53
+ @prev_io != nil
54
+ end
55
+
56
+ def start_buffering
57
+ @buffer = StringIO.new
58
+ @prev_io = ThreadOut.output_to(@buffer)
59
+ end
60
+
61
+ def stop_buffering
62
+ ThreadOut.output_to(@prev_io)
63
+ @prev_io = nil
64
+ @buffer.rewind
65
+ end
66
+
67
+ def output_buffer
68
+ stop_buffering if buffering?
69
+ return unless @buffer
70
+ while d = @buffer.read(1024)
71
+ $out << d
72
+ end
73
+ buffer = @buffer
74
+ @buffer = nil
75
+ buffer
76
+ end
77
+
78
+ def buffer
79
+ @buffer
80
+ end
81
+
82
+ def clear_buffer
83
+ @buffer = nil
84
+ end
85
+
86
+ def content_type=(val)
87
+ @headers['Content-Type'] = val
88
+ end
89
+
90
+ def content_type
91
+ @headers['Content-Type']
92
+ end
93
+
94
+ def content_length=(val)
95
+ @headers['Content-Length'] = val
96
+ if @buffer_until_length && val
97
+ output_buffer
98
+ @buffer_until_length = false
99
+ end
100
+ end
101
+
102
+ def content_length
103
+ @headers['Content-Length']
104
+ end
105
+
106
+ def buffer_until_length
107
+ unless content_length
108
+ start_buffering
109
+ @buffer_until_length = true
110
+ end
111
+ end
112
+
113
+ def finish!
114
+ if buffering?
115
+ stop_buffering
116
+ needs_length = @needs_length
117
+ self.content_length = @buffer.length
118
+ output_buffer unless needs_length
119
+ end
120
+ end
121
+
122
+ def connection_keep_alive
123
+ @headers['Connection'] = 'Keep-Alive'
124
+ buffer_until_length unless Spider.conf.get('webserver.has_buffering_proxy')
125
+ end
126
+
127
+ def do_not_buffer!
128
+ unless Spider.conf.get('webserver.has_buffering_proxy')
129
+ @headers['Connection'] = 'Close'
130
+ end
131
+ output_buffer
132
+ @buffer_until_length = false
133
+ end
134
+
135
+
52
136
 
53
137
  end
54
138
 
@@ -17,7 +17,7 @@ module Spider
17
17
  path = "#{dir}/#{sid}"
18
18
 
19
19
  @sync.lock(Sync::EX)
20
- f = File.new(path, 'w+')
20
+ f = File.new(path, 'wb+')
21
21
  f.flock(File::LOCK_EX)
22
22
  f.puts(Marshal.dump(data))
23
23
  f.flush
@@ -33,7 +33,7 @@ module Spider
33
33
  data = nil
34
34
  if (File.exist?(path))
35
35
  @sync.lock(Sync::SH)
36
- f = File.new(path, 'r+')
36
+ f = File.new(path, 'rb+')
37
37
  f.flock(File::LOCK_SH)
38
38
  begin
39
39
  data = Marshal.restore(f.read)
@@ -20,12 +20,13 @@ module Spider; module HTTP
20
20
 
21
21
  class RackIO < ControllerIO
22
22
 
23
- def initialize(response, controller_response, w)
23
+ def initialize(response, controller_response, w, options={})
24
24
  @response = response
25
25
  @controller_response = controller_response
26
26
  @w = w
27
27
  @headers_sent = false
28
28
  @rack_thread = Thread.current
29
+ @options = options
29
30
  end
30
31
 
31
32
  def write(msg)
@@ -46,7 +47,7 @@ module Spider; module HTTP
46
47
  end
47
48
  end
48
49
  @headers_sent = true
49
- @rack_thread.run if Spider.conf.get('webserver.force_threads')
50
+ @rack_thread.run if @options[:multithread]
50
51
  end
51
52
 
52
53
  def headers_sent?
@@ -83,10 +84,11 @@ module Spider; module HTTP
83
84
 
84
85
  w = nil
85
86
  controller_response = Spider::Response.new
86
- if Spider.conf.get('webserver.force_threads')
87
+ multithread = env['rack.multithread'] || Spider.conf.get('webserver.force_threads')
88
+ if multithread
87
89
  r, w = IO.pipe
88
90
  rack_response_hash = {:body => r}
89
- controller_response.server_output = RackIO.new(rack_response_hash, controller_response, w)
91
+ controller_response.server_output = RackIO.new(rack_response_hash, controller_response, w, :multithread => true)
90
92
  else
91
93
  w = StringIO.new
92
94
  rack_response_hash = {:body => w}
@@ -103,21 +105,19 @@ module Spider; module HTTP
103
105
  controller.extend(Spider::FirstResponder)
104
106
  controller.call_before(path)
105
107
  controller.execute(path)
106
- if Spider.conf.get('webserver.force_threads')
108
+ if multithread
107
109
  w.close
108
110
  controller_response.server_output.send_headers unless controller_response.server_output.headers_sent?
109
111
  end
110
112
  controller.call_after(path)
111
113
  controller_done = true
112
- Spider::Logger.debug("Controller done")
113
114
  rescue => exc
114
- Spider.logger.debug("Error:")
115
- Spider.logger.debug(exc)
115
+ Spider.logger.error(exc)
116
116
  controller.ensure if controller
117
117
  controller = nil
118
118
  ensure
119
119
  begin
120
- if Spider.conf.get('webserver.force_threads')
120
+ if multithread
121
121
  controller_response.server_output.send_headers unless controller_response.server_output.headers_sent?
122
122
  else
123
123
  controller_response.prepare_headers
@@ -134,7 +134,7 @@ module Spider; module HTTP
134
134
  end
135
135
  Spider.request_finished
136
136
  ensure
137
- if Spider.conf.get('webserver.force_threads')
137
+ if multithread
138
138
  begin
139
139
  w.close
140
140
  rescue
@@ -146,8 +146,8 @@ module Spider; module HTTP
146
146
  end
147
147
  end
148
148
 
149
- if Spider.conf.get('webserver.force_threads')
150
- controllerThread = Thread.start &run_block
149
+ if multithread
150
+ controllerThread = Thread.start(&run_block)
151
151
  t = Time.now
152
152
  while !controller_done && !controller_response.server_output.headers_sent? && (Time.now - t) < 60
153
153
  Thread.stop
@@ -160,7 +160,6 @@ module Spider; module HTTP
160
160
  run_block.call
161
161
  end
162
162
 
163
- Spider.logger.debug("Rack responding")
164
163
  return [rack_response_hash[:status], rack_response_hash[:headers], rack_response_hash[:body]]
165
164
  end
166
165
 
@@ -1,3 +1,6 @@
1
+ require 'rack'
2
+ require 'spiderfw/http/adapters/rack'
3
+
1
4
  module Spider; module HTTP
2
5
 
3
6
  class Server
@@ -33,64 +36,87 @@ module Spider; module HTTP
33
36
 
34
37
  def request_received
35
38
  end
36
-
37
- def self.start(server_name, port, options={})
38
- servers = {
39
- 'webrick' => :WEBrick,
40
- 'mongrel' => :Mongrel,
41
- 'thin' => :Thin
39
+
40
+ def self.get_opts(server_name, options)
41
+ server_name ||= Spider.conf.get('http.server')
42
+ options[:port] ||= Spider.conf.get('webserver.port')
43
+ opts = {
44
+ :server => server_name,
45
+ :Port => options[:port],
46
+ :config => File.join(Spider.paths[:root], 'config.ru')
42
47
  }
43
-
44
- start = lambda{
45
- $SPIDER_WEB_SERVER = true
46
- begin
47
- require 'spiderfw/init'
48
- rescue Exception => exc
49
- Spider.logger.error(exc)
50
- return
48
+ case server_name
49
+ when 'thin'
50
+ opts[:threaded] = true unless options[:no_threads]
51
+ options[:daemonize] = true
52
+ end
53
+ opts[:app] = Spider::HTTP::RackApplication.new unless File.file?(opts[:config])
54
+ ssl_opts = nil
55
+ if options[:ssl]
56
+ require 'openssl'
57
+ options[:ssl_cert] ||= Spider.conf.get('orgs.default.cert')
58
+ options[:ssl_key] ||= Spider.conf.get('orgs.default.private_key')
59
+ raise "SSL Certificate not set" unless options[:ssl_cert]
60
+ raise "SSL Key not set" unless options[:ssl_key]
61
+ raise "SSL Certificate (#{options[:ssl_cert]}) not found" unless File.file?(options[:ssl_cert])
62
+ raise "SSL Key (#{options[:ssl_key]}) not found" unless File.file?(options[:ssl_key])
63
+ ssl_opts = opts.clone
64
+ ssl_opts[:Port] = options[:ssl]
65
+ private_key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]).read)
66
+ certificate = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]).read)
67
+ case server_name
68
+ when 'webrick'
69
+ require 'webrick/https'
70
+ ssl_opts[:SSLEnable] = true
71
+ ssl_opts[:SSLVerifyClient] = ::OpenSSL::SSL::VERIFY_NONE
72
+ ssl_opts[:SSLCertificate] = certificate
73
+ ssl_opts[:SSLPrivateKey] = private_key
74
+ # when 'thin'
75
+ # ssl_opts[:ssl] = true
76
+ # ssl_opts[:verify_peer] = ::OpenSSL::SSL::VERIFY_NONE
77
+ # ssl_opts[:ssl_key_file] = private_key
78
+ # ssl_opts[:ssl_cert_file] = certificate
79
+ else
80
+ raise "SSL not supported with #{server_name} server"
51
81
  end
52
- require 'spiderfw/controller/http_controller'
82
+ end
83
+ return [opts, ssl_opts]
84
+ end
85
+
86
+ def self.start(server_name, options={})
87
+ start = lambda{
88
+
53
89
 
54
- port ||= Spider.conf.get('webserver.port')
55
- server_name ||= Spider.conf.get('http.server')
56
90
  pid_file = File.join(Spider.paths[:var], 'run/server.pid')
57
91
  puts _("Using webserver %s") % server_name if options[:verbose]
58
- puts _("Listening on port %s") % port if options[:verbose]
59
- server = Spider::HTTP.const_get(servers[server_name]).new
92
+ puts _("Listening on port %s") % opts[:port] if options[:verbose]
93
+ rack = nil
94
+ ssl_rack = nil
95
+ server = nil
60
96
  ssl_server = nil
97
+
98
+ require 'spiderfw/init'
99
+ Spider.logger.info{ "Routes: \n"+Spider::HomeController.print_app_routes }
61
100
  Spider.startup
62
- begin
63
- if Spider.conf.get('devel.trace.extended')
64
- require 'ruby-debug'
65
- require 'spiderfw/utils/monkey/debugger'
66
- Debugger.start
67
- Debugger.post_mortem
101
+ opts, ssl_opts = self.get_opts(server_name, options)
102
+
103
+ if opts
104
+ thread = Thread.new do
105
+ rack = Rack::Server.start(opts)
106
+ server = rack.server if rack
68
107
  end
69
- rescue Exception => exc
70
- Spider.logger.warn "Unable to start debugger"
108
+ $stdout << "Spider server running on port #{opts[:Port]}\n"
71
109
  end
72
110
 
73
- thread = Thread.new do
74
- server.start(:port => port, :cgi => options[:cgi])
75
- end
76
- $stdout << "Spider server running on port #{port}\n"
77
- if options[:ssl]
78
- options[:ssl_cert] ||= Spider.conf.get('orgs.default.cert')
79
- options[:ssl_key] ||= Spider.conf.get('orgs.default.private_key')
80
- raise "SSL Certificate not set" unless options[:ssl_cert]
81
- raise "SSL Key not set" unless options[:ssl_key]
82
- raise "SSL Certificate (#{options[:ssl_cert]}) not found" unless File.file?(options[:ssl_cert])
83
- raise "SSL Key (#{options[:ssl_key]}) not found" unless File.file?(options[:ssl_key])
111
+ if ssl_opts
84
112
  ssl_thread = Thread.new do
85
- ssl_server = Spider::HTTP.const_get(servers[server_name]).new
86
- ssl_server.start(:port => options[:ssl], :ssl => true,
87
- :ssl_cert => options[:ssl_cert], :ssl_private_key => options[:ssl_key])
113
+ ssl_rack = Rack::Server.start(ssl_opts)
114
+ ssl_server = ssl_rack.server if ssl_rack
88
115
  end
89
116
  end
90
117
  do_shutdown = lambda{
91
118
  Debugger.post_mortem = false if defined?(Debugger)
92
- # debugger
93
- server.shutdown
119
+ server.shutdown if server
94
120
  ssl_server.shutdown if ssl_server
95
121
  pid_file = File.join(Spider.paths[:var], 'run/server.pid')
96
122
  begin
@@ -100,8 +126,11 @@ module Spider; module HTTP
100
126
  }
101
127
  Spider.on_shutdown(&do_shutdown)
102
128
 
103
- thread.join
104
- ssl_thread.join if ssl_thread
129
+ begin
130
+ thread.join if thread
131
+ ssl_thread.join if ssl_thread
132
+ rescue SystemExit
133
+ end
105
134
  }
106
135
  if options[:daemonize]
107
136
  require 'spiderfw/init'
@@ -201,7 +230,12 @@ module Spider; module HTTP
201
230
  rd.close
202
231
  Spider.spawner = wr
203
232
  return unless @actions[action]
204
- @actions[action].call
233
+ begin
234
+ @actions[action].call
235
+ rescue Exception => exc
236
+ Spider.logger.debug(exc)
237
+ Process.kill 'KILL', Process.pid
238
+ end
205
239
  end
206
240
  end
207
241
 
@@ -14,7 +14,6 @@ module Spider; module I18n
14
14
  end
15
15
 
16
16
  def localize_date_time(object, format = 'medium', options={})
17
- raise "Localize format is nil" unless format
18
17
  options[:calendar] ||= 'gregorian'
19
18
  format = 'medium' if format == :default
20
19
 
@@ -41,8 +40,8 @@ module Spider; module I18n
41
40
  # FIXME: handle more efficiently
42
41
  d = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
43
42
  obj_d = d[object.wday]
44
- days = @cldr.calendar.days[options[:calendar].to_sym][:format] || @cldr.calendar.days[options[:calendar].to_sym]
45
- months = @cldr.calendar.months[options[:calendar].to_sym][:format] || @cldr.calendar.months[options[:calendar].to_sym]
43
+ days = @cldr.calendar.days[options[:calendar].to_sym]
44
+ months = @cldr.calendar.months[options[:calendar].to_sym]
46
45
  replacements = [
47
46
  [/y{1,4}/, '%Y'], # year don't use two digits year, they cause confusion [/y{1,2}/, '%y']
48
47
  [/M{5}/, months[:narrow][object.month.to_s]], [/M{4}/, months[:wide][object.month.to_s]], #month
@@ -116,9 +115,9 @@ module Spider; module I18n
116
115
  end
117
116
  end
118
117
 
119
- def day_names(format = :wide, context = :stand_alone, calendar = self.default_calendar)
118
+ def day_names(format = :wide, calendar = self.default_calendar)
120
119
  begin
121
- days = @cldr.calendar.days[calendar][format] || @cldr.calendar.days[calendar][context][format]
120
+ days = @cldr.calendar.days[calendar][format]
122
121
  return [days['sun'], days['mon'], days['tue'], days['wed'], days['thu'], days['fri'], days['sat']]
123
122
  rescue NoMethodError
124
123
  raise ArgumentError, "Calendar #{calendar} not found" unless @cldr.days[calendar]
@@ -127,12 +126,10 @@ module Spider; module I18n
127
126
 
128
127
  end
129
128
 
130
- def month_names(format = :wide, context = :stand_alone, calendar = self.default_calendar)
129
+ def month_names(format = :wide, calendar = self.default_calendar)
131
130
  months = []
132
131
  begin
133
- # CLDR 1 doesn't have context, CLDR 2 does
134
- months = @cldr.calendar.months[calendar][format] || @cldr.calendar.months[calendar][context][format]
135
- months.each do |k, v|
132
+ @cldr.calendar.months[calendar][format].each do |k, v|
136
133
  months[k.to_i] = v
137
134
  end
138
135
  rescue NoMethodError