X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/agedu/blobdiff_plain/1037e6859c407bcdc9352f638567e0b62b27bbfc..c47f39de1c2de25aa70a5f3040c531e6589420cf:/agedu.c diff --git a/agedu.c b/agedu.c index afaa556..fd8aaea 100644 --- a/agedu.c +++ b/agedu.c @@ -1354,6 +1354,28 @@ int main(int argc, char **argv) maxpathlen = trie_maxpathlen(mappedfile); pathbuf = snewn(maxpathlen, char); + if (!querydir || !gotdepth) { + /* + * Single output file. + */ + if (!querydir) { + cfg.uriformat = "/%|/%p/%|%|/%p"; + } else { + cfg.uriformat = NULL; + } + cfg.autoage = htmlautoagerange; + cfg.oldest = htmloldest; + cfg.newest = htmlnewest; + cfg.showfiles = showfiles; + } else { + cfg.uriformat = "/index.html%|/%/p.html"; + cfg.fileformat = "/index.html%|/%/p.html"; + cfg.autoage = htmlautoagerange; + cfg.oldest = htmloldest; + cfg.newest = htmlnewest; + cfg.showfiles = showfiles; + } + if (!querydir) { /* * If we're run in --cgi mode, read PATH_INFO to get @@ -1364,13 +1386,27 @@ int main(int argc, char **argv) if (!path_info) path_info = ""; + /* + * Parse the path. + */ + if (!html_parse_path(mappedfile, path_info, &cfg, &xi)) { + printf("Status: 404\nContent-type: text/html\n\n" + "" + "404 Not Found" + "" + "

400 Not Found

" + "

Invalid agedu pathname." + "\n"); + return 0; + } + /* - * Because we need relative links to go to the - * right place, it's important that our - * PATH_INFO should contain a slash right at the - * start, and no slashes anywhere else. + * If the path was parseable but not canonically + * expressed, return a redirect to the canonical + * version. */ - if (path_info[0] != '/') { + char *canonpath = html_format_path(mappedfile, &cfg, xi); + if (strcmp(canonpath, path_info)) { char *servername = getenv("SERVER_NAME"); char *scriptname = getenv("SCRIPT_NAME"); if (!servername || !scriptname) { @@ -1392,7 +1428,7 @@ int main(int argc, char **argv) return 0; } printf("Status: 301\n" - "Location: http://%s/%s/\n" + "Location: http://%s/%s%s\n" "Content-type: text/html\n\n" "" "301 Moved" @@ -1400,39 +1436,10 @@ int main(int argc, char **argv) "

301 Moved

" "

Moved." "\n", - servername, scriptname); - return 0; - } else if (strchr(path_info+1, '/')) { - printf("Status: 404\nContent-type: text/html\n\n" - "" - "404 Not Found" - "" - "

400 Not Found

" - "

Invalid agedu pathname." - "\n"); + servername, scriptname, canonpath); return 0; } - xi = atoi(path_info + 1); - if (xi >= trie_count(mappedfile)) { - printf("Status: 404\nContent-type: text/html\n\n" - "" - "404 Not Found" - "" - "

404 Not Found

" - "

This is not a valid pathname index." - "\n"); - return 0; - } else if (!index_has_root(mappedfile, xi)) { - printf("Status: 404\nContent-type: text/html\n\n" - "" - "404 Not Found" - "" - "

404 Not Found

" - "

Pathname index out of range." - "\n"); - return 0; - } } else { /* * In ordinary --html mode, process a query @@ -1468,16 +1475,6 @@ int main(int argc, char **argv) /* * Single output file. */ - if (!querydir) { - cfg.format = "%.0lu"; /* use crosslinks in --cgi mode */ - } else { - cfg.format = NULL; - } - cfg.rootpage = NULL; - cfg.autoage = htmlautoagerange; - cfg.oldest = htmloldest; - cfg.newest = htmlnewest; - cfg.showfiles = showfiles; html = html_query(mappedfile, xi, &cfg, 1); if (querydir && outfile != NULL) { FILE *fp = fopen(outfile, "w"); @@ -1527,12 +1524,6 @@ int main(int argc, char **argv) make_successor(pathbuf); xi2 = trie_before(mappedfile, pathbuf); - cfg.format = "%lu.html"; - cfg.rootpage = "index.html"; - cfg.autoage = htmlautoagerange; - cfg.oldest = htmloldest; - cfg.newest = htmlnewest; - cfg.showfiles = showfiles; if (html_dump(mappedfile, xi, xi2, depth, &cfg, prefix)) return 1; } @@ -1597,8 +1588,7 @@ int main(int argc, char **argv) dcfg.port = httpserverport; dcfg.closeoneof = closeoneof; dcfg.basicauthdata = httpauthdata; - pcfg.format = NULL; - pcfg.rootpage = NULL; + pcfg.uriformat = "/%|/%p/%|%|/%p"; pcfg.autoage = htmlautoagerange; pcfg.oldest = htmloldest; pcfg.newest = htmlnewest;