added qse_httpd_mod_t and supporting functions

This commit is contained in:
2014-09-04 16:55:45 +00:00
parent d8f8f93207
commit bfeb437225
7 changed files with 285 additions and 278 deletions

View File

@ -975,7 +975,12 @@ static int task_init_proxy (
if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_ENABLE_URS)
{
int x = httpd->opt.scb.urs.prerewrite (httpd, client, arg->req, arg->rsrc->host, &proxy->url_to_rewrite);
int x;
if (arg->rsrc->urs_prerewrite_mod && arg->rsrc->urs_prerewrite_mod->urs_prerewrite)
x = arg->rsrc->urs_prerewrite_mod->urs_prerewrite (arg->rsrc->urs_prerewrite_mod, client, arg->req, arg->rsrc->host, &proxy->url_to_rewrite);
else
x = httpd->opt.scb.urs.prerewrite (httpd, client, arg->req, arg->rsrc->host, &proxy->url_to_rewrite);
if (x <= -1) goto oops;
printf (">>>>>>>>>>>>>>>>>>>>>>>> [%s] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", proxy->url_to_rewrite);

View File

@ -1,50 +1,17 @@
#if !defined(QSE_HTTPD_DEFAULT_MODPREFIX)
# if defined(_WIN32)
# define QSE_HTTPD_DEFAULT_MODPREFIX "qsehttpd-"
# elif defined(__OS2__)
# define QSE_HTTPD_DEFAULT_MODPREFIX "htd-"
# elif defined(__DOS__)
# define QSE_HTTPD_DEFAULT_MODPREFIX "htd-"
# else
# define QSE_HTTPD_DEFAULT_MODPREFIX "libqsehttpd-"
# endif
#endif
#if !defined(QSE_HTTPD_DEFAULT_MODPOSTFIX)
# define QSE_HTTPD_DEFAULT_MODPOSTFIX ""
#endif
static int mod_open (qse_httpd_t* httpd, qse_httpd_mod_t* mod)
{
#if defined(USE_LTDL)
void* h;
qse_mchar_t* modpath;
const qse_char_t* tmp[4];
int count;
count = 0;
if (spec->prefix) tmp[count++] = spec->prefix;
tmp[count++] = mod->name;
if (spec->postfix) tmp[count++] = spec->postfix;
tmp[count] = QSE_NULL;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = qse_mbsadup (tmp, QSE_NULL, httpd->mmgr);
#else
modpath = qse_wcsatombsdup (tmp, QSE_NULL, httpd->mmgr);
#endif
if (!modpath)
h = lt_dlopenext (mod->fullname);
if (h == QSE_NULL)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM, QSE_NULL);
qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
return -1;
}
h = lt_dlopenext (modpath);
QSE_MMGR_FREE (httpd->mmgr, modpath);
if (h == QSE_NULL) return -1;
mod->handle = h;
return 0;
@ -52,69 +19,42 @@ static int mod_open (qse_httpd_t* httpd, qse_httpd_mod_t* mod)
#elif defined(_WIN32)
HMODULE h;
qse_char_t* modpath;
const qse_char_t* tmp[4];
int count;
count = 0;
if (spec->prefix) tmp[count++] = spec->prefix;
tmp[count++] = spec->name;
if (spec->postfix) tmp[count++] = spec->postfix;
tmp[count] = QSE_NULL;
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
modpath = qse_stradup (tmp, QSE_NULL, httpd->mmgr);
if (!modpath)
h = LoadLibrary (mod->fullname);
if (h == QSE_NULL)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM, QSE_NULL);
qse_httpd_seterrnum (httpd, syserr_to_errnum(GetLastError()));
return -1;
}
h = LoadLibrary (modpath);
QSE_MMGR_FREE (httpd->mmgr, modpath);
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
if (h == QSE_NULL) return -1;
mod->handle = h;
return 0;
#elif defined(__OS2__)
HMODULE h;
qse_mchar_t* modpath;
const qse_char_t* tmp[4];
int count;
char errbuf[CCHMAXPATH];
APIRET rc;
count = 0;
if (spec->prefix) tmp[count++] = spec->prefix;
tmp[count++] = spec->name;
if (spec->postfix) tmp[count++] = spec->postfix;
tmp[count] = QSE_NULL;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = qse_mbsadup (tmp, QSE_NULL, httpd->mmgr);
#else
modpath = qse_wcsatombsdup (tmp, QSE_NULL, httpd->mmgr);
#endif
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM, QSE_NULL);
return -1;
}
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
/* DosLoadModule() seems to have severe limitation on
* the file name it can load (max-8-letters.xxx) */
rc = DosLoadModule (errbuf, QSE_COUNTOF(errbuf) - 1, modpath, &h);
if (rc != NO_ERROR) h = QSE_NULL;
if (rc != NO_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(rc));
return -1;
}
QSE_MMGR_FREE (httpd->mmgr, modpath);
if (h == QSE_NULL)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOENT); /* is this error code ok? */
return -1;
}
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
if (h == QSE_NULL) return -1;
mod->handle = h;
return 0;
@ -125,34 +65,14 @@ static int mod_open (qse_httpd_t* httpd, qse_httpd_mod_t* mod)
* dos-extender only. the best is to enable QSE_ENABLE_STATIC_MODULE
* when building for DOS. */
void* h;
qse_mchar_t* modpath;
const qse_char_t* tmp[4];
int count;
count = 0;
if (spec->prefix) tmp[count++] = spec->prefix;
tmp[count++] = spec->name;
if (spec->postfix) tmp[count++] = spec->postfix;
tmp[count] = QSE_NULL;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = qse_mbsadup (tmp, QSE_NULL, httpd->mmgr);
#else
modpath = qse_wcsatombsdup (tmp, QSE_NULL, httpd->mmgr);
#endif
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM, QSE_NULL);
return 01;
}
h = LoadModule (modpath);
if (h == QSE_NULL)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
return -1;
}
QSE_MMGR_FREE (httpd->mmgr, modpath);
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
if (h == QSE_NULL) return -1;
mod->handle = h;
return 0;
@ -195,14 +115,26 @@ static void* mod_symbol (qse_httpd_t* httpd, qse_httpd_mod_t* handle, const qse_
#if defined(USE_LTDL)
s = lt_dlsym (mod->handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#elif defined(_WIN32)
s = GetProcAddress ((HMODULE)mod->handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(GetLastError()));
#elif defined(__OS2__)
if (DosQueryProcAddr ((HMODULE)mod->handle, 0, mname, (PFN*)&s) != NO_ERROR) s = QSE_NULL;
{
APIRET rc;
rc = DosQueryProcAddr ((HMODULE)mod->handle, 0, mname, (PFN*)&s);
if (rc != NO_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(rc));
s = QSE_NULL;
}
}
#elif defined(__DOS__)
s = GetProcAddress (mod->handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#else
s = QSE_NULL;
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
#endif
#if defined(QSE_CHAR_IS_MCHAR)

View File

@ -217,7 +217,6 @@ int qse_httpd_setopt (qse_httpd_t* httpd, qse_httpd_opt_t id, const void* value)
httpd->opt.rcb = *(qse_httpd_rcb_t*)value;
return 0;
}
httpd->errnum = QSE_HTTPD_EINVAL;
@ -1900,7 +1899,7 @@ static void unload_all_modules (qse_httpd_t* httpd)
mod = httpd->modlist;
httpd->modlist = mod->next;
/* call fini */
if (mod->unload) mod->unload (mod);
httpd->opt.scb.mod.close (httpd, mod);
qse_httpd_freemem (httpd, mod);
}
@ -1909,29 +1908,87 @@ static void unload_all_modules (qse_httpd_t* httpd)
int qse_httpd_loadmod (qse_httpd_t* httpd, const qse_char_t* name)
{
qse_httpd_mod_t* mod;
qse_size_t name_len;
qse_size_t name_len, prefix_len, postfix_len, fullname_len;
const qse_char_t* prefix, * postfix;
qse_char_t* entry_point_name;
qse_httpd_mod_load_t load;
/* TODO: no singly linked list speed up */
name_len = qse_strlen(name);
mod = qse_httpd_allocmem (httpd, QSE_SIZEOF(*mod) + name_len + 1);
if (httpd->opt.mod[0].len > 0)
{
prefix = httpd->opt.mod[0].ptr;
prefix_len = httpd->opt.mod[0].len;
}
else
{
prefix = QSE_T(QSE_HTTPD_DEFAULT_MODPREFIX);
prefix_len = qse_strlen(prefix);
}
if (httpd->opt.mod[1].len > 0)
{
postfix = httpd->opt.mod[1].ptr;
postfix_len = httpd->opt.mod[1].len;
}
else
{
postfix = QSE_T(QSE_HTTPD_DEFAULT_MODPOSTFIX);
postfix_len = qse_strlen(postfix);
}
/*
* +15: length of _qse_httpd_mod_
* +2: _\0
*/
fullname_len = prefix_len + name_len + postfix_len;
mod = qse_httpd_allocmem (httpd, QSE_SIZEOF(*mod) + (name_len + 1 + fullname_len + 1 + 15 + name_len + 2) * QSE_SIZEOF(qse_char_t));
if (mod == QSE_NULL) return -1;
QSE_MEMSET (mod, 0, QSE_SIZEOF(*mod));
mod->name = mod + 1;
qse_strcpy (mod->name, name);
mod->name = (qse_char_t*)(mod + 1);
mod->fullname = mod->name + name_len + 1;
entry_point_name = mod->fullname + fullname_len + 1;
qse_strcpy (mod->name, name);
qse_strjoin (mod->fullname, prefix, name, postfix, QSE_NULL);
qse_strjoin (entry_point_name, QSE_T("_qse_httpd_mod_"), name, QSE_NULL);
printf ("%ls %ls %ls\n", mod->name, mod->fullname, entry_point_name);
if (httpd->opt.scb.mod.open (httpd, mod) <= -1)
{
printf ("FAIL => %ls %ls %ls\n", mod->name, mod->fullname, entry_point_name);
qse_httpd_freemem (httpd, mod);
return -1;
}
/* TODO: find init and execute it. if it fails, unload it. */
printf ("OK => %ls %ls %ls\n", mod->name, mod->fullname, entry_point_name);
/* attempt qse_httpd_mod_xxx */
load = httpd->opt.scb.mod.symbol (httpd, mod, &entry_point_name[1]);
if (!load)
{
/* attempt _qse_awk_mod_xxx */
load = httpd->opt.scb.mod.symbol (httpd, mod, &entry_point_name[0]);
if (!load)
{
/* attempt qse_awk_mod_xxx_ */
entry_point_name[15 + name_len] = QSE_T('_');
entry_point_name[15 + name_len + 1] = QSE_T('\0');
load = httpd->opt.scb.mod.symbol (httpd, mod, &entry_point_name[1]);
}
}
if (load == QSE_NULL || load (mod) <= -1)
{
httpd->opt.scb.mod.close (httpd, mod);
qse_httpd_freemem (httpd, mod);
return -1;
}
mod->next = httpd->modlist;
httpd->modlist = mod;
return 0;
}