added qse_httpd_serverstd_root_t

This commit is contained in:
2013-02-21 15:49:49 +00:00
parent b420a7c0dc
commit 779d7bc375
5 changed files with 61 additions and 30 deletions

View File

@ -33,7 +33,7 @@ struct task_cgi_arg_t
qse_mcstr_t path;
qse_mcstr_t script;
qse_mcstr_t suffix;
qse_mcstr_t docroot;
qse_mcstr_t root;
qse_mcstr_t shebang;
int nph;
qse_htre_t* req;
@ -48,7 +48,7 @@ struct task_cgi_t
const qse_mchar_t* path;
const qse_mchar_t* script;
const qse_mchar_t* suffix;
const qse_mchar_t* docroot;
const qse_mchar_t* root;
const qse_mchar_t* shebang;
qse_http_version_t version;
int keepalive; /* taken from the request */
@ -427,7 +427,7 @@ static int cgi_add_env (
const qse_mchar_t* path,
const qse_mchar_t* script,
const qse_mchar_t* suffix,
const qse_mchar_t* docroot,
const qse_mchar_t* root,
const qse_mchar_t* content_type,
qse_size_t content_length,
int chunked)
@ -455,13 +455,13 @@ static int cgi_add_env (
qse_env_insertmbs (env, QSE_MT("SCRIPT_FILENAME"), path);
qse_env_insertmbs (env, QSE_MT("SCRIPT_NAME"), script);
qse_env_insertmbs (env, QSE_MT("DOCUMENT_ROOT"), docroot);
qse_env_insertmbs (env, QSE_MT("DOCUMENT_ROOT"), root);
if (suffix && suffix[0] != QSE_MT('\0'))
{
const qse_mchar_t* tmp[3];
qse_mchar_t* tr;
tmp[0] = docroot;
tmp[0] = root;
tmp[1] = suffix;
tmp[2] = QSE_NULL;
@ -738,12 +738,12 @@ static int task_init_cgi (
cgi->path = (qse_mchar_t*)(cgi + 1);
cgi->script = cgi->path + arg->path.len + 1;
cgi->suffix = cgi->script + arg->script.len + 1;
cgi->docroot = cgi->suffix + arg->suffix.len + 1;
cgi->shebang = cgi->docroot + arg->docroot.len + 1;
cgi->root = cgi->suffix + arg->suffix.len + 1;
cgi->shebang = cgi->root + arg->root.len + 1;
qse_mbscpy ((qse_mchar_t*)cgi->path, arg->path.ptr);
qse_mbscpy ((qse_mchar_t*)cgi->script, arg->script.ptr);
qse_mbscpy ((qse_mchar_t*)cgi->suffix, arg->suffix.ptr);
qse_mbscpy ((qse_mchar_t*)cgi->docroot, arg->docroot.ptr);
qse_mbscpy ((qse_mchar_t*)cgi->root, arg->root.ptr);
qse_mbscpy ((qse_mchar_t*)cgi->shebang, arg->shebang.ptr);
cgi->version = *qse_htre_getversion(arg->req);
@ -884,7 +884,7 @@ done:
if (cgi_add_env (
httpd, client, cgi->env, arg->req,
cgi->path, cgi->script, cgi->suffix, cgi->docroot,
cgi->path, cgi->script, cgi->suffix, cgi->root,
(tmp? tmp->ptr: QSE_NULL), content_length,
(cgi->reqflags & CGI_REQ_FWDCHUNKED)) <= -1)
{
@ -1523,7 +1523,7 @@ qse_httpd_task_t* qse_httpd_entaskcgi (
rsrc = *cgi;
if (rsrc.script == QSE_NULL) rsrc.script = qse_htre_getqpath(req);
if (rsrc.suffix == QSE_NULL) rsrc.suffix = QSE_MT("");
if (rsrc.docroot == QSE_NULL) rsrc.docroot = QSE_MT("");
if (rsrc.root == QSE_NULL) rsrc.root = QSE_MT("");
if (rsrc.shebang == QSE_NULL) rsrc.shebang = QSE_MT("");
arg.path.ptr = rsrc.path;
@ -1532,8 +1532,8 @@ qse_httpd_task_t* qse_httpd_entaskcgi (
arg.script.len = qse_mbslen(rsrc.script);
arg.suffix.ptr = rsrc.suffix;
arg.suffix.len = qse_mbslen(rsrc.suffix);
arg.docroot.ptr = rsrc.docroot;
arg.docroot.len = qse_mbslen(rsrc.docroot);
arg.root.ptr = rsrc.root;
arg.root.len = qse_mbslen(rsrc.root);
arg.nph = rsrc.nph;
arg.shebang.ptr = rsrc.shebang;
arg.shebang.len = qse_mbslen(rsrc.shebang);
@ -1551,7 +1551,7 @@ qse_httpd_task_t* qse_httpd_entaskcgi (
((arg.path.len + 1) * QSE_SIZEOF(*arg.path.ptr)) +
((arg.script.len + 1) * QSE_SIZEOF(*arg.script.ptr)) +
((arg.suffix.len + 1) * QSE_SIZEOF(*arg.suffix.ptr)) +
((arg.docroot.len + 1) * QSE_SIZEOF(*arg.docroot.ptr)) +
((arg.root.len + 1) * QSE_SIZEOF(*arg.root.ptr)) +
((arg.shebang.len + 1) * QSE_SIZEOF(*arg.shebang.ptr))
);
}

View File

@ -2239,7 +2239,7 @@ struct rsrc_tmp_t
const qse_mchar_t* idxfile;
qse_mchar_t* xpath;
const qse_mchar_t* docroot;
qse_httpd_serverstd_root_t root;
const qse_mchar_t* realm;
const qse_mchar_t* auth;
qse_httpd_serverstd_index_t index;
@ -2261,7 +2261,7 @@ static int attempt_cgi (
if (tmp->final_match)
{
/* it is a final match. tmp->xpath is tmp->docroot + tmp->qpath */
/* it is a final match. tmp->xpath is tmp->root + tmp->qpath */
if (server_xtn->query (httpd, client->server, req, tmp->xpath, QSE_HTTPD_SERVERSTD_CGI, &cgi) >= 0 && cgi.cgi)
{
if (tmp->idxfile)
@ -2304,7 +2304,7 @@ static int attempt_cgi (
*
* tmp->xpath should be large enough to hold the merge path made of
* the subsegments of the original query path and docroot. */
merge_paths_to_buf (httpd, tmp->docroot, tmp->qpath, slash - tmp->qpath, tmp->xpath);
merge_paths_to_buf (httpd, tmp->root.u.path, tmp->qpath, slash - tmp->qpath, tmp->xpath);
xpath_changed = 1;
stx = stat_file (httpd, tmp->xpath, &st, 0);
@ -2346,7 +2346,7 @@ static int attempt_cgi (
}
/* restore the xpath because it has changed... */
if (xpath_changed) merge_paths_to_buf (httpd, tmp->docroot, tmp->qpath, (qse_size_t)-1, tmp->xpath);
if (xpath_changed) merge_paths_to_buf (httpd, tmp->root.u.path, tmp->qpath, (qse_size_t)-1, tmp->xpath);
}
return 0; /* not a cgi */
@ -2357,7 +2357,7 @@ bingo:
target->u.cgi.path = tmp->xpath;
target->u.cgi.script = script;
target->u.cgi.suffix = suffix;
target->u.cgi.docroot = tmp->docroot;
target->u.cgi.root = tmp->root.u.path;
target->u.cgi.shebang = shebang;
return 1;
@ -2386,7 +2386,18 @@ static int make_resource (
server_xtn = qse_httpd_getserverxtn (httpd, client->server);
if (server_xtn->query (httpd, client->server, req, tmp.xpath, QSE_HTTPD_SERVERSTD_DOCROOT, &tmp.docroot) <= -1) return -1;
if (server_xtn->query (httpd, client->server, req, tmp.xpath, QSE_HTTPD_SERVERSTD_ROOT, &tmp.root) <= -1) return -1;
if (tmp.root.type == QSE_HTTPD_SERVERSTD_ROOT_NWAD)
{
/* proxy the request */
target->type = QSE_HTTPD_RSRC_PROXY;
/*target->u.proxy.dst = client->orgdst_addr;*/
target->u.proxy.dst = tmp.root.u.nwad;
target->u.proxy.src = client->remote_addr;
return 0;
}
QSE_ASSERT (tmp.root.type == QSE_HTTPD_SERVERSTD_ROOT_PATH);
if (server_xtn->query (httpd, client->server, req, tmp.xpath, QSE_HTTPD_SERVERSTD_REALM, &tmp.realm) <= -1 ||
server_xtn->query (httpd, client->server, req, tmp.xpath, QSE_HTTPD_SERVERSTD_AUTH, &tmp.auth) <= -1 ||
@ -2396,7 +2407,7 @@ static int make_resource (
}
/* default to the root directory. */
if (!tmp.docroot) tmp.docroot = QSE_MT("/");
if (!tmp.root.u.path) tmp.root.u.path = QSE_MT("/");
if (tmp.realm && tmp.auth)
{
@ -2438,7 +2449,7 @@ static int make_resource (
}
auth_ok:
tmp.xpath = merge_paths (httpd, tmp.docroot, tmp.qpath);
tmp.xpath = merge_paths (httpd, tmp.root.u.path, tmp.qpath);
if (tmp.xpath == QSE_NULL) return -1;
stx = stat_file (httpd, tmp.xpath, &st, 0);
@ -2601,7 +2612,14 @@ static int query_server (
switch (code)
{
case QSE_HTTPD_SERVERSTD_NAME:
case QSE_HTTPD_SERVERSTD_DOCROOT:
*(const qse_mchar_t**)result = QSE_NULL;
break;
case QSE_HTTPD_SERVERSTD_ROOT:
((qse_httpd_serverstd_root_t*)result)->type = QSE_HTTPD_SERVERSTD_ROOT_PATH;
((qse_httpd_serverstd_root_t*)result)->u.path = QSE_NULL;
break;
case QSE_HTTPD_SERVERSTD_REALM:
case QSE_HTTPD_SERVERSTD_AUTH:
case QSE_HTTPD_SERVERSTD_ERRCSS: