summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2009-08-20 08:07:51 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-08-20 08:07:51 (UTC)
commit0374a76ce10e50a803df21288888edd4d26a14a9 (patch) (unidiff)
treec6bfb9ba79d44b010bd63fecf061af9bbeb39134
parente16f1783346a090e4ea1194dcaae7f03e813f6a2 (diff)
downloadcgit-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>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index 5816f3d..b0e1c44 100644
--- a/cgit.c
+++ b/cgit.c
@@ -446,113 +446,113 @@ static void cgit_parse_args(int argc, const char **argv)
446 if (!strncmp(argv[i], "--cache=", 8)) { 446 if (!strncmp(argv[i], "--cache=", 8)) {
447 ctx.cfg.cache_root = xstrdup(argv[i]+8); 447 ctx.cfg.cache_root = xstrdup(argv[i]+8);
448 } 448 }
449 if (!strcmp(argv[i], "--nocache")) { 449 if (!strcmp(argv[i], "--nocache")) {
450 ctx.cfg.nocache = 1; 450 ctx.cfg.nocache = 1;
451 } 451 }
452 if (!strcmp(argv[i], "--nohttp")) { 452 if (!strcmp(argv[i], "--nohttp")) {
453 ctx.env.no_http = "1"; 453 ctx.env.no_http = "1";
454 } 454 }
455 if (!strncmp(argv[i], "--query=", 8)) { 455 if (!strncmp(argv[i], "--query=", 8)) {
456 ctx.qry.raw = xstrdup(argv[i]+8); 456 ctx.qry.raw = xstrdup(argv[i]+8);
457 } 457 }
458 if (!strncmp(argv[i], "--repo=", 7)) { 458 if (!strncmp(argv[i], "--repo=", 7)) {
459 ctx.qry.repo = xstrdup(argv[i]+7); 459 ctx.qry.repo = xstrdup(argv[i]+7);
460 } 460 }
461 if (!strncmp(argv[i], "--page=", 7)) { 461 if (!strncmp(argv[i], "--page=", 7)) {
462 ctx.qry.page = xstrdup(argv[i]+7); 462 ctx.qry.page = xstrdup(argv[i]+7);
463 } 463 }
464 if (!strncmp(argv[i], "--head=", 7)) { 464 if (!strncmp(argv[i], "--head=", 7)) {
465 ctx.qry.head = xstrdup(argv[i]+7); 465 ctx.qry.head = xstrdup(argv[i]+7);
466 ctx.qry.has_symref = 1; 466 ctx.qry.has_symref = 1;
467 } 467 }
468 if (!strncmp(argv[i], "--sha1=", 7)) { 468 if (!strncmp(argv[i], "--sha1=", 7)) {
469 ctx.qry.sha1 = xstrdup(argv[i]+7); 469 ctx.qry.sha1 = xstrdup(argv[i]+7);
470 ctx.qry.has_sha1 = 1; 470 ctx.qry.has_sha1 = 1;
471 } 471 }
472 if (!strncmp(argv[i], "--ofs=", 6)) { 472 if (!strncmp(argv[i], "--ofs=", 6)) {
473 ctx.qry.ofs = atoi(argv[i]+6); 473 ctx.qry.ofs = atoi(argv[i]+6);
474 } 474 }
475 if (!strncmp(argv[i], "--scan-tree=", 12)) { 475 if (!strncmp(argv[i], "--scan-tree=", 12)) {
476 scan++; 476 scan++;
477 scan_tree(argv[i] + 12); 477 scan_tree(argv[i] + 12);
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
488static int calc_ttl() 488static 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
505int main(int argc, const char **argv) 505int 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}