Skip to content

Commit a289999

Browse files
feat(modules): autoindex.c
Signed-off-by: Ar Rakin <rakinar2@onesoftnet.eu.org>
1 parent d11dd77 commit a289999

13 files changed

Lines changed: 503 additions & 74 deletions

File tree

configure.ac

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,13 @@ AC_CONFIG_FILES([Makefile
155155
src/event/Makefile
156156
src/hash/Makefile
157157
src/mm/Makefile
158-
src/http/Makefile
159-
src/digest/Makefile
158+
src/http/Makefile
159+
src/digest/Makefile
160160
src/include/Makefile
161161
src/log/Makefile
162162
src/utils/Makefile
163163
src/router/Makefile
164+
src/modules/Makefile
164165
doc/Makefile
165166
man/Makefile
166167
conf/Makefile

res/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# You should have received a copy of the GNU Affero General Public License
1616
# along with OSN freehttpd. If not, see <https://www.gnu.org/licenses/>.
1717

18-
RESOURCES = index.html error.html
18+
RESOURCES = index_start.html index_end.html error.html
1919
CLEANFILE = resources.c resources.h
2020
BUILT_SOURCES = resources.c resources.h
2121

res/error.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ <h1>%d %s</h1>
2222
<p>%s</p>
2323
<hr />
2424
<address>
25-
freehttpd/1.0.0-alpha.2 server running at %.*s on port %u
25+
freehttpd/2.0.0-alpha.1 server running at %.*s on port %u
2626
</address>
2727
</body>
2828
</html>

res/index_end.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
%zx%c%c </tbody>
2+
<tfoot>
3+
<tr>
4+
<td colspan="4">
5+
<hr />
6+
</td>
7+
</tr>
8+
</tfoot>
9+
</table>
10+
<address>
11+
freehttpd/2.0.0-alpha.1 server running at %.*s on port %u
12+
</address>
13+
</body>
14+
</html>
15+
16+
%c%c

res/index.html renamed to res/index_start.html

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!DOCTYPE html>
1+
%zx%c%c<!DOCTYPE html>
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8" />
@@ -65,13 +65,13 @@
6565
}
6666
}
6767
</style>
68-
<title>Index of %s</title>
69-
<meta name="description" content="Directory indexing for %s" />
68+
<title>Index of %.*s</title>
69+
<meta name="description" content="Directory indexing for %.*s" />
7070
<meta name="theme-color" content="#fb0000" />
7171
</head>
7272
<body>
7373
<div id="heading">
74-
<h1>Index of %s</h1>
74+
<h1>Index of %.*s</h1>
7575
<img id="pb_img" src="data:image/png;base64,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" />
7676
</div>
7777
<table>
@@ -88,20 +88,4 @@ <h1>Index of %s</h1>
8888
</th>
8989
</tr>
9090
</thead>
91-
<tbody>
92-
%s
93-
</tbody>
94-
<tfoot>
95-
<tr>
96-
<td colspan="4">
97-
<hr />
98-
</td>
99-
</tr>
100-
</tfoot>
101-
</table>
102-
<address>
103-
freehttpd/1.0.0-alpha.2 server running at %s on port %d
104-
</address>
105-
</body>
106-
</html>
107-
91+
<tbody>%c%c

src/Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# You should have received a copy of the GNU Affero General Public License
1616
# along with OSN freehttpd. If not, see <https://www.gnu.org/licenses/>.
1717

18-
SUBDIRS = core log utils include event hash mm http digest router
18+
SUBDIRS = core log utils include event hash mm http digest router modules
1919

2020
bin_PROGRAMS = freehttpd
2121

@@ -32,6 +32,7 @@ freehttpd_LDADD = \
3232
$(top_builddir)/src/router/librouter.a \
3333
$(top_builddir)/src/http/libhttp.a \
3434
$(top_builddir)/src/digest/libdigest.a \
35+
$(top_builddir)/src/modules/libmodules.a \
3536
$(top_builddir)/src/utils/libutils.a \
3637
$(top_builddir)/res/libresources.a \
3738
$(SYSTEMD_LIBS)

