diff options
| author | 2022-09-28 09:29:09 +0200 | |
|---|---|---|
| committer | 2022-09-28 09:29:09 +0200 | |
| commit | a636cf8b25d72900892b18191e0d68de10779e90 (patch) | |
| tree | dd2fa86101259a499713d810db7d360d25f27aa3 | |
| parent | Delete dangling local timeline entry in timeline_admire(). (diff) | |
| download | penes-snac2-a636cf8b25d72900892b18191e0d68de10779e90.tar.gz penes-snac2-a636cf8b25d72900892b18191e0d68de10779e90.tar.xz penes-snac2-a636cf8b25d72900892b18191e0d68de10779e90.zip | |
New function static_get().
| -rw-r--r-- | data.c | 25 | ||||
| -rw-r--r-- | html.c | 42 | ||||
| -rw-r--r-- | snac.h | 2 | ||||
| -rw-r--r-- | xs_httpd.h | 2 | ||||
| -rw-r--r-- | xs_io.h | 11 |
5 files changed, 77 insertions, 5 deletions
| @@ -801,6 +801,31 @@ int actor_get(snac *snac, char *actor, d_char **data) | |||
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | 803 | ||
| 804 | d_char *_static_fn(snac *snac, char *id) | ||
| 805 | /* gets the filename for a static file */ | ||
| 806 | { | ||
| 807 | return xs_fmt("%s/static/%s", snac->basedir, id); | ||
| 808 | } | ||
| 809 | |||
| 810 | |||
| 811 | int static_get(snac *snac, char *id, d_char **data, int *size) | ||
| 812 | /* returns static content */ | ||
| 813 | { | ||
| 814 | xs *fn = _static_fn(snac, id); | ||
| 815 | FILE *f; | ||
| 816 | int status = 404; | ||
| 817 | |||
| 818 | *size = 0xfffffff; | ||
| 819 | |||
| 820 | if ((f = fopen(fn, "rb")) != NULL) { | ||
| 821 | *data = xs_read(f, size); | ||
| 822 | status = 200; | ||
| 823 | } | ||
| 824 | |||
| 825 | return status; | ||
| 826 | } | ||
| 827 | |||
| 828 | |||
| 804 | void enqueue_input(snac *snac, char *msg, char *req) | 829 | void enqueue_input(snac *snac, char *msg, char *req) |
| 805 | /* enqueues an input message */ | 830 | /* enqueues an input message */ |
| 806 | { | 831 | { |
| @@ -207,12 +207,52 @@ d_char *html_msg_icon(snac *snac, d_char *s, char *msg) | |||
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | 209 | ||
| 210 | d_char *html_user_header(snac *snac, d_char *s) | ||
| 211 | /* creates the HTML header */ | ||
| 212 | { | ||
| 213 | char *p, *v; | ||
| 214 | |||
| 215 | s = xs_str_cat(s, "<!DOCTYPE html>\n<html>\n<head>\n"); | ||
| 216 | s = xs_str_cat(s, "<meta name=\"viewport\" " | ||
| 217 | "content=\"width=device-width, initial-scale=1\"/>\n"); | ||
| 218 | s = xs_str_cat(s, "<meta name=\"generator\" " | ||
| 219 | "content=\"" USER_AGENT "\"/>\n"); | ||
| 220 | |||
| 221 | /* add server CSS */ | ||
| 222 | p = xs_dict_get(srv_config, "cssurls"); | ||
| 223 | while (xs_list_iter(&p, &v)) { | ||
| 224 | xs *s1 = xs_fmt("<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\"/>\n", v); | ||
| 225 | s = xs_str_cat(s, s1); | ||
| 226 | } | ||
| 227 | |||
| 228 | /* add the user CSS */ | ||
| 229 | { | ||
| 230 | xs *css = NULL; | ||
| 231 | int size; | ||
| 232 | |||
| 233 | if (valid_status(static_get(snac, "style.css", &css, &size))) { | ||
| 234 | xs *s1 = xs_fmt("<style>%s</style>\n", css); | ||
| 235 | s = xs_str_cat(s, s1); | ||
| 236 | } | ||
| 237 | } | ||
| 238 | |||
| 239 | { | ||
| 240 | xs *s1 = xs_fmt("<title>%s</title>\n", xs_dict_get(snac->config, "name")); | ||
| 241 | s = xs_str_cat(s, s1); | ||
| 242 | } | ||
| 243 | |||
| 244 | s = xs_str_cat(s, "</head>\n<body>\n"); | ||
| 245 | |||
| 246 | return s; | ||
| 247 | } | ||
| 248 | |||
| 249 | |||
| 210 | d_char *html_timeline(snac *snac, char *list, int local) | 250 | d_char *html_timeline(snac *snac, char *list, int local) |
| 211 | /* returns the HTML for the timeline */ | 251 | /* returns the HTML for the timeline */ |
| 212 | { | 252 | { |
| 213 | d_char *s = xs_str_new(NULL); | 253 | d_char *s = xs_str_new(NULL); |
| 214 | 254 | ||
| 215 | s = xs_str_cat(s, "<!DOCTYPE html>\n<html>\n"); | 255 | s = html_user_header(snac, s); |
| 216 | 256 | ||
| 217 | s = xs_str_cat(s, "<h1>HI</h1>\n"); | 257 | s = xs_str_cat(s, "<h1>HI</h1>\n"); |
| 218 | 258 | ||
| @@ -78,6 +78,8 @@ int is_muted(snac *snac, char *actor); | |||
| 78 | int actor_add(snac *snac, char *actor, char *msg); | 78 | int actor_add(snac *snac, char *actor, char *msg); |
| 79 | int actor_get(snac *snac, char *actor, d_char **data); | 79 | int actor_get(snac *snac, char *actor, d_char **data); |
| 80 | 80 | ||
| 81 | int static_get(snac *snac, char *id, d_char **data, int *size); | ||
| 82 | |||
| 81 | void enqueue_input(snac *snac, char *msg, char *req); | 83 | void enqueue_input(snac *snac, char *msg, char *req); |
| 82 | void enqueue_output(snac *snac, char *msg, char *actor, int retries); | 84 | void enqueue_output(snac *snac, char *msg, char *actor, int retries); |
| 83 | 85 | ||
| @@ -128,7 +128,7 @@ d_char *xs_httpd_request(FILE *f, d_char **payload, int *p_size) | |||
| 128 | if ((v = xs_dict_get(req, "content-length")) != NULL) { | 128 | if ((v = xs_dict_get(req, "content-length")) != NULL) { |
| 129 | /* if it has a payload, load it */ | 129 | /* if it has a payload, load it */ |
| 130 | *p_size = atoi(v); | 130 | *p_size = atoi(v); |
| 131 | *payload = xs_read(f, *p_size); | 131 | *payload = xs_read(f, p_size); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /* is the payload form urlencoded variables? */ | 134 | /* is the payload form urlencoded variables? */ |
| @@ -6,7 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | d_char *xs_readall(FILE *f); | 7 | d_char *xs_readall(FILE *f); |
| 8 | d_char *xs_readline(FILE *f); | 8 | d_char *xs_readline(FILE *f); |
| 9 | d_char *xs_read(FILE *f, int size); | 9 | d_char *xs_read(FILE *f, int *size); |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | #ifdef XS_IMPLEMENTATION | 12 | #ifdef XS_IMPLEMENTATION |
| @@ -56,16 +56,18 @@ d_char *xs_readline(FILE *f) | |||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | 58 | ||
| 59 | d_char *xs_read(FILE *f, int size) | 59 | d_char *xs_read(FILE *f, int *sz) |
| 60 | /* reads up to size bytes from f */ | 60 | /* reads up to size bytes from f */ |
| 61 | { | 61 | { |
| 62 | d_char *s; | 62 | d_char *s; |
| 63 | int size = *sz; | ||
| 64 | int rdsz = 0; | ||
| 63 | 65 | ||
| 64 | errno = 0; | 66 | errno = 0; |
| 65 | 67 | ||
| 66 | s = xs_str_new(NULL); | 68 | s = xs_str_new(NULL); |
| 67 | 69 | ||
| 68 | while (size != 0 && !feof(f)) { | 70 | while (size > 0 && !feof(f)) { |
| 69 | char tmp[2048]; | 71 | char tmp[2048]; |
| 70 | int n, r; | 72 | int n, r; |
| 71 | 73 | ||
| @@ -76,8 +78,11 @@ d_char *xs_read(FILE *f, int size) | |||
| 76 | s = xs_append_m(s, tmp, r); | 78 | s = xs_append_m(s, tmp, r); |
| 77 | 79 | ||
| 78 | size -= r; | 80 | size -= r; |
| 81 | rdsz += r; | ||
| 79 | } | 82 | } |
| 80 | 83 | ||
| 84 | *sz = rdsz; | ||
| 85 | |||
| 81 | return s; | 86 | return s; |
| 82 | } | 87 | } |
| 83 | 88 | ||