diff --git a/Makefile b/Makefile index 96b21c4..1238ca5 100644 --- a/Makefile +++ b/Makefile @@ -59,6 +59,7 @@ bin/sesimos: bin/server.o bin/logger.o bin/cache_handler.o bin/async.o bin/worke bin/worker/request_handler.o bin/worker/tcp_acceptor.o \ bin/worker/fastcgi_handler.o bin/worker/local_handler.o bin/worker/proxy_handler.o \ bin/lib/http_static.o bin/res/default.o bin/res/proxy.o bin/res/style.o \ + bin/res/icon_error.o bin/res/icon_info.o bin/res/icon_success.o bin/res/icon_warning.o \ bin/lib/compress.o bin/lib/config.o bin/lib/fastcgi.o bin/lib/geoip.o \ bin/lib/http.o bin/lib/proxy.o bin/lib/sock.o bin/lib/uri.o \ bin/lib/utils.o bin/lib/websocket.o bin/lib/mpmc.o bin/lib/list.o diff --git a/res/default.html b/res/default.html index 4f4f21f..cd03300 100644 --- a/res/default.html +++ b/res/default.html @@ -8,8 +8,9 @@ - -%5$s + + +
diff --git a/res/icon_error.svg b/res/icon_error.svg new file mode 100644 index 0000000..86f5a4e --- /dev/null +++ b/res/icon_error.svg @@ -0,0 +1,3 @@ + + :( + diff --git a/res/icon_info.svg b/res/icon_info.svg new file mode 100644 index 0000000..83b92a2 --- /dev/null +++ b/res/icon_info.svg @@ -0,0 +1,3 @@ + + :) + diff --git a/res/icon_success.svg b/res/icon_success.svg new file mode 100644 index 0000000..41d2380 --- /dev/null +++ b/res/icon_success.svg @@ -0,0 +1,3 @@ + + :) + diff --git a/res/icon_warning.svg b/res/icon_warning.svg new file mode 100644 index 0000000..28fa8d6 --- /dev/null +++ b/res/icon_warning.svg @@ -0,0 +1,3 @@ + + :) + diff --git a/src/lib/http.c b/src/lib/http.c index 8d92600..776c687 100644 --- a/src/lib/http.c +++ b/src/lib/http.c @@ -419,10 +419,10 @@ char *http_get_date(char *buf, size_t size) { const http_doc_info *http_get_status_info(const http_status *status) { unsigned short code = status->code; static http_doc_info info[] = { - {"info", HTTP_COLOR_INFO, http_info_icon, http_info_doc}, - {"success", HTTP_COLOR_SUCCESS, http_success_icon, http_success_doc}, - {"warning", HTTP_COLOR_WARNING, http_warning_icon, http_warning_doc}, - {"error", HTTP_COLOR_ERROR, http_error_icon, http_error_doc} + {"info", HTTP_COLOR_INFO, "/.sesimos/res/icon-info.svg", http_info_doc}, + {"success", HTTP_COLOR_SUCCESS, "/.sesimos/res/icon-success.svg", http_success_doc}, + {"warning", HTTP_COLOR_WARNING, "/.sesimos/res/icon-warning.svg", http_warning_doc}, + {"error", HTTP_COLOR_ERROR, "/.sesimos/res/icon-error.svg", http_error_doc} }; if (code >= 100 && code < 200) { return &info[0]; diff --git a/src/lib/http.h b/src/lib/http.h index a10ace5..76b322c 100644 --- a/src/lib/http.h +++ b/src/lib/http.h @@ -117,10 +117,7 @@ extern const http_status_msg http_status_messages[]; extern const int http_statuses_size; extern const int http_status_messages_size; -extern const char http_error_doc[], http_error_icon[]; -extern const char http_warning_doc[], http_warning_icon[]; -extern const char http_success_doc[], http_success_icon[]; -extern const char http_info_doc[], http_info_icon[]; +extern const char http_error_doc[], http_warning_doc[], http_success_doc[], http_info_doc[]; void http_to_camel_case(char *str, int mode); diff --git a/src/lib/http_static.c b/src/lib/http_static.c index 84dd6fe..2be903d 100644 --- a/src/lib/http_static.c +++ b/src/lib/http_static.c @@ -112,47 +112,20 @@ const char http_error_doc[] = "

%3$s

\n" "

%4$s

\n"; -const char http_error_icon[] = - " \n"; - - const char http_warning_doc[] = "

%1$i

\n" "

%2$s :)

\n" "

%3$s

\n" "

%4$s

\n"; -const char http_warning_icon[] = - " \n"; - - const char http_success_doc[] = "

%1$i

\n" "

%2$s :)

\n" "

%3$s

\n" "

%4$s

\n"; -const char http_success_icon[] = - " \n"; - - const char http_info_doc[] = "

%1$i

\n" "

%2$s :)