src/http/http1_response.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ fh_http1_res_ctx_create (pool_t *pool)
160160
ctx->iov_size = 0;
161161
ctx->iov_data_size = 0;
162162
ctx->state = FH_RES_STATE_HEADERS;
163+
ctx->response->protocol = FH_PROTOCOL_HTTP_1_1;
164+
ctx->response->encoding = FH_ENCODING_PLAIN;
165+
ctx->response->no_send_body = false;
163166
ctx->response->headers = NULL;
164167
ctx->response->content_length = 0;
165168
ctx->response->pool = pool;
@@ -289,6 +292,7 @@ fh_use_default_error_response (struct fh_http1_res_ctx *ctx,
289292
default_error_response_buf.attrs.mem.data = (uint8_t *) data;
290293
default_error_response_buf.attrs.mem.len = buf_len;
291294
default_error_response_buf.attrs.mem.cap = buf_len;
295+
response->encoding = FH_ENCODING_PLAIN;
292296
response->content_length = buf_len;
293297

294298
return true;
@@ -302,7 +306,7 @@ fh_res_send_headers (struct fh_http1_res_ctx *ctx, struct fh_conn *conn)
302306
struct fh_response *response = ctx->response;
303307
struct fh_headers *headers = response->headers;
304308
const bool set_transfer_encoding = response->encoding != FH_ENCODING_PLAIN;
305-
const size_t generated_header_count = 1 + (set_transfer_encoding ? 1 : 0);
309+
const size_t generated_header_count = 1;
306310
const size_t header_count = (headers ? headers->count : 0)
307311
+ default_header_count + generated_header_count;
308312
size_t status_text_len = 0;
@@ -368,7 +372,9 @@ fh_res_send_body (struct fh_http1_res_ctx *ctx, struct fh_conn *conn)
368372
fd_t sockfd = conn->client_sockfd;
369373
struct fh_response *response = ctx->response;
370374

371-
if ((!response->use_default_error_response && !response->content_length) || response->no_send_body)
375+
if ((!response->use_default_error_response && !response->content_length
376+
&& response->encoding != FH_ENCODING_CHUNKED)
377+
|| response->no_send_body)
372378
return H1_RES_DONE;
373379

374380
struct fh_link *link = response->use_default_error_response
@@ -458,7 +464,9 @@ fh_res_send_body (struct fh_http1_res_ctx *ctx, struct fh_conn *conn)
458464
struct fh_buf *buf = response->body_start->buf;
459465

460466
buf->attrs.mem.len -= size;
461-
buf->attrs.mem.data = (void *) (((char *) buf->attrs.mem.data) + size);
467+
buf->attrs.mem.data
468+
= (void *) (((char *) buf->attrs.mem.data)
469+
+ size);
462470
iov->iov_len = buf->attrs.mem.len;
463471
iov->iov_base = buf->attrs.mem.data;
464472
}
@@ -491,9 +499,9 @@ fh_res_send_body (struct fh_http1_res_ctx *ctx, struct fh_conn *conn)
491499

492500
fh_pr_debug ("Sending fd #%d", in_fd);
493501

494-
ssize_t sent
495-
= sendfile64 (sockfd, in_fd, (off64_t *) &buf->attrs.file.file_off,
496-
buf->attrs.file.file_len);
502+
ssize_t sent = sendfile64 (
503+
sockfd, in_fd, (off64_t *) &buf->attrs.file.file_off,
504+
buf->attrs.file.file_len);
497505

498506
if (sent < 1 || ((size_t) sent) < buf->attrs.file.file_len)
499507
{
@@ -550,6 +558,8 @@ fh_res_write_data (struct fh_http1_res_ctx *ctx, struct fh_conn *conn)
550558

551559
for (;;)
552560
{
561+
fh_pr_debug ("ctx->iov_size: %zu", ctx->iov_size);
562+
553563
ssize_t wrote = writev (sockfd, ctx->iov, ctx->iov_size);
554564

555565
if (wrote < 1)

src/modules/Makefile.am

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# This file is part of OSN freehttpd.
2+
#
3+
# Copyright (C) 2025 OSN Developers.
4+
#
5+
# OSN freehttpd is free software: you can redistribute it and/or modify
6+
# it under the terms of the GNU Affero General Public License as published by
7+
# the Free Software Foundation, either version 3 of the License, or
8+
# (at your option) any later version.
9+
#
10+
# OSN freehttpd is distributed in the hope that it will be useful,
11+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
# GNU Affero General Public License for more details.
14+
#
15+
# You should have received a copy of the GNU Affero General Public License
16+
# along with OSN freehttpd. If not, see <https://www.gnu.org/licenses/>.
17+
18+
noinst_LIBRARIES = libmodules.a
19+
libmodules_a_SOURCES = \
20+
autoindex.c \
21+
autoindex.h
22+
23+
AM_CFLAGS = $(EXPORTED_AM_CFLAGS)
24+
AM_CPPFLAGS = $(EXPORTED_AM_CPPFLAGS)
25+
AM_LDFLAGS = $(EXPORTED_AM_LDFLAGS)
26+
27+
clean-local:
28+
rm -rf .deps

0 commit comments

Comments
 (0)