http_get_etag_type returns whether a given `etag` is a strong, weak, or invalid ETag. --- include/haproxy/http-t.h | 6 ++++++ include/haproxy/http.h | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+)
diff --git a/include/haproxy/http-t.h b/include/haproxy/http-t.h index 500fc46d5..b809710b9 100644 --- a/include/haproxy/http-t.h +++ b/include/haproxy/http-t.h @@ -124,6 +124,12 @@ struct http_method_desc { const struct ist text; }; +enum http_etag_type { + ETAG_INVALID = 0, + ETAG_STRONG, + ETAG_WEAK +}; + #endif /* _HAPROXY_HTTP_T_H */ /* diff --git a/include/haproxy/http.h b/include/haproxy/http.h index 1bd9da9ad..f7ac72c87 100644 --- a/include/haproxy/http.h +++ b/include/haproxy/http.h @@ -104,6 +104,27 @@ static inline int http_language_range_match(const char *range, int range_len, return tag == tend; } +static inline enum http_etag_type http_get_etag_type(const struct ist etag) +{ + /* An ETag must be at least 2 characters. */ + if (etag.len < 2) + return ETAG_INVALID; + + /* The last character must be a `"`. */ + if (etag.ptr[etag.len - 1] != '"') + return ETAG_INVALID; + + /* If the ETag starts with a `"` then it is a strong ETag. */ + if (etag.ptr[0] == '"') + return ETAG_STRONG; + + /* If the ETag starts with `W/"` then it is a weak ETag. */ + if (istnmatch(etag, ist("W/\""), 3)) + return ETAG_WEAK; + + return ETAG_INVALID; +} + #endif /* _HAPROXY_HTTP_H */ -- 2.28.0