diff -r a5339182e67f -r 94c01980e3e5 src/server/safs/service.c --- 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, "\n\n\nIndex of "); - sbuf_puts(out, uri); + sbuf_append(out, uri); sbuf_puts(out, "\n"); sbuf_puts(out, "\n"); - sbuf_puts(out, "\n

Index of "); - sbuf_puts(out, uri); - sbuf_puts(out, "


\n\n"); + sbuf_puts(out, "

"); + + if(uri.length > 0) { + sbuf_puts(out, "/\n"); + size_t start = 1; + for(size_t i=1;i"); + sbuf_write(out, uri.ptr+start, i-start); + sbuf_puts(out, "\n"); + start = i+1; + } + } + } + + sbuf_puts(out, "


"); // read directory at store entries in the files list int ret = REQ_PROCEED; @@ -927,6 +954,7 @@ sbuf_puts(out, ""); sbuf_puts(out, "name); sbuf_puts(out, "\">"); sbuf_puts(out, entry->name);