switch dynamic handlers to regex based patterns, much easier.

This commit is contained in:
Joris Vink 2013-05-29 14:29:46 +02:00
parent 2290d09d3b
commit 088d877715
9 changed files with 81 additions and 25 deletions

View File

@ -90,11 +90,11 @@ struct connection {
#define HANDLER_TYPE_DYNAMIC 2
struct kore_module_handle {
char *uri;
char *domain;
char *path;
char *func;
void *addr;
int type;
regex_t rctx;
TAILQ_ENTRY(kore_module_handle) list;
};
@ -126,6 +126,7 @@ long long kore_strtonum(const char *, long long, long long, int *);
void kore_module_load(char *);
void kore_module_reload(void);
int kore_module_loaded(void);
int kore_module_domain_new(char *);
void *kore_module_handler_find(char *, char *);
int kore_module_handler_new(char *, char *, char *, int);

View File

@ -31,6 +31,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"

View File

@ -32,6 +32,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"
@ -139,6 +140,10 @@ configure_domain(char **argv)
if (current_domain != NULL)
free(current_domain);
current_domain = kore_strdup(argv[1]);
if (!kore_module_domain_new(current_domain)) {
kore_log("could not create new domain %s", current_domain);
return (KORE_RESULT_ERROR);
}
return (KORE_RESULT_OK);
}

View File

@ -31,6 +31,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <time.h>
#include <zlib.h>

View File

@ -34,6 +34,7 @@
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"

View File

@ -34,6 +34,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"
@ -43,7 +44,14 @@ static void *mod_handle = NULL;
static char *mod_name = NULL;
static time_t mod_last_mtime = 0;
static TAILQ_HEAD(, kore_module_handle) handlers;
struct module_domain {
char *domain;
TAILQ_HEAD(, kore_module_handle) handlers;
TAILQ_ENTRY(module_domain) list;
};
static TAILQ_HEAD(, module_domain) domains;
static struct module_domain *kore_module_domain_lookup(char *);
void
kore_module_load(char *module_name)
@ -63,13 +71,14 @@ kore_module_load(char *module_name)
if (mod_handle == NULL)
fatal("%s", dlerror());
TAILQ_INIT(&handlers);
TAILQ_INIT(&domains);
mod_name = kore_strdup(module_name);
}
void
kore_module_reload(void)
{
struct module_domain *dom;
struct kore_module_handle *hdlr;
if (dlclose(mod_handle))
@ -79,10 +88,12 @@ kore_module_reload(void)
if (mod_handle == NULL)
fatal("kore_module_reload(): %s", dlerror());
TAILQ_FOREACH(hdlr, &handlers, list) {
hdlr->addr = dlsym(mod_handle, hdlr->func);
if (hdlr->func == NULL)
fatal("no function '%s' found", hdlr->func);
TAILQ_FOREACH(dom, &domains, list) {
TAILQ_FOREACH(hdlr, &(dom->handlers), list) {
hdlr->addr = dlsym(mod_handle, hdlr->func);
if (hdlr->func == NULL)
fatal("no function '%s' found", hdlr->func);
}
}
kore_log("reloaded '%s' module", mod_name);
@ -94,10 +105,27 @@ kore_module_loaded(void)
return (mod_handle != NULL ? KORE_RESULT_OK : KORE_RESULT_ERROR);
}
int
kore_module_domain_new(char *domain)
{
struct module_domain *dom;
if (kore_module_domain_lookup(domain) != NULL)
return (KORE_RESULT_ERROR);
dom = (struct module_domain *)kore_malloc(sizeof(*dom));
dom->domain = kore_strdup(domain);
TAILQ_INIT(&(dom->handlers));
TAILQ_INSERT_TAIL(&domains, dom, list);
return (KORE_RESULT_OK);
}
int
kore_module_handler_new(char *path, char *domain, char *func, int type)
{
void *addr;
struct module_domain *dom;
struct kore_module_handle *hdlr;
char uri[512];
@ -110,15 +138,26 @@ kore_module_handler_new(char *path, char *domain, char *func, int type)
return (KORE_RESULT_ERROR);
}
snprintf(uri, sizeof(uri), "%s%s", domain, path);
if ((dom = kore_module_domain_lookup(domain)) == NULL)
return (KORE_RESULT_ERROR);
hdlr = (struct kore_module_handle *)kore_malloc(sizeof(*hdlr));
hdlr->addr = addr;
hdlr->type = type;
hdlr->uri = kore_strdup(uri);
hdlr->path = kore_strdup(path);
hdlr->func = kore_strdup(func);
TAILQ_INSERT_TAIL(&(handlers), hdlr, list);
if (hdlr->type == HANDLER_TYPE_DYNAMIC) {
if (regcomp(&(hdlr->rctx), hdlr->path, REG_NOSUB)) {
free(hdlr->func);
free(hdlr->path);
free(hdlr);
kore_log("regcomp() on %s failed", path);
return (KORE_RESULT_ERROR);
}
}
TAILQ_INSERT_TAIL(&(dom->handlers), hdlr, list);
return (KORE_RESULT_OK);
}
@ -126,29 +165,34 @@ void *
kore_module_handler_find(char *domain, char *path)
{
size_t len;
struct module_domain *dom;
struct kore_module_handle *hdlr;
char uri[512], *p;
snprintf(uri, sizeof(uri), "%s%s", domain, path);
p = strchr(uri, '.');
if ((dom = kore_module_domain_lookup(domain)) == NULL)
return (NULL);
TAILQ_FOREACH(hdlr, &handlers, list) {
TAILQ_FOREACH(hdlr, &(dom->handlers), list) {
if (hdlr->type == HANDLER_TYPE_STATIC) {
if (hdlr->uri[0] != '.' && !strcmp(hdlr->uri, uri))
return (hdlr->addr);
if (p != NULL && hdlr->uri[0] == '.' &&
!strcmp(hdlr->uri, p))
if (!strcmp(hdlr->path, path))
return (hdlr->addr);
} else {
len = strlen(hdlr->uri);
if (hdlr->uri[0] != '.' &&
!strncmp(hdlr->uri, uri, len))
return (hdlr->addr);
if (p != NULL && hdlr->uri[0] == '.' &&
!strncmp(hdlr->uri, p, len))
if (!regexec(&(hdlr->rctx), path, 0, NULL, 0))
return (hdlr->addr);
}
}
return (NULL);
}
static struct module_domain *
kore_module_domain_lookup(char *domain)
{
struct module_domain *dom;
TAILQ_FOREACH(dom, &domains, list) {
if (!strcmp(dom->domain, domain))
return (dom);
}
return (NULL);
}

View File

@ -32,6 +32,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"

View File

@ -31,6 +31,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"

View File

@ -31,6 +31,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <zlib.h>
#include "spdy.h"