Teach cgit how to use PATH_INFO

This commit makes cgit use the cgi variables SCRIPT_NAME and PATH_INFO
when virtual-root is unspecified in cgitrc and no url-parameter is
specified on the querystring. This has two nice effects:

* Virtual urls works out of the box, no more need for rewrite-rules in httpd.
* Virtual urls with special querystring characters are handled correctly.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2008-08-09 21:11:41 +02:00
parent a30453a5d3
commit e154edd807
2 changed files with 28 additions and 0 deletions

27
cgit.c
View File

@ -130,6 +130,7 @@ static void querystring_cb(const char *name, const char *value)
} else if (!strcmp(name, "p")) { } else if (!strcmp(name, "p")) {
ctx.qry.page = xstrdup(value); ctx.qry.page = xstrdup(value);
} else if (!strcmp(name, "url")) { } else if (!strcmp(name, "url")) {
ctx.qry.url = xstrdup(value);
cgit_parse_url(value); cgit_parse_url(value);
} else if (!strcmp(name, "qt")) { } else if (!strcmp(name, "qt")) {
ctx.qry.grep = xstrdup(value); ctx.qry.grep = xstrdup(value);
@ -373,6 +374,8 @@ static int calc_ttl()
int main(int argc, const char **argv) int main(int argc, const char **argv)
{ {
const char *cgit_config_env = getenv("CGIT_CONFIG"); const char *cgit_config_env = getenv("CGIT_CONFIG");
const char *path;
char *qry;
int err, ttl; int err, ttl;
prepare_context(&ctx); prepare_context(&ctx);
@ -390,6 +393,30 @@ int main(int argc, const char **argv)
cgit_parse_args(argc, argv); cgit_parse_args(argc, argv);
http_parse_querystring(ctx.qry.raw, querystring_cb); http_parse_querystring(ctx.qry.raw, querystring_cb);
/* If virtual-root isn't specified in cgitrc and no url
* parameter is specified on the querystring, lets pretend
* that virtualroot equals SCRIPT_NAME and use PATH_INFO as
* url. This allows cgit to work with virtual urls without
* the need for rewriterules in the webserver (as long as
* PATH_INFO is included in the cache lookup key).
*/
if (!ctx.cfg.virtual_root && !ctx.qry.url) {
ctx.cfg.virtual_root = ctx.cfg.script_name;
path = getenv("PATH_INFO");
if (path) {
if (path[0] == '/')
path++;
ctx.qry.url = xstrdup(path);
if (ctx.qry.raw) {
qry = ctx.qry.raw;
ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry));
free(qry);
} else
ctx.qry.raw = ctx.qry.url;
cgit_parse_url(ctx.qry.url);
}
}
ttl = calc_ttl(); ttl = calc_ttl();
ctx.page.expires += ttl*60; ctx.page.expires += ttl*60;
if (ctx.cfg.nocache) if (ctx.cfg.nocache)

1
cgit.h
View File

@ -118,6 +118,7 @@ struct cgit_query {
char *path; char *path;
char *name; char *name;
char *mimetype; char *mimetype;
char *url;
int ofs; int ofs;
}; };