Fri, 30 May 2025 16:37:54 +0200
add navigation to directory listing and improve css
--- a/src/server/safs/service.c Fri May 30 15:00:05 2025 +0200 +++ b/src/server/safs/service.c Fri May 30 16:37:54 2025 +0200 @@ -826,7 +826,15 @@ const CxAllocator *a = pool_allocator(sn->pool); char *path = pblock_findkeyval(pb_key_path, rq->vars); - char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); + cxstring uri = cx_str(pblock_findkeyval(pb_key_uri, rq->reqpb)); + if(uri.length == 0) { + return REQ_ABORTED; + } + if(uri.ptr[uri.length-1] != '/') { + cxmutstr newuri = cx_strcat_a(a, 2, uri, CX_STR("/")); + uri = cx_strcast(newuri); + } + // params char *useemojis = pblock_findval("use-emojis", pb); @@ -871,16 +879,35 @@ // write html header sbuf_puts(out, "<!DOCTYPE html>\n<html>\n<head>\n<title>Index of "); - sbuf_puts(out, uri); + sbuf_append(out, uri); sbuf_puts(out, "</title>\n"); sbuf_puts(out, "<style>\n"); + sbuf_puts(out, "body { font-family: sans; }\n"); + sbuf_puts(out, "h1 { font-size: 1.1em; }\n"); sbuf_puts(out, "th { text-align: left; }\n"); sbuf_puts(out, "td { padding-right: 2em; }\n"); + sbuf_puts(out, "a { text-decoration: none; }\n"); sbuf_puts(out, ".type { padding-right: 0em; }\n"); + sbuf_puts(out, ".path { background-color: #e0e0e0; border-radius: 0.5em; padding: 0.25em 0.75em 0.25em 0.75em; }"); sbuf_puts(out, "</style>\n"); - sbuf_puts(out, "</head><body>\n<h1>Index of "); - sbuf_puts(out, uri); - sbuf_puts(out, "</h1><hr>\n\n"); + sbuf_puts(out, "</head><body><h1>"); + + if(uri.length > 0) { + sbuf_puts(out, "<span class=\"path\"><a href=\"/\">/</a></span>\n"); + size_t start = 1; + for(size_t i=1;i<uri.length;i++) { + if(uri.ptr[i] == '/') { + sbuf_puts(out, "<span class=\"path\"><a href=\""); + sbuf_write(out, uri.ptr, i); + sbuf_puts(out, "\">"); + sbuf_write(out, uri.ptr+start, i-start); + sbuf_puts(out, "</a></span>\n"); + start = i+1; + } + } + } + + sbuf_puts(out, "</h1><hr>"); // read directory at store entries in the files list int ret = REQ_PROCEED; @@ -927,6 +954,7 @@ sbuf_puts(out, "<td>"); sbuf_puts(out, "<a href=\""); + sbuf_append(out, uri); sbuf_puts(out, entry->name); sbuf_puts(out, "\">"); sbuf_puts(out, entry->name);
--- a/src/server/util/strbuf.c Fri May 30 15:00:05 2025 +0200 +++ b/src/server/util/strbuf.c Fri May 30 16:37:54 2025 +0200 @@ -46,7 +46,7 @@ return buf; } -void sbuf_puts(sbuf_t *buf, char *str) { +void sbuf_puts(sbuf_t *buf, const char *str) { sbuf_append(buf, cx_str(str)); } @@ -54,6 +54,10 @@ sbuf_append(buf, (cxstring){&chr, 1}); } +void sbuf_write(sbuf_t *buf, const char *str, size_t length) { + sbuf_append(buf, cx_strn(str, length)); +} + void sbuf_append(sbuf_t *buf, cxstring str) { if (buf->length + str.length >= buf->size) { buf->size *= 2;
--- a/src/server/util/strbuf.h Fri May 30 15:00:05 2025 +0200 +++ b/src/server/util/strbuf.h Fri May 30 16:37:54 2025 +0200 @@ -44,7 +44,9 @@ sbuf_t* sbuf_new(size_t size); -void sbuf_puts(sbuf_t *buf, char *str); +void sbuf_puts(sbuf_t *buf, const char *str); + +void sbuf_write(sbuf_t *buf, const char *str, size_t length); void sbuf_put(sbuf_t *buf, char chr);