Introduction
Introduction Statistics Contact Development Disclaimer Help
quark-precompression-20200308-3c7049e.diff - sites - public wiki contents of su…
git clone git://git.suckless.org/sites
Log
Files
Refs
---
quark-precompression-20200308-3c7049e.diff (3325B)
---
1 From 668df28967b8abd2893383e4d20b16cfe99dfdeb Mon Sep 17 00:00:00 2001
2 From: guysv <[email protected]>
3 Date: Sun, 8 Mar 2020 18:40:07 +0200
4 Subject: [PATCH] Add support for precomputed compression
5
6 If a client indicates that it supports gzip, then look for a `.gz`
7 variation of requested file. If such gzipped file exists, send it
8 instead and set the appropriate headers.
9
10 Range requests and dirlist requests are not supported.
11 ---
12 http.c | 24 ++++++++++++++++++++++--
13 http.h | 1 +
14 resp.c | 5 +++--
15 resp.h | 2 +-
16 4 files changed, 27 insertions(+), 5 deletions(-)
17
18 diff --git a/http.c b/http.c
19 index efc4136..a654514 100644
20 --- a/http.c
21 +++ b/http.c
22 @@ -25,6 +25,7 @@ const char *req_field_str[] = {
23 [REQ_HOST] = "Host",
24 [REQ_RANGE] = "Range",
25 [REQ_MOD] = "If-Modified-Since",
26 + [REQ_ENCODE] = "Accept-Encoding",
27 };
28
29 const char *req_method_str[] = {
30 @@ -349,7 +350,7 @@ enum status
31 http_send_response(int fd, struct request *r)
32 {
33 struct in6_addr res;
34 - struct stat st;
35 + struct stat st, gzst;
36 struct tm tm;
37 size_t len, i;
38 off_t lower, upper;
39 @@ -604,5 +605,24 @@ http_send_response(int fd, struct request *r)
40 }
41 }
42
43 - return resp_file(fd, RELPATH(realtarget), r, &st, mime, lower, …
44 + /* encoding-compression */
45 + if (r->field[REQ_ENCODE][0] && !r->field[REQ_RANGE][0]) {
46 + for (p = r->field[REQ_ENCODE]; p; p = strchr(p, ','), p…
47 + /* skip whitespace */
48 + for (; *p == ' ' || *p == '\t'; p++)
49 + ;
50 + if (!strncasecmp(p, "gzip", sizeof("gzip")-1) &&
51 + !esnprintf(tmptarget, sizeof(tm…
52 + ".gz") &&
53 + !stat(RELPATH(tmptarget), &gzst…
54 + S_ISREG(gzst.st_mode)) {
55 + lower = 0;
56 + upper = gzst.st_size-1;
57 + return resp_file(fd, RELPATH(tmptarget)…
58 + "Conten…
59 + }
60 + }
61 + }
62 +
63 + return resp_file(fd, RELPATH(realtarget), r, &st, mime, "", low…
64 }
65 diff --git a/http.h b/http.h
66 index cd1ba22..26ced90 100644
67 --- a/http.h
68 +++ b/http.h
69 @@ -11,6 +11,7 @@ enum req_field {
70 REQ_HOST,
71 REQ_RANGE,
72 REQ_MOD,
73 + REQ_ENCODE,
74 NUM_REQ_FIELDS,
75 };
76
77 diff --git a/resp.c b/resp.c
78 index 3075c28..bf35ac8 100644
79 --- a/resp.c
80 +++ b/resp.c
81 @@ -111,7 +111,7 @@ cleanup:
82
83 enum status
84 resp_file(int fd, char *name, struct request *r, struct stat *st, char …
85 - off_t lower, off_t upper)
86 + char *encoding, off_t lower, off_t upper)
87 {
88 FILE *fp;
89 enum status s;
90 @@ -142,10 +142,11 @@ resp_file(int fd, char *name, struct request *r, s…
91 "Connection: close\r\n"
92 "Last-Modified: %s\r\n"
93 "Content-Type: %s\r\n"
94 + "%s"
95 "Content-Length: %zu\r\n",
96 s, status_str[s], timestamp(time(NULL), t1),
97 timestamp(st->st_mtim.tv_sec, t2), mime,
98 - upper - lower + 1) < 0) {
99 + encoding, upper - lower + 1) < 0) {
100 s = S_REQUEST_TIMEOUT;
101 goto cleanup;
102 }
103 diff --git a/resp.h b/resp.h
104 index d5928ef..ccfaaad 100644
105 --- a/resp.h
106 +++ b/resp.h
107 @@ -9,6 +9,6 @@
108
109 enum status resp_dir(int, char *, struct request *);
110 enum status resp_file(int, char *, struct request *, struct stat *, cha…
111 - off_t, off_t);
112 + char *, off_t, off_t);
113
114 #endif /* RESP_H */
115 --
116 2.25.1
117
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.