---
 bin/varnishd/cache/cache.h      |  2 ++
 bin/varnishd/cache/cache_http.c | 69 ++++++++++++++++++++++++++++++-----------
 2 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 648dad4..fca8fb7 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -831,6 +831,8 @@ void http_CollectHdr(struct http *hp, const char *hdr);
 void http_VSL_log(const struct http *hp);
 void HTTP_Merge(struct worker *, struct objcore *, struct http *to);
 uint16_t HTTP_GetStatusPack(struct worker *, struct objcore *oc);
+const char *HTTP_FirstHdrPack(struct worker *, struct objcore *);
+const char *HTTP_NextHdrPack(const char *);
 const char *HTTP_GetHdrPack(struct worker *, struct objcore *,
     const char *hdr);
 enum sess_close http_DoConnection(struct http *hp);
diff --git a/bin/varnishd/cache/cache_http.c b/bin/varnishd/cache/cache_http.c
index a3aeba3..268b5b3 100644
--- a/bin/varnishd/cache/cache_http.c
+++ b/bin/varnishd/cache/cache_http.c
@@ -891,6 +891,38 @@ HTTP_GetStatusPack(struct worker *wrk, struct objcore *oc)
 
 /*--------------------------------------------------------------------*/
 
+/* Get the first packed header */
+const char *
+HTTP_FirstHdrPack(struct worker *wrk, struct objcore *oc)
+{
+       const char *ptr;
+
+       CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+       CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+
+       ptr = ObjGetattr(wrk, oc, OA_HEADERS, NULL);
+       AN(ptr);
+       ptr += 4;       /* Skip nhd and status */
+       ptr = strchr(ptr, '\0') + 1; /* Skip PROTO */
+       ptr = strchr(ptr, '\0') + 1; /* Skip STATUS */
+       ptr = strchr(ptr, '\0') + 1; /* Skip REASON */
+       if (*ptr == '\0')
+               return (NULL);
+       return (ptr);
+}
+
+/* Get the next packed header */
+const char *
+HTTP_NextHdrPack(const char *prev)
+{
+
+       AN(prev);
+       prev = strchr(prev, '\0') + 1;
+       if (*prev == '\0')
+               return (NULL);
+       return (prev);
+}
+
 const char *
 HTTP_GetHdrPack(struct worker *wrk, struct objcore *oc, const char *hdr)
 {
@@ -907,33 +939,34 @@ HTTP_GetHdrPack(struct worker *wrk, struct objcore *oc, 
const char *hdr)
        assert(hdr[l] == ':');
        hdr++;
 
-       ptr = ObjGetattr(wrk, oc, OA_HEADERS, NULL);
-       AN(ptr);
+       if (hdr[0] == ':') {
+               /* Special cases */
+               ptr = ObjGetattr(wrk, oc, OA_HEADERS, NULL);
+               AN(ptr);
+               ptr += 4;       /* Skip nhd and status */
 
-       /* Skip nhd and status */
-       ptr += 4;
-       VSL(SLT_Debug, 0, "%d %s", __LINE__, ptr);
-
-       /* Skip PROTO, STATUS and REASON */
-       if (!strcmp(hdr, ":proto:"))
-               return (ptr);
-       ptr = strchr(ptr, '\0') + 1;
-       if (!strcmp(hdr, ":status:"))
-               return (ptr);
-       ptr = strchr(ptr, '\0') + 1;
-       if (!strcmp(hdr, ":reason:"))
-               return (ptr);
-       ptr = strchr(ptr, '\0') + 1;
+               if (!strcmp(hdr, ":proto:"))
+                       return (ptr);
+               ptr = strchr(ptr, '\0') + 1;
+               if (!strcmp(hdr, ":status:"))
+                       return (ptr);
+               ptr = strchr(ptr, '\0') + 1;
+               if (!strcmp(hdr, ":reason:"))
+                       return (ptr);
+               WRONG("Unknown magic packed header");
+       }
 
-       while (*ptr != '\0') {
+       for (ptr = HTTP_FirstHdrPack(wrk, oc);
+            ptr != NULL;
+            ptr = HTTP_NextHdrPack(ptr)) {
                if (!strncasecmp(ptr, hdr, l)) {
                        ptr += l;
                        while (vct_islws(*ptr))
                                ptr++;
                        return (ptr);
                }
-               ptr = strchr(ptr, '\0') + 1;
        }
+
        return (NULL);
 }
 
-- 
2.1.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to