From 764b754a6fcb884029b7c3d962d1212f4966e5c2 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Wed, 11 Jan 2023 11:06:36 +0100 Subject: [PATCH] Add more utils --- src/cache_handler.c | 17 ++++----- src/lib/config.c | 15 ++++---- src/lib/fastcgi.c | 8 ++--- src/lib/geoip.c | 3 +- src/lib/http.c | 14 ++++---- src/lib/proxy.c | 8 ++--- src/lib/uri.c | 14 ++++---- src/lib/uri.h | 2 +- src/lib/utils.c | 70 ++++++++++++++++++++++++------------ src/lib/utils.h | 10 ++++++ src/worker/fastcgi_handler.c | 10 +++--- src/worker/local_handler.c | 22 ++++++------ src/worker/proxy_handler.c | 18 +++++----- src/worker/request_handler.c | 18 +++++----- src/worker/tcp_acceptor.c | 4 +-- 15 files changed, 133 insertions(+), 100 deletions(-) diff --git a/src/cache_handler.c b/src/cache_handler.c index 8a29a60..47a3d69 100644 --- a/src/cache_handler.c +++ b/src/cache_handler.c @@ -25,7 +25,6 @@ #define CACHE_BUF_SIZE 16 - static magic_t magic; static pthread_t thread; static sem_t sem_free, sem_used, sem_lock; @@ -69,7 +68,7 @@ static cache_entry_t *cache_get_entry(cache_t *cache, const char *filename) { for (int i = 0; i < CACHE_ENTRIES; i++) { entry = &cache->entries[i]; if (entry->filename[0] == 0) break; - if (strcmp(entry->filename, filename) == 0) { + if (streq(entry->filename, filename)) { // found return entry; } @@ -344,9 +343,7 @@ static void cache_mark_entry_dirty(cache_entry_t *entry) { } static void cache_update_entry(cache_entry_t *entry, const char *filename, const char *webroot) { - struct stat statbuf; - stat(filename, &statbuf); - memcpy(&entry->meta.stat, &statbuf, sizeof(statbuf)); + entry->meta.mtime = stat_mtime(filename); entry->webroot_len = (unsigned char) strlen(webroot); strcpy(entry->filename, filename); @@ -355,10 +352,10 @@ static void cache_update_entry(cache_entry_t *entry, const char *filename, const const char *type = magic_file(magic, filename); char type_new[URI_TYPE_SIZE]; sprintf(type_new, "%s", type); - if (strncmp(type, "text/", 5) == 0) { - if (strcmp(filename + strlen(filename) - 4, ".css") == 0) { + if (strstarts(type, "text/")) { + if (strends(filename, ".css")) { sprintf(type_new, "text/css"); - } else if (strcmp(filename + strlen(filename) - 3, ".js") == 0) { + } else if (strends(filename, ".js")) { sprintf(type_new, "application/javascript"); } } @@ -394,9 +391,7 @@ void cache_init_uri(cache_t *cache, http_uri *uri) { return; // check, if file has changed - struct stat statbuf; - stat(uri->filename, &statbuf); - if (memcmp(&uri->meta->stat.st_mtime, &statbuf.st_mtime, sizeof(statbuf.st_mtime)) != 0) { + if (uri->meta->mtime != stat_mtime(uri->filename)) { // modify time has changed cache_update_entry(entry, uri->filename, uri->webroot); } diff --git a/src/lib/config.c b/src/lib/config.c index 7ba0f80..f6c8ca1 100644 --- a/src/lib/config.c +++ b/src/lib/config.c @@ -8,6 +8,7 @@ #include "../logger.h" #include "config.h" +#include "utils.h" #include #include @@ -133,7 +134,7 @@ int config_load(const char *filename) { } else { hc->type = CONFIG_TYPE_REVERSE_PROXY; } - } else if (strcmp(ptr, "http") == 0) { + } else if (streq(ptr, "http")) { if (hc->type != 0 && hc->type != CONFIG_TYPE_REVERSE_PROXY) { goto err; } else { @@ -141,7 +142,7 @@ int config_load(const char *filename) { hc->proxy.enc = 0; } continue; - } else if (strcmp(ptr, "https") == 0) { + } else if (streq(ptr, "https")) { if (hc->type != 0 && hc->type != CONFIG_TYPE_REVERSE_PROXY) { goto err; } else { @@ -166,11 +167,11 @@ int config_load(const char *filename) { if (target != NULL) { strcpy(target, source); } else if (mode == 1) { - if (strcmp(source, "forbidden") == 0) { + if (streq(source, "forbidden")) { config.hosts[i - 1].local.dir_mode = URI_DIR_MODE_FORBIDDEN; - } else if (strcmp(source, "info") == 0) { + } else if (streq(source, "info")) { config.hosts[i - 1].local.dir_mode = URI_DIR_MODE_INFO; - } else if (strcmp(source, "list") == 0) { + } else if (streq(source, "list")) { config.hosts[i - 1].local.dir_mode = URI_DIR_MODE_LIST; } else { goto err; @@ -193,7 +194,7 @@ int config_load(const char *filename) { if (hc->cert_name[0] == 0) goto err2; int found = 0; for (int m = 0; m < j; m++) { - if (strcmp(config.certs[m].name, hc->cert_name) == 0) { + if (streq(config.certs[m].name, hc->cert_name)) { hc->cert = m; found = 1; break; @@ -213,7 +214,7 @@ host_config_t *get_host_config(const char *host) { for (int i = 0; i < CONFIG_MAX_HOST_CONFIG; i++) { host_config_t *hc = &config.hosts[i]; if (hc->type == CONFIG_TYPE_UNSET) break; - if (strcmp(hc->name, host) == 0) return hc; + if (streq(hc->name, host)) return hc; if (hc->name[0] == '*' && hc->name[1] == '.') { const char *pos = strstr(host, hc->name + 1); if (pos != NULL && strlen(pos) == strlen(hc->name + 1)) return hc; diff --git a/src/lib/fastcgi.c b/src/lib/fastcgi.c index 8263410..7adf9f7 100644 --- a/src/lib/fastcgi.c +++ b/src/lib/fastcgi.c @@ -236,16 +236,16 @@ int fastcgi_php_error(const fastcgi_cnx_t *conn, const char *msg, int msg_len, c goto next; } - if (len >= 14 && strncmp(ptr0, "PHP Warning: ", 14) == 0) { + if (len >= 14 && strstarts(ptr0, "PHP Warning: ")) { msg_type = LOG_WARNING; msg_pre_len = 14; - } else if (len >= 18 && strncmp(ptr0, "PHP Fatal error: ", 18) == 0) { + } else if (len >= 18 && strstarts(ptr0, "PHP Fatal error: ")) { msg_type = LOG_ERROR; msg_pre_len = 18; - } else if (len >= 18 && strncmp(ptr0, "PHP Parse error: ", 18) == 0) { + } else if (len >= 18 && strstarts(ptr0, "PHP Parse error: ")) { msg_type = LOG_ERROR; msg_pre_len = 18; - } else if (len >= 18 && strncmp(ptr0, "PHP Notice: ", 13) == 0) { + } else if (len >= 18 && strstarts(ptr0, "PHP Notice: ")) { msg_type = LOG_NOTICE; msg_pre_len = 13; } diff --git a/src/lib/geoip.c b/src/lib/geoip.c index 5a26c17..6c95059 100644 --- a/src/lib/geoip.c +++ b/src/lib/geoip.c @@ -9,6 +9,7 @@ #include "geoip.h" #include "../logger.h" #include "error.h" +#include "utils.h" #include #include @@ -91,7 +92,7 @@ int geoip_init(const char *directory) { struct dirent *entry; int i = 0, status; while ((entry = readdir(geoip_dir)) != NULL) { - if (strcmp(entry->d_name + strlen(entry->d_name) - 5, ".mmdb") != 0) + if (!strends(entry->d_name, ".mmdb")) continue; if (i >= GEOIP_MAX_MMDB) { diff --git a/src/lib/http.c b/src/lib/http.c index 1c23f53..abeef39 100644 --- a/src/lib/http.c +++ b/src/lib/http.c @@ -390,15 +390,15 @@ const char *http_get_status_color(const http_status *status) { } char *http_format_date(time_t time, char *buf, size_t size) { - struct tm timeinfo; - strftime(buf, size, "%a, %d %b %Y %H:%M:%S GMT", gmtime_r(&time, &timeinfo)); + struct tm time_info; + strftime(buf, size, "%a, %d %b %Y %H:%M:%S GMT", gmtime_r(&time, &time_info)); return buf; } char *http_get_date(char *buf, size_t size) { - time_t rawtime; - time(&rawtime); - return http_format_date(rawtime, buf, size); + time_t raw_time; + time(&raw_time); + return http_format_date(raw_time, buf, size); } const http_doc_info *http_get_status_info(const http_status *status) { @@ -426,9 +426,9 @@ int http_get_compression(const http_req *req, const http_res *res) { const char *content_type = http_get_header_field(&res->hdr, "Content-Type"); const char *content_encoding = http_get_header_field(&res->hdr, "Content-Encoding"); if (mime_is_compressible(content_type) && content_encoding == NULL && accept_encoding != NULL) { - if (strstr(accept_encoding, "br") != NULL) { + if (strcontains(accept_encoding, "br")) { return COMPRESS_BR; - } else if (strstr(accept_encoding, "gzip") != NULL) { + } else if (strcontains(accept_encoding, "gzip")) { return COMPRESS_GZ; } } diff --git a/src/lib/proxy.c b/src/lib/proxy.c index de10ee5..aa313ad 100644 --- a/src/lib/proxy.c +++ b/src/lib/proxy.c @@ -398,10 +398,10 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu proxy: connection = http_get_header_field(&req->hdr, "Connection"); - if (connection != NULL && (strstr(connection, "upgrade") != NULL || strstr(connection, "Upgrade") != NULL)) { + if (strcontains(connection, "upgrade") || strcontains(connection, "Upgrade")) { upgrade = http_get_header_field(&req->hdr, "Upgrade"); ws_version = http_get_header_field(&req->hdr, "Sec-WebSocket-Version"); - if (upgrade != NULL && ws_version != NULL && strcmp(upgrade, "websocket") == 0 && strcmp(ws_version, "13") == 0) { + if (streq(upgrade, "websocket") && streq(ws_version, "13")) { ctx->ws_key = http_get_header_field(&req->hdr, "Sec-WebSocket-Key"); } else { res->status = http_get_status(501); @@ -437,7 +437,7 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu ret = 0; if (content_len > 0) { ret = sock_splice(&proxy->proxy, client, buffer, sizeof(buffer), content_len); - } else if (transfer_encoding != NULL && strstr(transfer_encoding, "chunked") != NULL) { + } else if (strcontains(transfer_encoding, "chunked")) { ret = sock_splice_chunked(&proxy->proxy, client, buffer, sizeof(buffer)); } @@ -510,7 +510,7 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu goto proxy_err; } if (ptr == buf) { - if (strncmp(ptr, "HTTP/", 5) != 0) { + if (!strstarts(ptr, "HTTP/")) { res->status = http_get_status(502); ctx->origin = SERVER_RES; error("Unable to parse header: Invalid header format"); diff --git a/src/lib/uri.c b/src/lib/uri.c index 6d240db..03104a0 100644 --- a/src/lib/uri.c +++ b/src/lib/uri.c @@ -78,7 +78,7 @@ int uri_init(http_uri *uri, const char *webroot, const char *uri_str, int dir_mo if (query != NULL) { query[-1] = '?'; } - if (strstr(uri->req_path, "/../") != NULL || strstr(uri->req_path, "/./") != NULL) { + if (strcontains(uri->req_path, "/../") || strcontains(uri->req_path, "/./")) { return 2; } @@ -145,10 +145,10 @@ int uri_init(http_uri *uri, const char *webroot, const char *uri_str, int dir_mo uri->filename = malloc(strlen(buf0) + 1); strcpy(uri->filename, buf0); long len = (long) strlen(uri->path); - if (strcmp(uri->path + len - 4, ".ncr") == 0 || strcmp(uri->path + len - 4, ".php") == 0) { + if (strends(uri->path, ".ncr") || strends(uri->path, ".php")) { uri->path[len - 4] = 0; uri->is_static = 0; - } else if (strcmp(uri->path + len - 5, ".html") == 0) { + } else if (strends(uri->path, ".html")) { uri->path[len - 5] = 0; } } else if (path_is_file(buf1)) { @@ -195,12 +195,12 @@ int uri_init(http_uri *uri, const char *webroot, const char *uri_str, int dir_mo } } - if (strcmp(uri->path + strlen(uri->path) - 5, "index") == 0) { + if (strends(uri->path + strlen(uri->path), "index")) { uri->path[strlen(uri->path) - 5] = 0; } - if (strcmp(uri->pathinfo, "index.ncr") == 0 || - strcmp(uri->pathinfo, "index.php") == 0 || - strcmp(uri->pathinfo, "index.html") == 0) { + if (streq(uri->pathinfo, "index.ncr") || + streq(uri->pathinfo, "index.php") || + streq(uri->pathinfo, "index.html")) { uri->pathinfo[0] = 0; } diff --git a/src/lib/uri.h b/src/lib/uri.h index fe92b92..5fdf0e9 100644 --- a/src/lib/uri.h +++ b/src/lib/uri.h @@ -26,7 +26,7 @@ typedef struct { char charset[URI_CHARSET_SIZE]; char filename_comp_gz[256]; char filename_comp_br[256]; - struct stat stat; + long mtime; } metadata_t; typedef struct { diff --git a/src/lib/utils.c b/src/lib/utils.c index 272e518..d4dc26e 100644 --- a/src/lib/utils.c +++ b/src/lib/utils.c @@ -124,27 +124,27 @@ int mime_is_compressible(const char *type) { char *pos = strchr(type_parsed, ';'); if (pos != NULL) pos[0] = 0; return - strncmp(type_parsed, "text/", 5) == 0 || - strncmp(type_parsed, "message/", 7) == 0 || - strstr(type_parsed, "+xml") != NULL || - strstr(type_parsed, "+json") != NULL || - strcmp(type_parsed, "application/javascript") == 0 || - strcmp(type_parsed, "application/json") == 0 || - strcmp(type_parsed, "application/xml") == 0 || - strcmp(type_parsed, "application/x-www-form-urlencoded") == 0 || - strcmp(type_parsed, "application/x-tex") == 0 || - strcmp(type_parsed, "application/x-httpd-php") == 0 || - strcmp(type_parsed, "application/x-latex") == 0 || - strcmp(type_parsed, "application/vnd.ms-fontobject") == 0 || - strcmp(type_parsed, "application/x-font-ttf") == 0 || - strcmp(type_parsed, "application/x-javascript") == 0 || - strcmp(type_parsed, "font/eot") == 0 || - strcmp(type_parsed, "font/opentype") == 0 || - strcmp(type_parsed, "image/bmp") == 0 || - strcmp(type_parsed, "image/gif") == 0 || - strcmp(type_parsed, "image/vnd.microsoft.icon") == 0 || - strcmp(type_parsed, "image/vnd.microsoft.iconbinary") == 0 || - strcmp(type_parsed, "image/x-icon") == 0; + strstarts(type_parsed, "text/") || + strstarts(type_parsed, "message/") || + strends(type_parsed, "+xml") || + strends(type_parsed, "+json") || + streq(type_parsed, "application/javascript") || + streq(type_parsed, "application/json") || + streq(type_parsed, "application/xml") || + streq(type_parsed, "application/x-www-form-urlencoded") || + streq(type_parsed, "application/x-tex") || + streq(type_parsed, "application/x-httpd-php") || + streq(type_parsed, "application/x-latex") || + streq(type_parsed, "application/vnd.ms-fontobject") || + streq(type_parsed, "application/x-font-ttf") || + streq(type_parsed, "application/x-javascript") || + streq(type_parsed, "font/eot") || + streq(type_parsed, "font/opentype") || + streq(type_parsed, "image/bmp") || + streq(type_parsed, "image/gif") || + streq(type_parsed, "image/vnd.microsoft.icon") || + streq(type_parsed, "image/vnd.microsoft.iconbinary") || + streq(type_parsed, "image/x-icon"); } int strcpy_rem_webroot(char *dst, const char *src, long len, const char *webroot) { @@ -187,6 +187,26 @@ int str_trim_lws(char **start, char **end) { return 0; } +int streq(const char *restrict str1, const char *restrict str2) { + return str1 != NULL && str2 != NULL && strcmp(str1, str2) == 0; +} + +int strcontains(const char *restrict haystack, const char *restrict needle) { + return haystack != NULL && needle != NULL && strstr(haystack, needle) != NULL; +} + +int strstarts(const char *restrict str, const char *restrict prefix) { + if (str == NULL || prefix == NULL) return 0; + unsigned long l1 = strlen(str), l2 = strlen(prefix); + return l2 <= l1 && strncmp(str, prefix, l2) == 0; +} + +int strends(const char *restrict str, const char *restrict suffix) { + if (str == NULL || suffix == NULL) return 0; + unsigned long l1 = strlen(str), l2 = strlen(suffix); + return l2 <= l1 && strcmp(str + l1 - l2, suffix) == 0; +} + int base64_encode(void *data, unsigned long data_len, char *output, unsigned long *output_len) { unsigned long out_len = 4 * ((data_len + 2) / 3); if (output_len != NULL) *output_len = out_len; @@ -221,6 +241,12 @@ long clock_cpu(void) { return time.tv_sec * 1000000000 + time.tv_nsec; } +long stat_mtime(const char *filename) { + struct stat stat_buf; + stat(filename, &stat_buf); + return stat_buf.st_mtime; +} + int rm_rf(const char *path) { struct stat stat_buf; if (lstat(path, &stat_buf) != 0) @@ -243,7 +269,7 @@ int rm_rf(const char *path) { // read directory for (struct dirent *ent; (ent = readdir(dir)) != NULL;) { - if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) + if (streq(ent->d_name, ".") || streq(ent->d_name, "..")) continue; snprintf(buf, sizeof(buf), "%s/%s", path, ent->d_name); diff --git a/src/lib/utils.h b/src/lib/utils.h index ce54186..d5a897b 100644 --- a/src/lib/utils.h +++ b/src/lib/utils.h @@ -35,12 +35,22 @@ int str_trim(char **start, char **end); int str_trim_lws(char **start, char **end); +int streq(const char *restrict str1, const char *restrict str2); + +int strcontains(const char *restrict haystack, const char *restrict needle); + +int strstarts(const char *restrict str, const char *restrict prefix); + +int strends(const char *restrict str, const char *restrict suffix); + int base64_encode(void *data, unsigned long data_len, char *output, unsigned long *output_len); long clock_micros(void); long clock_cpu(void); +long stat_mtime(const char *filename); + int rm_rf(const char *path); #endif //SESIMOS_UTILS_H diff --git a/src/worker/fastcgi_handler.c b/src/worker/fastcgi_handler.c index 9ac64fd..a86bd25 100644 --- a/src/worker/fastcgi_handler.c +++ b/src/worker/fastcgi_handler.c @@ -46,9 +46,9 @@ static int fastcgi_handler_1(client_ctx_t *ctx, fastcgi_cnx_t *fcgi_cnx) { char buf[1024]; int mode, ret; - if (strcmp(uri->filename + strlen(uri->filename) - 4, ".ncr") == 0) { + if (strends(uri->filename, ".ncr")) { mode = FASTCGI_SESIMOS; - } else if (strcmp(uri->filename + strlen(uri->filename) - 4, ".php") == 0) { + } else if (strends(uri->filename, ".php")) { mode = FASTCGI_PHP; } else { res->status = http_get_status(500); @@ -73,7 +73,7 @@ static int fastcgi_handler_1(client_ctx_t *ctx, fastcgi_cnx_t *fcgi_cnx) { if (client_content_length != NULL) { unsigned long client_content_len = strtoul(client_content_length, NULL, 10); ret = fastcgi_receive(fcgi_cnx, client, client_content_len); - } else if (client_transfer_encoding != NULL && strstr(client_transfer_encoding, "chunked") != NULL) { + } else if (strcontains(client_transfer_encoding, "chunked")) { ret = fastcgi_receive_chunked(fcgi_cnx, client); } else { ret = 0; @@ -118,7 +118,7 @@ static int fastcgi_handler_1(client_ctx_t *ctx, fastcgi_cnx_t *fcgi_cnx) { const char *content_encoding = http_get_header_field(&res->hdr, "Content-Encoding"); if (content_encoding == NULL && content_type != NULL && - strncmp(content_type, "text/html", 9) == 0 && + strstarts(content_type, "text/html") && ctx->content_length != -1 && ctx->content_length <= sizeof(ctx->msg_content) - 1) { @@ -157,7 +157,7 @@ static int fastcgi_handler_1(client_ctx_t *ctx, fastcgi_cnx_t *fcgi_cnx) { static int fastcgi_handler_2(client_ctx_t *ctx, fastcgi_cnx_t *fcgi_cnx) { const char *transfer_encoding = http_get_header_field(&ctx->res.hdr, "Transfer-Encoding"); - int chunked = (transfer_encoding != NULL && strstr(transfer_encoding, "chunked") != NULL); + int chunked = strcontains(transfer_encoding, "chunked"); int flags = (chunked ? FASTCGI_CHUNKED : 0) | (ctx->use_fastcgi & (FASTCGI_COMPRESS | FASTCGI_COMPRESS_HOLD)); int ret = fastcgi_send(fcgi_cnx, &ctx->socket, flags); diff --git a/src/worker/local_handler.c b/src/worker/local_handler.c index 0088d49..2d684de 100644 --- a/src/worker/local_handler.c +++ b/src/worker/local_handler.c @@ -45,7 +45,7 @@ static int local_handler(client_ctx_t *ctx) { char buf1[1024], buf2[1024]; int accept_if_modified_since = 0; - if (strcmp(req->method, "TRACE") == 0) { + if (streq(req->method, "TRACE")) { res->status = http_get_status(200); http_add_header_field(&res->hdr, "Content-Type", "message/http"); @@ -60,11 +60,11 @@ static int local_handler(client_ctx_t *ctx) { return 0; } - if (strncmp(uri->req_path, "/.well-known/", 13) == 0) { + if (strstarts(uri->req_path, "/.well-known/")) { http_add_header_field(&res->hdr, "Access-Control-Allow-Origin", "*"); } - if (strncmp(uri->req_path, "/.well-known/", 13) != 0 && strstr(uri->path, "/.") != NULL) { + if (!strstarts(uri->req_path, "/.well-known/") && strcontains(uri->path, "/.")) { res->status = http_get_status(403); sprintf(err_msg, "Parts of this URI are hidden."); return 0; @@ -88,7 +88,7 @@ static int local_handler(client_ctx_t *ctx) { if (uri->is_static) { res->status = http_get_status(200); http_add_header_field(&res->hdr, "Accept-Ranges", "bytes"); - if (strcmp(req->method, "GET") != 0 && strcmp(req->method, "HEAD") != 0) { + if (!streq(req->method, "GET") && !streq(req->method, "HEAD")) { res->status = http_get_status(405); return 0; } @@ -101,7 +101,7 @@ static int local_handler(client_ctx_t *ctx) { cache_init_uri(ctx->conf->cache, uri); - const char *last_modified = http_format_date(uri->meta->stat.st_mtime, buf1, sizeof(buf1)); + const char *last_modified = http_format_date(uri->meta->mtime, buf1, sizeof(buf1)); http_add_header_field(&res->hdr, "Last-Modified", last_modified); sprintf(buf2, "%s; charset=%s", uri->meta->type, uri->meta->charset); http_add_header_field(&res->hdr, "Content-Type", buf2); @@ -110,7 +110,7 @@ static int local_handler(client_ctx_t *ctx) { const char *accept_encoding = http_get_header_field(&req->hdr, "Accept-Encoding"); int enc = 0; if (accept_encoding != NULL) { - if (uri->meta->filename_comp_br[0] != 0 && strstr(accept_encoding, "br") != NULL) { + if (uri->meta->filename_comp_br[0] != 0 && strcontains(accept_encoding, "br")) { ctx->file = fopen(uri->meta->filename_comp_br, "rb"); if (ctx->file == NULL) { cache_mark_dirty(ctx->conf->cache, uri->filename); @@ -119,7 +119,7 @@ static int local_handler(client_ctx_t *ctx) { http_add_header_field(&res->hdr, "Content-Encoding", "br"); enc = COMPRESS_BR; } - } else if (uri->meta->filename_comp_gz[0] != 0 && strstr(accept_encoding, "gzip") != NULL) { + } else if (uri->meta->filename_comp_gz[0] != 0 && strcontains(accept_encoding, "gzip")) { ctx->file = fopen(uri->meta->filename_comp_gz, "rb"); if (ctx->file == NULL) { cache_mark_dirty(ctx->conf->cache, uri->filename); @@ -143,7 +143,7 @@ static int local_handler(client_ctx_t *ctx) { } } - if (strncmp(uri->meta->type, "text/", 5) == 0) { + if (strstarts(uri->meta->type, "text/")) { http_add_header_field(&res->hdr, "Cache-Control", "public, max-age=3600"); } else { http_add_header_field(&res->hdr, "Cache-Control", "public, max-age=86400"); @@ -151,8 +151,8 @@ static int local_handler(client_ctx_t *ctx) { const char *if_modified_since = http_get_header_field(&req->hdr, "If-Modified-Since"); const char *if_none_match = http_get_header_field(&req->hdr, "If-None-Match"); - if ((if_none_match != NULL && strstr(if_none_match, uri->meta->etag) == NULL) || - (accept_if_modified_since && if_modified_since != NULL && strcmp(if_modified_since, last_modified) == 0)) + if ((if_none_match != NULL && !strcontains(if_none_match, uri->meta->etag)) || + (accept_if_modified_since && streq(if_modified_since, last_modified))) { res->status = http_get_status(304); return 0; @@ -160,7 +160,7 @@ static int local_handler(client_ctx_t *ctx) { const char *range = http_get_header_field(&req->hdr, "Range"); if (range != NULL) { - if (strlen(range) <= 6 || strncmp(range, "bytes=", 6) != 0) { + if (!strstarts(range, "bytes=")) { res->status = http_get_status(416); http_remove_header_field(&res->hdr, "Content-Type", HTTP_REMOVE_ALL); http_remove_header_field(&res->hdr, "Last-Modified", HTTP_REMOVE_ALL); diff --git a/src/worker/proxy_handler.c b/src/worker/proxy_handler.c index eb60da2..4b1bc4a 100644 --- a/src/worker/proxy_handler.c +++ b/src/worker/proxy_handler.c @@ -63,12 +63,12 @@ static int proxy_handler_1(client_ctx_t *ctx) { const char *connection = http_get_header_field(&res->hdr, "Connection"); const char *upgrade = http_get_header_field(&res->hdr, "Upgrade"); if (connection != NULL && upgrade != NULL && - (strstr(connection, "upgrade") != NULL || strstr(connection, "Upgrade") != NULL) && - strcmp(upgrade, "websocket") == 0) + (strcontains(connection, "upgrade") || strcontains(connection, "Upgrade")) && + streq(upgrade, "websocket")) { const char *ws_accept = http_get_header_field(&res->hdr, "Sec-WebSocket-Accept"); if (ws_calc_accept_key(status->ws_key, buf) == 0) { - ctx->use_proxy = (strcmp(buf, ws_accept) == 0) ? 2 : 1; + ctx->use_proxy = streq(buf, ws_accept) ? 2 : 1; } } else { status->status = 101; @@ -84,10 +84,10 @@ static int proxy_handler_1(client_ctx_t *ctx) { const char *content_encoding = http_get_header_field(&res->hdr, "Content-Encoding"); if (content_encoding == NULL && ( content_length_f == NULL || - (content_length_f != NULL && strcmp(content_length_f, "0") == 0) || - (content_type != NULL && content_length_f != NULL && strncmp(content_type, "text/html", 9) == 0))) + streq(content_length_f, "0") || + (content_length_f != NULL && strstarts(content_type, "text/html")))) { - long content_len = (strcmp(ctx->req.method, "HEAD") != 0 && content_length_f != NULL) ? strtol(content_length_f, NULL, 10) : 0; + long content_len = (!streq(ctx->req.method, "HEAD") && content_length_f != NULL) ? strtol(content_length_f, NULL, 10) : 0; if (content_len <= sizeof(ctx->msg_content) - 1) { if (status->status != 101) { status->status = res->status->code; @@ -103,7 +103,7 @@ static int proxy_handler_1(client_ctx_t *ctx) { } } - if (strcmp(ctx->req.method, "HEAD") == 0) { + if (streq(ctx->req.method, "HEAD")) { return 1; } @@ -119,7 +119,7 @@ static int proxy_handler_1(client_ctx_t *ctx) { } char *transfer_encoding = http_get_header_field(&res->hdr, "Transfer-Encoding"); - int chunked = transfer_encoding != NULL && strcmp(transfer_encoding, "chunked") == 0; + int chunked = transfer_encoding != NULL && streq(transfer_encoding, "chunked"); http_remove_header_field(&res->hdr, "Transfer-Encoding", HTTP_REMOVE_ALL); ret = sprintf(buf, "%s%s%s", (use_proxy & PROXY_COMPRESS_BR) ? "br" : @@ -136,7 +136,7 @@ static int proxy_handler_1(client_ctx_t *ctx) { static int proxy_handler_2(client_ctx_t *ctx) { const char *transfer_encoding = http_get_header_field(&ctx->res.hdr, "Transfer-Encoding"); - int chunked = transfer_encoding != NULL && strstr(transfer_encoding, "chunked") != NULL; + int chunked = strcontains(transfer_encoding, "chunked"); const char *content_len = http_get_header_field(&ctx->res.hdr, "Content-Length"); unsigned long len_to_send = 0; diff --git a/src/worker/request_handler.c b/src/worker/request_handler.c index e21f753..a50b954 100644 --- a/src/worker/request_handler.c +++ b/src/worker/request_handler.c @@ -108,7 +108,7 @@ static int request_handler(client_ctx_t *ctx) { } const char *hdr_connection = http_get_header_field(&req->hdr, "Connection"); - ctx->c_keep_alive = (hdr_connection != NULL && (strstr(hdr_connection, "keep-alive") != NULL || strstr(hdr_connection, "Keep-Alive") != NULL)); + ctx->c_keep_alive = (strcontains(hdr_connection, "keep-alive") || strcontains(hdr_connection, "Keep-Alive")); const char *host_ptr = http_get_header_field(&req->hdr, "Host"); if (host_ptr != NULL && strlen(host_ptr) > 255) { ctx->req_host[0] = 0; @@ -131,8 +131,8 @@ 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 (strncmp(req->uri, "/.sesimos/res/", 14) == 0) { - if (strcmp(req->method, "GET") != 0 && strcmp(req->method, "HEAD") != 0) { + if (strstarts(req->uri, "/.sesimos/res/")) { + if (!streq(req->method, "GET") && !streq(req->method, "HEAD")) { res->status = http_get_status(405); http_add_header_field(&res->hdr, "Allow", "GET, HEAD"); return 0; @@ -150,7 +150,7 @@ static int request_handler(client_ctx_t *ctx) { 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) { + if (streq(req->uri + 14, r->name)) { res->status = http_get_status(203); http_add_header_field(&res->hdr, "Content-Type", r->type); http_add_header_field(&res->hdr, "Cache-Control", "public, max-age=86400"); @@ -189,13 +189,13 @@ static int request_handler(client_ctx_t *ctx) { return 0; } - if (ctx->conf->type == CONFIG_TYPE_LOCAL && strcmp(req->method, "TRACE") == 0) { + if (ctx->conf->type == CONFIG_TYPE_LOCAL && streq(req->method, "TRACE")) { return 1; } else if (dir_mode != URI_DIR_MODE_NO_VALIDATION) { ssize_t size = sizeof(buf0); url_decode(req->uri, buf0, &size); - int change_proto = (!client->enc && strncmp(uri->uri, "/.well-known/", 13) != 0); - if (strcmp(uri->uri, buf0) != 0 || change_proto) { + int change_proto = (!client->enc && !strstarts(uri->uri, "/.well-known/")); + if (!streq(uri->uri, buf0) || change_proto) { res->status = http_get_status(308); size = url_encode(uri->uri, strlen(uri->uri), buf0, sizeof(buf0)); if (change_proto) { @@ -271,7 +271,7 @@ int respond(client_ctx_t *ctx) { snprintf(ctx->msg_content, sizeof(ctx->msg_content), " \n", location, location); } } - } else if (strncmp(ctx->msg_content, "", 15) == 0 || strncmp(ctx->msg_content, "msg_content, "") || strstarts(ctx->msg_content, "msg_content[0] = 0; // TODO let relevant information pass? } @@ -340,7 +340,7 @@ int respond(client_ctx_t *ctx) { if (ctx->use_proxy) { // reverse proxy return 3; - } else if (strcmp(req->method, "HEAD") != 0) { + } else if (!streq(req->method, "HEAD")) { // default response if (ctx->msg_buf != NULL) { ret = sock_send(client, ctx->msg_buf, ctx->content_length, 0); diff --git a/src/worker/tcp_acceptor.c b/src/worker/tcp_acceptor.c index decd649..84eeb04 100644 --- a/src/worker/tcp_acceptor.c +++ b/src/worker/tcp_acceptor.c @@ -33,7 +33,7 @@ static int tcp_acceptor(client_ctx_t *ctx) { struct sockaddr_in6 server_addr; inet_ntop(ctx->socket._addr.ipv6.sin6_family, &ctx->socket._addr.ipv6.sin6_addr, ctx->_c_addr, sizeof(ctx->_c_addr)); - if (strncmp(ctx->_c_addr, "::ffff:", 7) == 0) { + if (strstarts(ctx->_c_addr, "::ffff:")) { ctx->socket.addr = ctx->_c_addr + 7; } else { ctx->socket.addr = ctx->_c_addr; @@ -42,7 +42,7 @@ static int tcp_acceptor(client_ctx_t *ctx) { socklen_t len = sizeof(server_addr); getsockname(ctx->socket.socket, (struct sockaddr *) &server_addr, &len); inet_ntop(server_addr.sin6_family, (void *) &server_addr.sin6_addr, ctx->_s_addr, sizeof(ctx->_s_addr)); - if (strncmp(ctx->_s_addr, "::ffff:", 7) == 0) { + if (strstarts(ctx->_s_addr, "::ffff:")) { ctx->socket.s_addr = ctx->_s_addr + 7; } else { ctx->socket.s_addr = ctx->_s_addr;