passenger 6.0.22 → 6.0.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +34 -1
  3. data/Rakefile +9 -2
  4. data/bin/passenger-install-nginx-module +1 -0
  5. data/build/test_basics.rb +30 -11
  6. data/passenger.gemspec +4 -2
  7. data/resources/templates/standalone/server.erb +1 -0
  8. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -1
  9. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +0 -3
  10. data/src/agent/Core/Config.h +2 -1
  11. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -1
  12. data/src/agent/Core/Controller/Config.h +5 -1
  13. data/src/agent/Core/Controller.h +1 -0
  14. data/src/agent/Core/OptionParser.h +3 -0
  15. data/src/agent/Core/SpawningKit/ErrorRenderer.h +5 -0
  16. data/src/agent/Watchdog/Config.h +2 -1
  17. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  18. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +15 -0
  19. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +5 -0
  20. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  21. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +13 -0
  22. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  23. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +13 -0
  24. data/src/cxx_supportlib/Constants.h +1 -1
  25. data/src/cxx_supportlib/DataStructures/LString.h +4 -0
  26. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  27. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  28. data/src/nginx_module/Configuration.c +7 -2
  29. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +6 -0
  30. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  31. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +14 -0
  32. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  33. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  34. data/src/ruby_native_extension/passenger_native_support.c +1 -0
  35. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +5 -0
  36. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +5 -0
  37. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -0
  38. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +73 -0
  39. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +30 -56
  40. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +5 -0
  41. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  42. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +2 -197
  43. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +67 -0
  44. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  45. metadata +20 -4
@@ -86,6 +86,12 @@ passenger_serialize_autogenerated_loc_conf_to_headers(ngx_conf_t *cf, passenger_
86
86
  : sizeof("f\r\n") - 1;
87
87
  }
88
88
 
