summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_http_static.c
diff options
context:
space:
mode:
authorAlejandro Colomar <alx.manpages@gmail.com>2021-12-09 03:00:23 +0100
committerAlejandro Colomar <alx.manpages@gmail.com>2022-05-30 12:42:18 +0200
commit9af5f369511eefea691a5cb6787a31ef3af53a0a (patch)
treea9660d5de232128ec98230a9fe16053410b0c6a1 /src/nxt_http_static.c
parent237ddbe1770485eab0723aac3a5dca92e1a0c5d9 (diff)
downloadunit-9af5f369511eefea691a5cb6787a31ef3af53a0a.tar.gz
unit-9af5f369511eefea691a5cb6787a31ef3af53a0a.tar.bz2
Static: supporting new "index" option.
This supports a new option "index" that configures a custom index file name to be served when a directory is requested. This initial support only allows a single fixed string. An example: { "share": "/www/data/static/$uri", "index": "lookatthis.htm" } When <example.com/foo/bar/> is requested, </www/data/static/foo/bar/lookatthis.html> is served. Default is "index.html". === nxt_conf_validator.c: Accept "index" as a member of "share", and make sure it's a string. === I tried this feature in my own computer, where I tried the following: - Setting "index" to "lookatthis.htm", and check that the correct file is being served (check both a different name and a different extension). - Not setting "index", and check that <index.html> is being served. - Settind "index" to an array of strings, and check that the configuration fails: { "error": "Invalid configuration.", "detail": "The \"index\" value must be a string, but not an array." }
Diffstat (limited to 'src/nxt_http_static.c')
-rw-r--r--src/nxt_http_static.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/nxt_http_static.c b/src/nxt_http_static.c
index 8964dbbf..61dd0cb3 100644
--- a/src/nxt_http_static.c
+++ b/src/nxt_http_static.c
@@ -19,6 +19,7 @@ typedef struct {
typedef struct {
nxt_uint_t nshares;
nxt_http_static_share_t *shares;
+ nxt_str_t index;
#if (NXT_HAVE_OPENAT2)
nxt_var_t *chroot;
nxt_uint_t resolve;
@@ -75,7 +76,7 @@ nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
{
uint32_t i;
nxt_mp_t *mp;
- nxt_str_t str;
+ nxt_str_t str, *ret;
nxt_var_t *var;
nxt_conf_value_t *cv;
nxt_http_static_conf_t *conf;
@@ -110,6 +111,18 @@ nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
conf->shares[i].is_const = nxt_var_is_const(var);
}
+ if (acf->index == NULL) {
+ nxt_str_set(&conf->index, "index.html");
+
+ } else {
+ nxt_conf_get_string(acf->index, &str);
+
+ ret = nxt_str_dup(mp, &conf->index, &str);
+ if (nxt_slow_path(ret == NULL)) {
+ return NXT_ERROR;
+ }
+ }
+
#if (NXT_HAVE_OPENAT2)
if (acf->chroot.length > 0) {
nxt_str_t chr, shr;
@@ -222,8 +235,10 @@ nxt_http_static_iterate(nxt_task_t *task, nxt_http_request_t *r,
#if (NXT_DEBUG)
nxt_str_t shr;
+ nxt_str_t idx;
nxt_var_raw(share->var, &shr);
+ idx = conf->index;
#if (NXT_HAVE_OPENAT2)
nxt_str_t chr;
@@ -235,9 +250,10 @@ nxt_http_static_iterate(nxt_task_t *task, nxt_http_request_t *r,
nxt_str_set(&chr, "");
}
- nxt_debug(task, "http static: \"%V\" (chroot: \"%V\")", &shr, &chr);
+ nxt_debug(task, "http static: \"%V\", index: \"%V\" (chroot: \"%V\")",
+ &shr, &idx, &chr);
#else
- nxt_debug(task, "http static: \"%V\"", &shr);
+ nxt_debug(task, "http static: \"%V\", index: \"%V\"", &shr, &idx);
#endif
#endif /* NXT_DEBUG */
@@ -282,7 +298,7 @@ nxt_http_static_send_ready(nxt_task_t *task, void *obj, void *data)
struct tm tm;
nxt_buf_t *fb;
nxt_int_t ret;
- nxt_str_t *shr, exten, *mtype;
+ nxt_str_t *shr, *index, exten, *mtype;
nxt_uint_t level;
nxt_file_t *f, file;
nxt_file_info_t fi;
@@ -295,8 +311,6 @@ nxt_http_static_send_ready(nxt_task_t *task, void *obj, void *data)
nxt_http_static_ctx_t *ctx;
nxt_http_static_conf_t *conf;
- static const nxt_str_t index = nxt_string("index.html");
-
r = obj;
ctx = data;
action = ctx->action;
@@ -307,12 +321,12 @@ nxt_http_static_send_ready(nxt_task_t *task, void *obj, void *data)
mtype = NULL;
shr = &ctx->share;
+ index = &conf->index;
if (shr->start[shr->length - 1] == '/') {
- /* TODO: dynamic index setting. */
- nxt_str_set(&exten, ".html");
+ nxt_http_static_extract_extension(index, &exten);
- length = shr->length + index.length;
+ length = shr->length + index->length;
fname = nxt_mp_nget(r->mem_pool, length + 1);
if (nxt_slow_path(fname == NULL)) {
@@ -321,7 +335,7 @@ nxt_http_static_send_ready(nxt_task_t *task, void *obj, void *data)
p = fname;
p = nxt_cpymem(p, shr->start, shr->length);
- p = nxt_cpymem(p, index.start, index.length);
+ p = nxt_cpymem(p, index->start, index->length);
*p = '\0';
} else {