Ruby: added support for rack V3.
Ruby applications would fail to start if they were using rack v3
2022/09/28 15:48:46 [alert] 0#80912 [unit] Ruby: Failed to parse rack script
2022/09/28 15:48:46 [notice] 80911#80911 app process 80912 exited with code 1
This was due to a change in the rack API
Rack V2
def self.load_file(path, opts = Server::Options.new)
...
cfgfile.sub!(/^__END__\n.*\Z/m, '')
app = new_from_string cfgfile, path
return app, options
end
Rack V3
def self.load_file(path)
...
return new_from_string(config, path)
end
This patch handles _both_ the above APIs by correctly handling the cases
where we do and don't get an array returned from
nxt_ruby_rack_parse_script().
Closes: <https://github.com/nginx/unit/issues/755>
Tested-by: Andrew Clayton <a.clayton@nginx.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
[ Andrew: Patch by Zhidao, commit message by me with input from Zhidao ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
This commit is contained in:
committed by
Andrew Clayton
parent
b00983369b
commit
dc9f592d6e
@@ -31,6 +31,12 @@ NGINX Unit updated to 1.29.0.
|
|||||||
date="" time=""
|
date="" time=""
|
||||||
packager="Nginx Packaging <nginx-packaging@f5.com>">
|
packager="Nginx Packaging <nginx-packaging@f5.com>">
|
||||||
|
|
||||||
|
<change type="feature">
|
||||||
|
<para>
|
||||||
|
support rack v3 in ruby applications.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
<change type="bugfix">
|
<change type="bugfix">
|
||||||
<para>
|
<para>
|
||||||
fix HTTP cookie parsing when the value contains an equals sign.
|
fix HTTP cookie parsing when the value contains an equals sign.
|
||||||
|
|||||||
@@ -480,12 +480,17 @@ nxt_ruby_rack_init(nxt_ruby_rack_init_t *rack_init)
|
|||||||
|
|
||||||
rackup = rb_protect(nxt_ruby_rack_parse_script,
|
rackup = rb_protect(nxt_ruby_rack_parse_script,
|
||||||
(VALUE) (uintptr_t) rack_init, &state);
|
(VALUE) (uintptr_t) rack_init, &state);
|
||||||
if (nxt_slow_path(TYPE(rackup) != T_ARRAY || state != 0)) {
|
|
||||||
|
if (nxt_slow_path(state != 0)) {
|
||||||
nxt_ruby_exception_log(NULL, NXT_LOG_ALERT,
|
nxt_ruby_exception_log(NULL, NXT_LOG_ALERT,
|
||||||
"Failed to parse rack script");
|
"Failed to parse rack script");
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TYPE(rackup) != T_ARRAY) {
|
||||||
|
return rackup;
|
||||||
|
}
|
||||||
|
|
||||||
if (nxt_slow_path(RARRAY_LEN(rackup) < 1)) {
|
if (nxt_slow_path(RARRAY_LEN(rackup) < 1)) {
|
||||||
nxt_alert(rack_init->task, "Ruby: Invalid rack config file");
|
nxt_alert(rack_init->task, "Ruby: Invalid rack config file");
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
|||||||
Reference in New Issue
Block a user