const char *root = cgit_rooturl();
size_t len = strlen(root);
if (len && root[len - 1] == '/')
const char *root = cgit_rooturl();
size_t len = strlen(root);
if (len && root[len - 1] == '/')
{
char *page, *shortrev, *fullrev, *name;
{
char *page, *shortrev, *fullrev, *name;
htmlf("Content-Type: %s\n", ctx.page.mimetype);
if (ctx.page.size)
htmlf("Content-Length: %zd\n", ctx.page.size);
htmlf("Content-Type: %s\n", ctx.page.mimetype);
if (ctx.page.size)
htmlf("Content-Length: %zd\n", ctx.page.size);
- if (ctx.page.filename)
- htmlf("Content-Disposition: inline; filename=\"%s\"\n",
- ctx.page.filename);
+ if (ctx.page.filename) {
+ html("Content-Disposition: inline; filename=\"");
+ html_header_arg_in_quotes(ctx.page.filename);
+ html("\"\n");
+ }
if (!ctx.env.authenticated)
html("Cache-Control: no-cache, no-store\n");
htmlf("Last-Modified: %s\n", http_date(ctx.page.modified));
if (!ctx.env.authenticated)
html("Cache-Control: no-cache, no-store\n");
htmlf("Last-Modified: %s\n", http_date(ctx.page.modified));
void cgit_redirect(const char *url, bool permanent)
{
htmlf("Status: %d %s\n", permanent ? 301 : 302, permanent ? "Moved" : "Found");
void cgit_redirect(const char *url, bool permanent)
{
htmlf("Status: %d %s\n", permanent ? 301 : 302, permanent ? "Moved" : "Found");
struct strbuf sb = STRBUF_INIT;
strbuf_addf(&sb, "h=%s", ctx.qry.head);
html("<link rel='alternate' title='Atom feed' href='");
html(cgit_httpscheme());
struct strbuf sb = STRBUF_INIT;
strbuf_addf(&sb, "h=%s", ctx.qry.head);
html("<link rel='alternate' title='Atom feed' href='");
html(cgit_httpscheme());
- html_attr(cgit_hosturl());
- html_attr(cgit_fileurl(ctx.repo->url, "atom", ctx.qry.vpath,
- sb.buf));
+ html_attr(host);
+ fileurl = cgit_fileurl(ctx.repo->url, "atom", ctx.qry.vpath,
+ sb.buf);
+ html_attr(fileurl);
void cgit_print_error_page(int code, const char *msg, const char *fmt, ...)
{
va_list ap;
void cgit_print_error_page(int code, const char *msg, const char *fmt, ...)
{
va_list ap;
static void add_clone_urls(void (*fn)(const char *), char *txt, char *suffix)
{
struct strbuf **url_list = strbuf_split_str(txt, ' ', 0);
static void add_clone_urls(void (*fn)(const char *), char *txt, char *suffix)
{
struct strbuf **url_list = strbuf_split_str(txt, ' ', 0);
ctx.qry.head, ctx.qry.vpath);
html("</td><td class='form'>");
html("<form class='right' method='get' action='");
ctx.qry.head, ctx.qry.vpath);
html("</td><td class='form'>");
html("<form class='right' method='get' action='");
- if (ctx.cfg.virtual_root)
- html_url_path(cgit_fileurl(ctx.qry.repo, "log",
- ctx.qry.vpath, NULL));
+ if (ctx.cfg.virtual_root) {
+ char *fileurl = cgit_fileurl(ctx.qry.repo, "log",
+ ctx.qry.vpath, NULL);
+ html_url_path(fileurl);
+ free(fileurl);
+ }
html("'>\n");
cgit_add_hidden_formfields(1, 0, "log");
html("<select name='qt'>\n");
html("'>\n");
cgit_add_hidden_formfields(1, 0, "log");
html("<select name='qt'>\n");
site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0, 1);
if (ctx.cfg.root_readme)
site_link("about", "about", NULL, hc("about"),
NULL, NULL, 0, 1);
html("</td><td class='form'>");
html("<form method='get' action='");
site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0, 1);
if (ctx.cfg.root_readme)
site_link("about", "about", NULL, hc("about"),
NULL, NULL, 0, 1);
html("</td><td class='form'>");
html("<form method='get' action='");
html("'>\n");
html("<input type='text' name='q' size='10' value='");
html_attr(ctx.qry.search);
html("'/>\n");
html("<input type='submit' value='search'/>\n");
html("</form>");
html("'>\n");
html("<input type='text' name='q' size='10' value='");
html_attr(ctx.qry.search);
html("'/>\n");
html("<input type='submit' value='search'/>\n");
html("</form>");