89
+ if (conf->autogenerated.custom_error_page.data != NULL) {
90
+ len += sizeof("!~PASSENGER_CUSTOM_ERROR_PAGE: ") - 1;
91
+ len += conf->autogenerated.custom_error_page.len;
92
+ len += sizeof("\r\n") - 1;
93
+ }
94
+
89
95
  if (conf->autogenerated.min_instances != NGX_CONF_UNSET_UINT) {
90
96
  end = ngx_snprintf(int_buf,
91
97
  sizeof(int_buf) - 1,
@@ -342,6 +348,15 @@ passenger_serialize_autogenerated_loc_conf_to_headers(ngx_conf_t *cf, passenger_
342
348
  }
343
349
  }
344
350
 
351
+ if (conf->autogenerated.custom_error_page.data != NULL) {
352
+ pos = ngx_copy(pos,
353
+ "!~PASSENGER_CUSTOM_ERROR_PAGE: ",
354
+ sizeof("!~PASSENGER_CUSTOM_ERROR_PAGE: ") - 1);
355
+ pos = ngx_copy(pos,
356
+ conf->autogenerated.custom_error_page.data,
357
+ conf->autogenerated.custom_error_page.len);
358
+ pos = ngx_copy(pos, (const u_char *) "\r\n", sizeof("\r\n") - 1);
359
+ }
345
360
  if (conf->autogenerated.min_instances != NGX_CONF_UNSET_UINT) {
346
361
  pos = ngx_copy(pos,
347
362
  "!~PASSENGER_MIN_PROCESSES: ",
@@ -129,6 +129,20 @@ generate_config_manifest_for_autogenerated_loc_conf(manifest_gen_ctx_t *ctx, pas
129
129
  psg_json_value_set_bool(hierarchy_member, "value",
130
130
  plcf->autogenerated.friendly_error_pages);
131
131
  }
132
+ if (plcf->autogenerated.custom_error_page_explicitly_set) {
133
+ find_or_create_manifest_app_and_loc_options_containers(ctx,
134
+ plcf, cscf, clcf, &app_options_container, &loc_options_container);
135
+ option_container = find_or_create_manifest_option_container(ctx,
136
+ app_options_container,
137
+ "passenger_custom_error_page",
138
+ sizeof("passenger_custom_error_page") - 1);
139
+ hierarchy_member = add_manifest_option_container_hierarchy_member(option_container,
140
+ &plcf->autogenerated.custom_error_page_source_file,
141
+ plcf->autogenerated.custom_error_page_source_line);
142
+ psg_json_value_set_str(hierarchy_member, "value",
143
+ (const char *) plcf->autogenerated.custom_error_page.data,
144
+ plcf->autogenerated.custom_error_page.len);
145
+ }
132
146
  if (plcf->autogenerated.min_instances_explicitly_set) {
133
147
  find_or_create_manifest_app_and_loc_options_containers(ctx,
134
148
  plcf, cscf, clcf, &app_options_container, &loc_options_container);
@@ -61,6 +61,9 @@ passenger_merge_autogenerated_loc_conf(passenger_autogenerated_loc_conf_t *conf,
61
61
  ngx_conf_merge_value(conf->friendly_error_pages,
62
62
  prev->friendly_error_pages,
63
63
  NGX_CONF_UNSET);
64
+ ngx_conf_merge_str_value(conf->custom_error_page,
65
+ prev->custom_error_page,
66
+ NULL);
64
67
  ngx_conf_merge_uint_value(conf->min_instances,
65
68
  prev->min_instances,
66
69
  1);
@@ -67,6 +67,7 @@ typedef struct {
67
67
  ngx_str_t app_root;
68
68
  ngx_str_t app_start_command;
69
69
  ngx_str_t app_type;
70
+ ngx_str_t custom_error_page;
70
71
  ngx_str_t direct_instance_request_address;
71
72
  ngx_str_t document_root;
72
73
  ngx_str_t environment;
@@ -92,6 +93,7 @@ typedef struct {
92
93
  ngx_str_t app_type_source_file;
93
94
  ngx_str_t base_uris_source_file;
94
95
  ngx_str_t buffer_upload_source_file;
96
+ ngx_str_t custom_error_page_source_file;
95
97
  ngx_str_t debugger_source_file;
96
98
  ngx_str_t direct_instance_request_address_source_file;
97
99
  ngx_str_t document_root_source_file;
@@ -147,6 +149,7 @@ typedef struct {
147
149
  ngx_uint_t app_type_source_line;
148
150
  ngx_uint_t base_uris_source_line;
149
151
  ngx_uint_t buffer_upload_source_line;
152
+ ngx_uint_t custom_error_page_source_line;
150
153
  ngx_uint_t debugger_source_line;
151
154
  ngx_uint_t direct_instance_request_address_source_line;
152
155
  ngx_uint_t document_root_source_line;
@@ -202,6 +205,7 @@ typedef struct {
202
205
  ngx_int_t app_type_explicitly_set;
203
206
  ngx_int_t base_uris_explicitly_set;
204
207
  ngx_int_t buffer_upload_explicitly_set;
208
+ ngx_int_t custom_error_page_explicitly_set;
205
209
  ngx_int_t debugger_explicitly_set;
206
210
  ngx_int_t direct_instance_request_address_explicitly_set;
207
211
  ngx_int_t document_root_explicitly_set;
@@ -993,6 +993,7 @@ Init_passenger_native_support() {
993
993
  fs_watcher_wait_for_change, 0);
994
994
  rb_define_method(cFileSystemWatcher, "close",
995
995
  fs_watcher_close, 0);
996
+ rb_undef_alloc_func(cFileSystemWatcher);
996
997
  #endif
997
998
 
998
999
  /* The maximum length of a Unix socket path, including terminating null. */
@@ -462,6 +462,11 @@ APACHE2_CONFIGURATION_OPTIONS = [
462
462
  :dynamic_default => 'On if PassengerAppEnv is development, off otherwise',
463
463
  :desc => 'Whether to display friendly error pages when something goes wrong.'
464
464
  },
465
+ {
466
+ :name => 'PassengerCustomErrorPage',
467
+ :type => :string,
468
+ :desc => 'Path to html file to use for Passenger generated error pages.'
469
+ },
465
470
  {
466
471
  :name => 'PassengerRestartDir',
467
472
  :type => :string,
@@ -403,6 +403,11 @@ NGINX_CONFIGURATION_OPTIONS = [
403
403
  :type => :flag,
404
404
  :dynamic_default => 'On if passenger_app_env is development, off otherwise'
405
405
  },
406
+ {
407
+ :name => 'passenger_custom_error_page',
408
+ :scope => :application,
409
+ :type => :string
410
+ },
406
411
  {
407
412
  :name => 'passenger_min_instances',
408
413
  :scope => :application,
@@ -13,3 +13,13 @@ define 'rack' do
13
13
  end
14
14
  gem_install 'rack'
15
15
  end
16
+
17
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
18
+ define 'rackup' do
19
+ name 'rackup'
20
+ define_checker do
21
+ check_for_ruby_library('rackup')
22
+ end
23
+ gem_install 'rackup'
24
+ end
25
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Phusion Passenger - https://www.phusionpassenger.com/
4
+ # Copyright (c) 2024 Phusion Holding B.V.
5
+ #
6
+ # "Passenger", "Phusion Passenger" and "Union Station" are registered
7
+ # trademarks of Phusion Holding B.V.
8
+ #
9
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ # of this software and associated documentation files (the "Software"), to deal
11
+ # in the Software without restriction, including without limitation the rights
12
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ # copies of the Software, and to permit persons to whom the Software is
14
+ # furnished to do so, subject to the following conditions:
15
+ #
16
+ # The above copyright notice and this permission notice shall be included in
17
+ # all copies or substantial portions of the Software.
18
+ #
19
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ # THE SOFTWARE.
26
+
27
+ module PhusionPassenger
28
+ module Rack
29
+ module Handler
30
+ def run(app, options = {})
31
+ result = system(ruby_executable, '-S', find_passenger_standalone,
32
+ 'start', *build_args(options))
33
+ if !result
34
+ raise "Error starting Passenger"
35
+ end
36
+ end
37
+
38
+ def environment
39
+ ENV['RAILS_ENV'] || 'development'
40
+ end
41
+
42
+ def to_s
43
+ 'Passenger application server'
44
+ end
45
+
46
+ private
47
+ def build_args(options)
48
+ args = ['-e', environment]
49
+ args << '-p' << options[:Port].to_s if options[:Port]
50
+ args << '-a' << options[:Host].to_s if options[:Host]
51
+ args << '-R' << options[:config].to_s if options[:config]
52
+ args
53
+ end
54
+
55
+ def rb_config
56
+ if defined?(::RbConfig)
57
+ ::RbConfig::CONFIG
58
+ else
59
+ ::Config::CONFIG
60
+ end
61
+ end
62
+
63
+ def ruby_executable
64
+ @ruby_executable ||= rb_config['bindir'] + '/' +
65
+ rb_config['RUBY_INSTALL_NAME'] + rb_config['EXEEXT']
66
+ end
67
+
68
+ def find_passenger_standalone
69
+ ::File.join(::PhusionPassenger.bin_dir, 'passenger')
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Phusion Passenger - https://www.phusionpassenger.com/
2
4
  # Copyright (c) 2016-2017 Phusion Holding B.V.
3
5
  #
@@ -30,73 +32,45 @@ begin
30
32
  rescue LoadError
31
33
  end
32
34
  require 'phusion_passenger'
35
+ require_relative 'rack/handler'
33
36
  ## Magic comment: end bootstrap ##
34
37
 
35
38
  PhusionPassenger.locate_directories
36
39
 
37
40
  require 'rbconfig'
41
+ require 'rackup' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
38
42
 
39
- module Rack
40
- module Handler
41
- class PhusionPassenger
42
- class << self
43
- def run(app, options = {})
44
- result = system(ruby_executable, '-S', find_passenger_standalone,
45
- 'start', *build_args(options))
46
- if !result
47
- raise "Error starting Passenger"
48
- end
49
- end
50
-
51
- def environment
52
- ENV['RAILS_ENV'] || 'development'
53
- end
54
-
55
- def to_s
56
- 'Passenger application server'
57
- end
58
-
59
- private
60
- def build_args(options)
61
- args = ['-e', environment]
62
- if options[:Port]
63
- args << '-p'
64
- args << options[:Port].to_s
65
- end
66
- if options[:Host]
67
- args << '-a'
68
- args << options[:Host].to_s
69
- end
70
- if options[:config]
71
- args << '-R'
72
- args << options[:config].to_s
73
- end
74
- args
75
- end
76
-
77
- def rb_config
78
- if defined?(::RbConfig)
79
- ::RbConfig::CONFIG
80
- else
81
- ::Config::CONFIG
82
- end
43
+ # Rackup was removed in Rack 3, it is now a separate gem
44
+ if Object.const_defined? :Rackup
45
+ module Rackup
46
+ module Handler
47
+ module PhusionPassenger
48
+ class << self
49
+ include ::PhusionPassenger::Rack::Handler
83
50
  end
51
+ end
84
52
 
85
- def ruby_executable
86
- @ruby_executable ||= rb_config['bindir'] + '/' +
87
- rb_config['RUBY_INSTALL_NAME'] + rb_config['EXEEXT']
88
- end
53
+ def self.default(options = {})
54
+ ::Rackup::Handler::PhusionPassenger
55
+ end
89
56
 
90
- def find_passenger_standalone
91
- ::File.join(::PhusionPassenger.bin_dir, 'passenger')
57
+ register :passenger, PhusionPassenger
58
+ end
59
+ end
60
+ elsif Object.const_defined?(:Rack) && Rack.release < '3'
61
+ module Rack
62
+ module Handler
63
+ module PhusionPassenger
64
+ class << self
65
+ include ::PhusionPassenger::Rack::Handler
92
66
  end
93
67
  end
94
- end
95
-
96
- register 'passenger', 'Rack::Handler::PhusionPassenger'
97
-
98
- def self.default(options = {})
99
- Rack::Handler::PhusionPassenger
68
+ def self.default(options = {})
69
+ ::Rack::Handler::PhusionPassenger
70
+ end
100
71
  end
101
72
  end
73
+ ::Rack::Handler.register(:passenger, ::Rack::Handler::PhusionPassenger)
74
+ else
75
+ raise 'Rack 3 must be used with the Rackup gem'
102
76
  end
@@ -281,6 +281,11 @@ module PhusionPassenger
281
281
  :type => :boolean,
282
282
  :desc => 'Turn on friendly error pages'
283
283
  },
284
+ {
285
+ :name => :custom_error_page,
286
+ :type => :path,
287
+ :desc => 'Path to html file to use for Passenger generated error pages'
288
+ },
284
289
  {
285
290
  :type => :boolean,
286
291
  :cli => '--no-friendly-error-pages',
@@ -144,6 +144,7 @@ module PhusionPassenger
144
144
  add_param(command, :app_start_command, "--app-start-command")
145
145
  add_param(command, :spawn_method, "--spawn-method")
146
146
  add_param(command, :restart_dir, "--restart-dir")
147
+ add_param(command, :custom_error_page, "--custom-error-page")
147
148
  if @options.has_key?(:friendly_error_pages)
148
149
  if @options[:friendly_error_pages]
149
150
  command << " --force-friendly-error-pages"
@@ -25,7 +25,7 @@
25
25
  # gem being available, for example in 'passenger start' before the RuntimeInstaller
26
26
  # has run.
27
27
 
28
- require 'strscan'
28
+ PhusionPassenger.require_passenger_lib 'utils/strscan'
29
29
  require 'forwardable'
30
30
 
31
31
  module PhusionPassenger
@@ -56,11 +56,10 @@ class JSON
56
56
  private :s, :scan, :matched
57
57
 
58
58
  def initialize data
59
- @scanner = StringScanner.new data.to_s
59
+ @scanner = PhusionPassenger::Utils::StringScanner.new data.to_s
60
60
  end
61
61
 
62
62
  def parse
63
- space
64
63
  object
65
64
  end
66
65
 
@@ -197,199 +196,5 @@ class JSON
197
196
  extend Generator
198
197
  end
199
198
 
200
- if __FILE__ == $0
201
- if !$stdin.tty?
202
- data = JSON.parse $stdin.read
203
- require 'pp'
204
- pp data
205
- else
206
- require 'test/unit'
207
- require 'date'
208
- class ParserTest < Test::Unit::TestCase
209
- PARSED = JSON.parse DATA.read
210
- def parsed() PARSED end
211
- def parse_string(str) JSON.parse(%(["#{str}"]).gsub('\\\\', '\\')).first end
212
- def test_string
213
- assert_equal "Pagination library for \"Rails 3\", Sinatra, Merb, DataMapper, and more",
214
- parsed['head']['repository']['description']
215
- end
216
- def test_string_specials
217
- assert_equal "\r\n\t\f\b", parse_string('\r\n\t\f\b')
218
- assert_equal "aA", parse_string('\u0061\u0041')
219
- assert_equal "\e", parse_string('\u001B')
220
- assert_equal "xyz", parse_string('\x\y\z')
221
- assert_equal '"\\/', parse_string('\"\\\\\\/')
222
- assert_equal 'no #{interpolation}', parse_string('no #{interpolation}')
223
- end
224
- def test_hash
225
- assert_equal %w[label ref repository sha user], parsed['head'].keys.sort
226
- end
227
- def test_number
228
- assert_equal 124.3e2, parsed['head']['repository']['size']
229
- end
230
- def test_bool
231
- assert_equal true, parsed['head']['repository']['fork']
232
- assert_equal false, parsed['head']['repository']['private']
233
- end
234
- def test_nil
235
- assert_nil parsed['head']['user']['company']
236
- end
237
- def test_array
238
- assert_equal ["4438f", {"a" => "b"}], parsed['head']['sha']
239
- end
240
- def test_invalid
241
- assert_raises(RuntimeError) { JSON.parse %({) }
242
- assert_raises(RuntimeError) { JSON.parse %({ "foo": }) }
243
- assert_raises(RuntimeError) { JSON.parse %([ "foo": "bar" ]) }
244
- assert_raises(RuntimeError) { JSON.parse %([ ~"foo" ]) }
245
- assert_raises(RuntimeError) { JSON.parse %([ "foo ]) }
246
- assert_raises(RuntimeError) { JSON.parse %([ "foo\\" ]) }
247
- assert_raises(RuntimeError) { JSON.parse %([ "foo\\uabGd" ]) }
248
- end
249
- def test_single_line_comments
250
- source = %Q{
251
- // comment before document
252
- {
253
- // comment
254
- "foo": "1",
255
- "bar": "2",
256
- // another comment
257
- "baz": "3",
258
- "array": [
259
- // comment inside array
260
- 1, 2, 3
261
- // comment at end of array
262
- ]
263
- // comment at end of hash
264
- }
265
- // comment after document
266
- }
267
- doc = { "foo" => "1", "bar" => "2", "baz" => "3", "array" => [1, 2, 3] }
268
- assert_equal(doc, JSON.parse(source))
269
- end
270
- def test_multi_line_comments
271
- source = %Q{
272
- /* comment before
273
- * document */
274
- {
275
- /* comment */
276
- "foo": "1",
277
- "bar": "2",
278
- /* another
279
- comment
280
- */
281
- "baz": "3",
282
- "array": [
283
- /* comment inside array */
284
- 1, 2, 3,
285
- 4, /* comment inside an array */ 5,
286
- /*
287
- // "nested" comments
288
- { "faux json": "inside comment" }
289
- */
290
- 6, 7
291
- /**
292
- * comment at end of array
293
- */
294
- ]
295
- /**************************
296
- comment at end of hash
297
- **************************/
298
- }
299
- /* comment after
300
- document */
301
- }
302
- doc = { "foo" => "1", "bar" => "2", "baz" => "3", "array" => [1, 2, 3, 4, 5, 6, 7] }
303
- assert_equal(doc, JSON.parse(source))
304
- end
305
- end
306
-
307
- class GeneratorTest < Test::Unit::TestCase
308
- def generate(obj) JSON.generate(obj) end
309
- def test_array
310
- assert_equal %([1, 2, 3]), generate([1, 2, 3])
311
- end
312
- def test_bool
313
- assert_equal %([true, false]), generate([true, false])
314
- end
315
- def test_null
316
- assert_equal %([null]), generate([nil])
317
- end
318
- def test_string
319
- assert_equal %(["abc\\n123"]), generate(["abc\n123"])
320
- end
321
- def test_string_unicode
322
- assert_equal %(["ć\\"č\\nž\\tš\\\\đ"]), generate(["ć\"č\nž\tš\\đ"])
323
- end
324
- def test_time
325
- time = Time.utc(2012, 04, 19, 1, 2, 3)
326
- assert_equal %(["2012-04-19 01:02:03 UTC"]), generate([time])
327
- end
328
- def test_date
329
- time = Date.new(2012, 04, 19)
330
- assert_equal %(["2012-04-19"]), generate([time])
331
- end
332
- def test_symbol
333
- assert_equal %(["abc"]), generate([:abc])
334
- end
335
- def test_hash
336
- json = generate(:abc => 123, 123 => 'abc')
337
- assert_match /^\{/, json
338
- assert_match /\}$/, json
339
- assert_equal [%("123": "abc"), %("abc": 123)], json[1...-1].split(', ').sort
340
- end
341
- def test_nested_structure
342
- json = generate(:hash => {1=>2}, :array => [1,2])
343
- assert json.include?(%("hash": {"1": 2}))
344
- assert json.include?(%("array": [1, 2]))
345
- end
346
- def test_invalid_json
347
- assert_raises(ArgumentError) { generate("abc") }
348
- end
349
- def test_invalid_object
350
- err = assert_raises(ArgumentError) { generate("a" => Object.new) }
351
- assert_equal "can't serialize Object", err.message
352
- end
353
- end
354
- end
355
- end
356
-
357
199
  end # module Utils
358
200
  end # module PhusionPassenger
359
-
360
- __END__
361
- {
362
- "head": {
363
- "ref": "master",
364
- "repository": {
365
- "forks": 0,
366
- "integrate_branch": "rails3",
367
- "watchers": 1,
368
- "language": "Ruby",
369
- "description": "Pagination library for \"Rails 3\", Sinatra, Merb, DataMapper, and more",
370
- "has_downloads": true,
371
- "fork": true,
372
- "created_at": "2011/10/24 03:20:48 -0700",
373
- "homepage": "http://github.com/mislav/will_paginate/wikis",
374
- "size": 124.3e2,
375
- "private": false,
376
- "has_wiki": true,
377
- "name": "will_paginate",
378
- "owner": "dbackeus",
379
- "url": "https://github.com/dbackeus/will_paginate",
380
- "has_issues": false,
381
- "open_issues": 0,
382
- "pushed_at": "2011/10/25 05:44:05 -0700"
383
- },
384
- "label": "dbackeus:master",
385
- "sha": ["4438f", { "a" : "b" }],
386
- "user": {
387
- "name": "David Backeus",
388
- "company": null,
389
- "gravatar_id": "ebe96524f5db9e92188f0542dc9d1d1a",
390
- "location": "Stockholm (Sweden)",
391
- "type": "User",
392
- "login": "dbackeus"
393
- }
394
- }
395
- }
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ # Phusion Passenger - https://www.phusionpassenger.com/
3
+ # Copyright (c) 2024 Phusion Holding B.V.
4
+ #
5
+ # "Passenger", "Phusion Passenger" and "Union Station" are registered
6
+ # trademarks of Phusion Holding B.V.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+
26
+ module PhusionPassenger
27
+ module Utils
28
+
29
+ # A minimal pure-Ruby StringScanner implementation so that
30
+ # PhusionPassenger::Utils::JSON doesn't have to depend on the 'strscan' gem.
31
+ class StringScanner
32
+ attr_reader :pos, :matched
33
+
34
+ def initialize(data)
35
+ @data = data
36
+ @pos = 0
37
+ @matched = nil
38
+ end
39
+
40
+ def getch
41
+ @matched =
42
+ if @pos < @data.size
43
+ @pos += 1
44
+ @data[@pos - 1]
45
+ else
46
+ nil
47
+ end
48
+ end
49
+
50
+ def scan(pattern)
51
+ md = @data[@pos .. -1].match(/\A#{pattern}/)
52
+ @matched =
53
+ if md
54
+ @pos += md[0].size
55
+ @matched = md[0]
56
+ else
57
+ nil
58
+ end
59
+ end
60
+
61
+ def reset
62
+ @pos = 0
63
+ end
64
+ end
65
+
66
+ end # module Utils
67
+ end # module PhusionPassenger
@@ -31,16 +31,16 @@ module PhusionPassenger
31
31
 
32
32
  PACKAGE_NAME = 'passenger'
33
33
  # Run 'rake src/cxx_supportlib/Constants.h configkit_schemas_inline_comments' after changing this number.
34
- VERSION_STRING = '6.0.22'
34
+ VERSION_STRING = '6.0.23'
35
35
 
36
36
  # Tip: find the SHA-256 with ./dev/nginx_version_sha256 <VERSION>
37
- PREFERRED_NGINX_VERSION = '1.26.0'
38
- NGINX_SHA256_CHECKSUM = 'd2e6c8439d6c6db5015d8eaab2470ab52aef85a7bf363182879977e084370497'
37
+ PREFERRED_NGINX_VERSION = '1.26.1'
38
+ NGINX_SHA256_CHECKSUM = 'f9187468ff2eb159260bfd53867c25ff8e334726237acf227b9e870e53d3e36b'
39
39
 
40
40
  # Packaging may be locked to an older version due to the specific module configuration being
41
41
  # incompatible with the version we prefer (latest stable).
42
- PACKAGING_PREFERRED_NGINX_VERSION = '1.26.0'
43
- PACKAGING_NGINX_SHA256_CHECKSUM = 'd2e6c8439d6c6db5015d8eaab2470ab52aef85a7bf363182879977e084370497'
42
+ PACKAGING_PREFERRED_NGINX_VERSION = '1.26.1'
43
+ PACKAGING_NGINX_SHA256_CHECKSUM = 'f9187468ff2eb159260bfd53867c25ff8e334726237acf227b9e870e53d3e36b'
44
44
 
45
45
  # sha256sum of the .tar.gz
46
46
  PREFERRED_PCRE_VERSION = '10.39'