Propagate 'last-modified' and 'etag' fields while proxying.

But does it work?
This commit is contained in:
default 2024-11-07 19:42:02 +01:00
parent 916dc76332
commit 0f8ade8c60
3 changed files with 14 additions and 3 deletions

8
html.c
View file

@ -2796,7 +2796,8 @@ xs_str *html_notifications(snac *user, int skip, int show)
int html_get_handler(const xs_dict *req, const char *q_path, int html_get_handler(const xs_dict *req, const char *q_path,
char **body, int *b_size, char **ctype, xs_str **etag) char **body, int *b_size, char **ctype,
xs_str **etag, xs_str **last_modified)
{ {
const char *accept = xs_dict_get(req, "accept"); const char *accept = xs_dict_get(req, "accept");
int status = HTTP_STATUS_NOT_FOUND; int status = HTTP_STATUS_NOT_FOUND;
@ -3227,6 +3228,11 @@ int html_get_handler(const xs_dict *req, const char *q_path,
if (valid_status(status)) { if (valid_status(status)) {
const char *ct = xs_dict_get(rsp, "content-type"); const char *ct = xs_dict_get(rsp, "content-type");
const char *lm = xs_dict_get(rsp, "last-modified");
const char *et = xs_dict_get(rsp, "etag");
if (lm) *last_modified = xs_dup(lm);
if (et) *etag = xs_dup(et);
/* find the content-type in the static mime types, /* find the content-type in the static mime types,
and return that value instead of ct, which will and return that value instead of ct, which will

View file

@ -278,6 +278,7 @@ void httpd_connection(FILE *f)
xs *q_path = NULL; xs *q_path = NULL;
xs *payload = NULL; xs *payload = NULL;
xs *etag = NULL; xs *etag = NULL;
xs *last_modified = NULL;
int p_size = 0; int p_size = 0;
const char *p; const char *p;
int fcgi_id; int fcgi_id;
@ -329,7 +330,7 @@ void httpd_connection(FILE *f)
#endif /* NO_MASTODON_API */ #endif /* NO_MASTODON_API */
if (status == 0) if (status == 0)
status = html_get_handler(req, q_path, &body, &b_size, &ctype, &etag); status = html_get_handler(req, q_path, &body, &b_size, &ctype, &etag, &last_modified);
} }
else else
if (strcmp(method, "POST") == 0) { if (strcmp(method, "POST") == 0) {
@ -423,6 +424,8 @@ void httpd_connection(FILE *f)
if (!xs_is_null(etag)) if (!xs_is_null(etag))
headers = xs_dict_append(headers, "etag", etag); headers = xs_dict_append(headers, "etag", etag);
if (!xs_is_null(last_modified))
headers = xs_dict_append(headers, "last-modified", last_modified);
/* if there are any additional headers, add them */ /* if there are any additional headers, add them */
const xs_dict *more_headers = xs_dict_get(srv_config, "http_headers"); const xs_dict *more_headers = xs_dict_get(srv_config, "http_headers");

4
snac.h
View file

@ -349,7 +349,9 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
const char *title, const char *page, int utl, const char *error); const char *title, const char *page, int utl, const char *error);
int html_get_handler(const xs_dict *req, const char *q_path, int html_get_handler(const xs_dict *req, const char *q_path,
char **body, int *b_size, char **ctype, xs_str **etag); char **body, int *b_size, char **ctype,
xs_str **etag, xs_str **last_modified);
int html_post_handler(const xs_dict *req, const char *q_path, int html_post_handler(const xs_dict *req, const char *q_path,
char *payload, int p_size, char *payload, int p_size,
char **body, int *b_size, char **ctype); char **body, int *b_size, char **ctype);