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


Reply via email to