\n" "

%3$s

\n" "

%4$s

\n"; - -const char http_info_icon[] = - " \n"; diff --git a/src/lib/res.h b/src/lib/res.h index 1bac5bf..658613d 100644 --- a/src/lib/res.h +++ b/src/lib/res.h @@ -16,6 +16,22 @@ #define http_style_doc _binary_bin_res_style_txt_start #define http_style_doc_size ((unsigned int) (_binary_bin_res_style_txt_end - _binary_bin_res_style_txt_start) - 1) +#define http_icon_error _binary_bin_res_icon_error_txt_start +#define http_icon_error_size ((unsigned int) (_binary_bin_res_icon_error_txt_end - _binary_bin_res_icon_error_txt_start) - 1) +#define http_icon_info _binary_bin_res_icon_info_txt_start +#define http_icon_info_size ((unsigned int) (_binary_bin_res_icon_info_txt_end - _binary_bin_res_icon_info_txt_start) - 1) +#define http_icon_success _binary_bin_res_icon_success_txt_start +#define http_icon_success_size ((unsigned int) (_binary_bin_res_icon_success_txt_end - _binary_bin_res_icon_success_txt_start) - 1) +#define http_icon_warning _binary_bin_res_icon_warning_txt_start +#define http_icon_warning_size ((unsigned int) (_binary_bin_res_icon_warning_txt_end - _binary_bin_res_icon_warning_txt_start) - 1) + +typedef struct { + const char *name; + const char *type; + const char *content; + const unsigned int size; +} res_t; + extern const char _binary_bin_res_default_txt_start[]; extern const char _binary_bin_res_default_txt_end[]; @@ -25,4 +41,16 @@ extern const char _binary_bin_res_proxy_txt_end[]; extern const char _binary_bin_res_style_txt_start[]; extern const char _binary_bin_res_style_txt_end[]; +extern const char _binary_bin_res_icon_error_txt_start[]; +extern const char _binary_bin_res_icon_error_txt_end[]; + +extern const char _binary_bin_res_icon_info_txt_start[]; +extern const char _binary_bin_res_icon_info_txt_end[]; + +extern const char _binary_bin_res_icon_success_txt_start[]; +extern const char _binary_bin_res_icon_success_txt_end[]; + +extern const char _binary_bin_res_icon_warning_txt_start[]; +extern const char _binary_bin_res_icon_warning_txt_end[]; + #endif //SESIMOS_RES_H diff --git a/src/worker/request_handler.c b/src/worker/request_handler.c index 0a90031..cbcc23f 100644 --- a/src/worker/request_handler.c +++ b/src/worker/request_handler.c @@ -130,12 +130,28 @@ static int request_handler(client_ctx_t *ctx) { logger_set_prefix("[%s%*s%s]%s", BLD_STR, INET6_ADDRSTRLEN, ctx->req_host, CLR_STR, ctx->log_prefix); info(BLD_STR "%s %s", req->method, req->uri); - if (strcmp(req->uri, "/.sesimos/style.css") == 0 && (strcmp(req->method, "GET") == 0 || strcmp(req->method, "HEAD") == 0)) { - ctx->msg_buf = (char *) http_style_doc; - ctx->content_length = http_style_doc_size; - res->status= http_get_status(200); - http_add_header_field(&res->hdr, "Content-Type", "text/css; charset=UTF-8"); - http_add_header_field(&res->hdr, "Cache-Control", "public, max-age=3600"); + if (strncmp(req->uri, "/.sesimos/res/", 14) == 0 && (strcmp(req->method, "GET") == 0 || strcmp(req->method, "HEAD") == 0)) { + const res_t resources[] = { + {"style.css", "text/css; charset=UTF-8", http_style_doc, http_style_doc_size}, + {"icon-error.svg", "image/svg+xml; charset=UTF-8", http_icon_error, http_icon_error_size}, + {"icon-info.svg", "image/svg+xml; charset=UTF-8", http_icon_info, http_icon_info_size}, + {"icon-success.svg", "image/svg+xml; charset=UTF-8", http_icon_success, http_icon_success_size}, + {"icon-warning.svg", "image/svg+xml; charset=UTF-8", http_icon_warning, http_icon_warning_size}, + }; + + res->status = http_get_status(404); + for (int i = 0; i < sizeof(resources) / sizeof(res_t); i++) { + const res_t *r = &resources[i]; + if (strcmp(req->uri + 14, r->name) == 0) { + res->status = http_get_status(200); + http_add_header_field(&res->hdr, "Content-Type", r->type); + http_add_header_field(&res->hdr, "Cache-Control", "public, max-age=86400"); + ctx->msg_buf = (char *) r->content; + ctx->content_length = r->size; + break; + } + } + return 0; }