passenger 6.0.22 → 6.0.23

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.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

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'