author | Lars Hjemli <hjemli@gmail.com> | 2009-08-20 08:07:51 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2009-08-20 08:07:51 (UTC) |
commit | 0374a76ce10e50a803df21288888edd4d26a14a9 (patch) (unidiff) | |
tree | c6bfb9ba79d44b010bd63fecf061af9bbeb39134 | |
parent | e16f1783346a090e4ea1194dcaae7f03e813f6a2 (diff) | |
download | cgit-0374a76ce10e50a803df21288888edd4d26a14a9.zip cgit-0374a76ce10e50a803df21288888edd4d26a14a9.tar.gz cgit-0374a76ce10e50a803df21288888edd4d26a14a9.tar.bz2 |
cgit.c: fix caching keyed on PATH_INFO with no QUERY_STRING
When generating a hash for caching, ctx.qry.raw is used as key. And
since cgit_parse_url() zero-terminates it's argument (after the repo
path), ctx.qry.raw must xstrdup(ctx.qry.url).
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -478,81 +478,81 @@ static void cgit_parse_args(int argc, const char **argv) | |||
478 | } | 478 | } |
479 | } | 479 | } |
480 | if (scan) { | 480 | if (scan) { |
481 | qsort(cgit_repolist.repos, cgit_repolist.count, | 481 | qsort(cgit_repolist.repos, cgit_repolist.count, |
482 | sizeof(struct cgit_repo), cmp_repos); | 482 | sizeof(struct cgit_repo), cmp_repos); |
483 | print_repolist(&cgit_repolist); | 483 | print_repolist(&cgit_repolist); |
484 | exit(0); | 484 | exit(0); |
485 | } | 485 | } |
486 | } | 486 | } |
487 | 487 | ||
488 | static int calc_ttl() | 488 | static int calc_ttl() |
489 | { | 489 | { |
490 | if (!ctx.repo) | 490 | if (!ctx.repo) |
491 | return ctx.cfg.cache_root_ttl; | 491 | return ctx.cfg.cache_root_ttl; |
492 | 492 | ||
493 | if (!ctx.qry.page) | 493 | if (!ctx.qry.page) |
494 | return ctx.cfg.cache_repo_ttl; | 494 | return ctx.cfg.cache_repo_ttl; |
495 | 495 | ||
496 | if (ctx.qry.has_symref) | 496 | if (ctx.qry.has_symref) |
497 | return ctx.cfg.cache_dynamic_ttl; | 497 | return ctx.cfg.cache_dynamic_ttl; |
498 | 498 | ||
499 | if (ctx.qry.has_sha1) | 499 | if (ctx.qry.has_sha1) |
500 | return ctx.cfg.cache_static_ttl; | 500 | return ctx.cfg.cache_static_ttl; |
501 | 501 | ||
502 | return ctx.cfg.cache_repo_ttl; | 502 | return ctx.cfg.cache_repo_ttl; |
503 | } | 503 | } |
504 | 504 | ||
505 | int main(int argc, const char **argv) | 505 | int main(int argc, const char **argv) |
506 | { | 506 | { |
507 | const char *path; | 507 | const char *path; |
508 | char *qry; | 508 | char *qry; |
509 | int err, ttl; | 509 | int err, ttl; |
510 | 510 | ||
511 | prepare_context(&ctx); | 511 | prepare_context(&ctx); |
512 | cgit_repolist.length = 0; | 512 | cgit_repolist.length = 0; |
513 | cgit_repolist.count = 0; | 513 | cgit_repolist.count = 0; |
514 | cgit_repolist.repos = NULL; | 514 | cgit_repolist.repos = NULL; |
515 | 515 | ||
516 | cgit_parse_args(argc, argv); | 516 | cgit_parse_args(argc, argv); |
517 | parse_configfile(ctx.env.cgit_config, config_cb); | 517 | parse_configfile(ctx.env.cgit_config, config_cb); |
518 | ctx.repo = NULL; | 518 | ctx.repo = NULL; |
519 | http_parse_querystring(ctx.qry.raw, querystring_cb); | 519 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
520 | 520 | ||
521 | /* If virtual-root isn't specified in cgitrc, lets pretend | 521 | /* If virtual-root isn't specified in cgitrc, lets pretend |
522 | * that virtual-root equals SCRIPT_NAME. | 522 | * that virtual-root equals SCRIPT_NAME. |
523 | */ | 523 | */ |
524 | if (!ctx.cfg.virtual_root) | 524 | if (!ctx.cfg.virtual_root) |
525 | ctx.cfg.virtual_root = ctx.cfg.script_name; | 525 | ctx.cfg.virtual_root = ctx.cfg.script_name; |
526 | 526 | ||
527 | /* If no url parameter is specified on the querystring, lets | 527 | /* If no url parameter is specified on the querystring, lets |
528 | * use PATH_INFO as url. This allows cgit to work with virtual | 528 | * use PATH_INFO as url. This allows cgit to work with virtual |
529 | * urls without the need for rewriterules in the webserver (as | 529 | * urls without the need for rewriterules in the webserver (as |
530 | * long as PATH_INFO is included in the cache lookup key). | 530 | * long as PATH_INFO is included in the cache lookup key). |
531 | */ | 531 | */ |
532 | path = ctx.env.path_info; | 532 | path = ctx.env.path_info; |
533 | if (!ctx.qry.url && path) { | 533 | if (!ctx.qry.url && path) { |
534 | if (path[0] == '/') | 534 | if (path[0] == '/') |
535 | path++; | 535 | path++; |
536 | ctx.qry.url = xstrdup(path); | 536 | ctx.qry.url = xstrdup(path); |
537 | if (ctx.qry.raw) { | 537 | if (ctx.qry.raw) { |
538 | qry = ctx.qry.raw; | 538 | qry = ctx.qry.raw; |
539 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); | 539 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); |
540 | free(qry); | 540 | free(qry); |
541 | } else | 541 | } else |
542 | ctx.qry.raw = ctx.qry.url; | 542 | ctx.qry.raw = xstrdup(ctx.qry.url); |
543 | cgit_parse_url(ctx.qry.url); | 543 | cgit_parse_url(ctx.qry.url); |
544 | } | 544 | } |
545 | 545 | ||
546 | ttl = calc_ttl(); | 546 | ttl = calc_ttl(); |
547 | ctx.page.expires += ttl*60; | 547 | ctx.page.expires += ttl*60; |
548 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) | 548 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) |
549 | ctx.cfg.nocache = 1; | 549 | ctx.cfg.nocache = 1; |
550 | if (ctx.cfg.nocache) | 550 | if (ctx.cfg.nocache) |
551 | ctx.cfg.cache_size = 0; | 551 | ctx.cfg.cache_size = 0; |
552 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, | 552 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
553 | ctx.qry.raw, ttl, process_request, &ctx); | 553 | ctx.qry.raw, ttl, process_request, &ctx); |
554 | if (err) | 554 | if (err) |
555 | cgit_print_error(fmt("Error processing page: %s (%d)", | 555 | cgit_print_error(fmt("Error processing page: %s (%d)", |
556 | strerror(err), err)); | 556 | strerror(err), err)); |
557 | return err; | 557 | return err; |
558 | } | 558 | } |