forked from mirrors/kore
Add filemap_ext configuration option.
Allows you to specify the default extensions used for a file served via a filemap, eg: filemap_ext .html Gives us ability to provide clean urls.
This commit is contained in:
parent
b5e122419b
commit
04077c66b6
|
@ -649,6 +649,7 @@ int kore_msg_register(u_int8_t,
|
||||||
void kore_filemap_init(void);
|
void kore_filemap_init(void);
|
||||||
int kore_filemap_create(struct kore_domain *, const char *,
|
int kore_filemap_create(struct kore_domain *, const char *,
|
||||||
const char *);
|
const char *);
|
||||||
|
extern char *kore_filemap_ext;
|
||||||
extern char *kore_filemap_index;
|
extern char *kore_filemap_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
11
src/config.c
11
src/config.c
|
@ -82,6 +82,7 @@ static int configure_dynamic_handler(char *);
|
||||||
static int configure_accesslog(char *);
|
static int configure_accesslog(char *);
|
||||||
static int configure_http_header_max(char *);
|
static int configure_http_header_max(char *);
|
||||||
static int configure_http_body_max(char *);
|
static int configure_http_body_max(char *);
|
||||||
|
static int configure_filemap_ext(char *);
|
||||||
static int configure_filemap_index(char *);
|
static int configure_filemap_index(char *);
|
||||||
static int configure_http_media_type(char *);
|
static int configure_http_media_type(char *);
|
||||||
static int configure_http_hsts_enable(char *);
|
static int configure_http_hsts_enable(char *);
|
||||||
|
@ -151,6 +152,7 @@ static struct {
|
||||||
#endif
|
#endif
|
||||||
#if !defined(KORE_NO_HTTP)
|
#if !defined(KORE_NO_HTTP)
|
||||||
{ "filemap", configure_filemap },
|
{ "filemap", configure_filemap },
|
||||||
|
{ "filemap_ext", configure_filemap_ext },
|
||||||
{ "filemap_index", configure_filemap_index },
|
{ "filemap_index", configure_filemap_index },
|
||||||
{ "static", configure_static_handler },
|
{ "static", configure_static_handler },
|
||||||
{ "dynamic", configure_dynamic_handler },
|
{ "dynamic", configure_dynamic_handler },
|
||||||
|
@ -661,6 +663,15 @@ configure_accesslog(char *path)
|
||||||
return (KORE_RESULT_OK);
|
return (KORE_RESULT_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
configure_filemap_ext(char *ext)
|
||||||
|
{
|
||||||
|
kore_free(kore_filemap_ext);
|
||||||
|
kore_filemap_ext = kore_strdup(ext);
|
||||||
|
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
configure_filemap_index(char *index)
|
configure_filemap_index(char *index)
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,6 +42,7 @@ static void filemap_serve(struct http_request *, struct filemap_entry *);
|
||||||
|
|
||||||
static TAILQ_HEAD(, filemap_entry) maps;
|
static TAILQ_HEAD(, filemap_entry) maps;
|
||||||
|
|
||||||
|
char *kore_filemap_ext = NULL;
|
||||||
char *kore_filemap_index = NULL;
|
char *kore_filemap_index = NULL;
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -126,11 +127,13 @@ filemap_serve(struct http_request *req, struct filemap_entry *map)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct kore_fileref *ref;
|
struct kore_fileref *ref;
|
||||||
|
const char *path;
|
||||||
int len, fd, index;
|
int len, fd, index;
|
||||||
char fpath[MAXPATHLEN];
|
char fpath[MAXPATHLEN];
|
||||||
|
|
||||||
len = snprintf(fpath, sizeof(fpath), "%s/%s", map->ondisk,
|
path = req->path + map->root_len;
|
||||||
req->path + map->root_len);
|
|
||||||
|
len = snprintf(fpath, sizeof(fpath), "%s/%s", map->ondisk, path);
|
||||||
if (len == -1 || (size_t)len >= sizeof(fpath)) {
|
if (len == -1 || (size_t)len >= sizeof(fpath)) {
|
||||||
http_response(req, HTTP_STATUS_INTERNAL_ERROR, NULL, 0);
|
http_response(req, HTTP_STATUS_INTERNAL_ERROR, NULL, 0);
|
||||||
return;
|
return;
|
||||||
|
@ -153,7 +156,22 @@ lookup:
|
||||||
if ((fd = open(fpath, O_RDONLY | O_NOFOLLOW)) == -1) {
|
if ((fd = open(fpath, O_RDONLY | O_NOFOLLOW)) == -1) {
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case ENOENT:
|
case ENOENT:
|
||||||
req->status = HTTP_STATUS_NOT_FOUND;
|
if (index || kore_filemap_ext == NULL) {
|
||||||
|
req->status = HTTP_STATUS_NOT_FOUND;
|
||||||
|
} else {
|
||||||
|
len = snprintf(fpath, sizeof(fpath),
|
||||||
|
"%s/%s%s", map->ondisk, path,
|
||||||
|
kore_filemap_ext);
|
||||||
|
if (len == -1 ||
|
||||||
|
(size_t)len >= sizeof(fpath)) {
|
||||||
|
http_response(req,
|
||||||
|
HTTP_STATUS_INTERNAL_ERROR,
|
||||||
|
NULL, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
goto lookup;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EPERM:
|
case EPERM:
|
||||||
case EACCES:
|
case EACCES:
|
||||||
|
@ -191,8 +209,7 @@ lookup:
|
||||||
}
|
}
|
||||||
} else if (S_ISDIR(st.st_mode) && index == 0) {
|
} else if (S_ISDIR(st.st_mode) && index == 0) {
|
||||||
len = snprintf(fpath, sizeof(fpath),
|
len = snprintf(fpath, sizeof(fpath),
|
||||||
"%s/%s%s", map->ondisk,
|
"%s/%s%s", map->ondisk, path,
|
||||||
req->path + map->root_len,
|
|
||||||
kore_filemap_index != NULL ?
|
kore_filemap_index != NULL ?
|
||||||
kore_filemap_index : "index.html");
|
kore_filemap_index : "index.html");
|
||||||
if (len == -1 || (size_t)len >= sizeof(fpath)) {
|
if (len == -1 || (size_t)len >= sizeof(fpath)) {
|
||||||
|
|
Loading…
Reference in New Issue