Index | Thread | Search

From:
Andrew Kloet <andrew@kloet.net>
Subject:
PATCH: httpd: support gzip-static for directory index files
To:
tech@openbsd.org
Date:
Sun, 25 Jan 2026 14:10:58 -0500

Download raw body.

Thread
  • Andrew Kloet:

    PATCH: httpd: support gzip-static for directory index files

Hello,

Currently, when gzip-static is enabled in httpd.conf, it does not work
for directory index files when the full path is not given.
(e.g., http://example.com/ instead of http://example.com/index.html).

This problem was previously reported in 2023:
https://marc.info/?l=openbsd-misc&m=169957389612286&w=2

The issue is in server_file_access(). When a directory is requested, the
function appends the index name and calls itself recursively. If the
recursive call finds a .gz file, it correctly sets up the response
headers and file descriptor. However, the parent call continues to
process the directory logic, fails to immediately propagate the
successful return code without further side effects, and handles the
directory file descriptor in a way that interferes with the final
response

The following patch ensures that the result of the recursive index
lookup is propagated.

Index: usr.sbin/httpd/server_file.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_file.c,v
diff -u -p -u -p -r1.80 server_file.c
--- usr.sbin/httpd/server_file.c        29 Apr 2024 16:17:46 -0000      1.80
+++ usr.sbin/httpd/server_file.c        25 Jan 2026 18:53:31 -0000
@@ -135,21 +135,14 @@ server_file_access(struct httpd *env, st
                 }

                 ret = server_file_access(env, clt, path, len);
-               if (ret == 404) {
-                       /*
-                        * Index file not found; fail if auto-indexing is
-                        * not enabled, otherwise return success but
-                        * indicate directory with S_ISDIR of the previous
-                        * stat.
-                        */
-                       if ((srv_conf->flags & SRVFLAG_AUTO_INDEX) == 0) {
-                               close(fd);
-                               return (403);
-                       }
-
+               if (ret == 404 && (srv_conf->flags & SRVFLAG_AUTO_INDEX)) {
+                       /* Use the existing directory fd for indexing */
                         return (server_file_index(env, clt, fd, &st));
                 }
+
                 close(fd);
+               if (ret == 404)
+                       return (403);
                 return (ret);
         } else if (!S_ISREG(st.st_mode)) {
                 /* Don't follow symlinks and ignore special files */