Ruby: fixed contents of SCRIPT_NAME.
Having the basename of the script pathname was incorrect. While
we don't have something more accurate, the best thing to do is to
have it empty (which should be the right thing most of the time).
This closes #715 issue on GitHub.
The bug was introduced in git commit
0032543fa6
'Ruby: added the Rack environment parameter "SCRIPT_NAME".'.
This commit is contained in:
@@ -75,6 +75,12 @@ increased the applications' startup timeout.
|
|||||||
</para>
|
</para>
|
||||||
</change>
|
</change>
|
||||||
|
|
||||||
|
<change type="bugfix">
|
||||||
|
<para>
|
||||||
|
force SCRIPT_NAME in Ruby to always be an empty string.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
</changes>
|
</changes>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ typedef struct {
|
|||||||
static nxt_int_t nxt_ruby_start(nxt_task_t *task,
|
static nxt_int_t nxt_ruby_start(nxt_task_t *task,
|
||||||
nxt_process_data_t *data);
|
nxt_process_data_t *data);
|
||||||
static VALUE nxt_ruby_init_basic(VALUE arg);
|
static VALUE nxt_ruby_init_basic(VALUE arg);
|
||||||
static VALUE nxt_ruby_script_basename(nxt_str_t *script);
|
|
||||||
|
|
||||||
static VALUE nxt_ruby_hook_procs_load(VALUE path);
|
static VALUE nxt_ruby_hook_procs_load(VALUE path);
|
||||||
static VALUE nxt_ruby_hook_register(VALUE arg);
|
static VALUE nxt_ruby_hook_register(VALUE arg);
|
||||||
@@ -50,7 +49,7 @@ static void *nxt_ruby_thread_create_gvl(void *rctx);
|
|||||||
static VALUE nxt_ruby_thread_func(VALUE arg);
|
static VALUE nxt_ruby_thread_func(VALUE arg);
|
||||||
static void *nxt_ruby_unit_run(void *ctx);
|
static void *nxt_ruby_unit_run(void *ctx);
|
||||||
static void nxt_ruby_ubf(void *ctx);
|
static void nxt_ruby_ubf(void *ctx);
|
||||||
static int nxt_ruby_init_threads(VALUE script, nxt_ruby_app_conf_t *c);
|
static int nxt_ruby_init_threads(nxt_ruby_app_conf_t *c);
|
||||||
static void nxt_ruby_join_threads(nxt_unit_ctx_t *ctx,
|
static void nxt_ruby_join_threads(nxt_unit_ctx_t *ctx,
|
||||||
nxt_ruby_app_conf_t *c);
|
nxt_ruby_app_conf_t *c);
|
||||||
|
|
||||||
@@ -261,7 +260,7 @@ static nxt_int_t
|
|||||||
nxt_ruby_start(nxt_task_t *task, nxt_process_data_t *data)
|
nxt_ruby_start(nxt_task_t *task, nxt_process_data_t *data)
|
||||||
{
|
{
|
||||||
int state, rc;
|
int state, rc;
|
||||||
VALUE res, path, script;
|
VALUE res, path;
|
||||||
nxt_ruby_ctx_t ruby_ctx;
|
nxt_ruby_ctx_t ruby_ctx;
|
||||||
nxt_unit_ctx_t *unit_ctx;
|
nxt_unit_ctx_t *unit_ctx;
|
||||||
nxt_unit_init_t ruby_unit_init;
|
nxt_unit_init_t ruby_unit_init;
|
||||||
@@ -283,10 +282,7 @@ nxt_ruby_start(nxt_task_t *task, nxt_process_data_t *data)
|
|||||||
ruby_options(2, argv);
|
ruby_options(2, argv);
|
||||||
ruby_script("NGINX_Unit");
|
ruby_script("NGINX_Unit");
|
||||||
|
|
||||||
script = nxt_ruby_script_basename(&c->script);
|
|
||||||
|
|
||||||
ruby_ctx.env = Qnil;
|
ruby_ctx.env = Qnil;
|
||||||
ruby_ctx.script = script;
|
|
||||||
ruby_ctx.io_input = Qnil;
|
ruby_ctx.io_input = Qnil;
|
||||||
ruby_ctx.io_error = Qnil;
|
ruby_ctx.io_error = Qnil;
|
||||||
ruby_ctx.thread = Qnil;
|
ruby_ctx.thread = Qnil;
|
||||||
@@ -356,7 +352,7 @@ nxt_ruby_start(nxt_task_t *task, nxt_process_data_t *data)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = nxt_ruby_init_threads(script, c);
|
rc = nxt_ruby_init_threads(c);
|
||||||
if (nxt_slow_path(rc == NXT_UNIT_ERROR)) {
|
if (nxt_slow_path(rc == NXT_UNIT_ERROR)) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -424,37 +420,6 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
nxt_ruby_script_basename(nxt_str_t *script)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
u_char *p, *last;
|
|
||||||
|
|
||||||
last = NULL;
|
|
||||||
p = script->start + script->length;
|
|
||||||
|
|
||||||
while (p > script->start) {
|
|
||||||
|
|
||||||
if (p[-1] == '/') {
|
|
||||||
last = p;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (last != NULL) {
|
|
||||||
len = script->length - (last - script->start);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
last = script->start;
|
|
||||||
len = script->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rb_str_new((const char *) last, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
nxt_ruby_init_basic(VALUE arg)
|
nxt_ruby_init_basic(VALUE arg)
|
||||||
{
|
{
|
||||||
@@ -598,7 +563,7 @@ nxt_ruby_rack_env_create(VALUE arg)
|
|||||||
rb_ary_push(version, UINT2NUM(NXT_RUBY_RACK_API_VERSION_MAJOR));
|
rb_ary_push(version, UINT2NUM(NXT_RUBY_RACK_API_VERSION_MAJOR));
|
||||||
rb_ary_push(version, UINT2NUM(NXT_RUBY_RACK_API_VERSION_MINOR));
|
rb_ary_push(version, UINT2NUM(NXT_RUBY_RACK_API_VERSION_MINOR));
|
||||||
|
|
||||||
rb_hash_aset(hash_env, rb_str_new2("SCRIPT_NAME"), rctx->script);
|
rb_hash_aset(hash_env, rb_str_new2("SCRIPT_NAME"), rb_str_new("", 0));
|
||||||
rb_hash_aset(hash_env, rb_str_new2("rack.version"), version);
|
rb_hash_aset(hash_env, rb_str_new2("rack.version"), version);
|
||||||
rb_hash_aset(hash_env, rb_str_new2("rack.input"), rctx->io_input);
|
rb_hash_aset(hash_env, rb_str_new2("rack.input"), rctx->io_input);
|
||||||
rb_hash_aset(hash_env, rb_str_new2("rack.errors"), rctx->io_error);
|
rb_hash_aset(hash_env, rb_str_new2("rack.errors"), rctx->io_error);
|
||||||
@@ -1393,7 +1358,7 @@ nxt_ruby_ubf(void *ctx)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nxt_ruby_init_threads(VALUE script, nxt_ruby_app_conf_t *c)
|
nxt_ruby_init_threads(nxt_ruby_app_conf_t *c)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
@@ -1415,7 +1380,6 @@ nxt_ruby_init_threads(VALUE script, nxt_ruby_app_conf_t *c)
|
|||||||
rctx = &nxt_ruby_ctxs[i];
|
rctx = &nxt_ruby_ctxs[i];
|
||||||
|
|
||||||
rctx->env = Qnil;
|
rctx->env = Qnil;
|
||||||
rctx->script = script;
|
|
||||||
rctx->io_input = Qnil;
|
rctx->io_input = Qnil;
|
||||||
rctx->io_error = Qnil;
|
rctx->io_error = Qnil;
|
||||||
rctx->thread = Qnil;
|
rctx->thread = Qnil;
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
VALUE env;
|
VALUE env;
|
||||||
VALUE script;
|
|
||||||
VALUE io_input;
|
VALUE io_input;
|
||||||
VALUE io_error;
|
VALUE io_error;
|
||||||
VALUE thread;
|
VALUE thread;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class TestRubyApplication(TestApplicationRuby):
|
|||||||
'Request-Method': 'POST',
|
'Request-Method': 'POST',
|
||||||
'Request-Uri': '/',
|
'Request-Uri': '/',
|
||||||
'Http-Host': 'localhost',
|
'Http-Host': 'localhost',
|
||||||
'Script-Name': 'config.ru',
|
'Script-Name': '',
|
||||||
'Server-Protocol': 'HTTP/1.1',
|
'Server-Protocol': 'HTTP/1.1',
|
||||||
'Custom-Header': 'blah',
|
'Custom-Header': 'blah',
|
||||||
'Rack-Version': '13',
|
'Rack-Version': '13',
|
||||||
|
|||||||
Reference in New Issue
Block a user