Skip to content

Commit 849232a

Browse files
committed
fix: headers tab
1 parent c006ddf commit 849232a

File tree

4 files changed

+172
-49
lines changed

4 files changed

+172
-49
lines changed

pkg/server/templates/content/tab_headers.templ

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -68,33 +68,29 @@ templ renderTxHeaderTree(tx *vsl.Transaction, visited map[string]bool) {
6868
<table class="headers-table">
6969
<tr>
7070
<tr class="hdr-type"><th colspan="2"><abbr title="Headers as initially sent by the client, before any VCL processing.">Original Headers</abbr></th></tr>
71-
// for _, hc := range reqHeadersState {
72-
// if hc.IsOriginalHeader() {
73-
// <tr>
74-
// @renderHeaderDiff(hc, true, getHeaderDiffAttrs(header.OriginalHdr))
75-
// </tr>
76-
// }
77-
// }
71+
for _, h := range tx.ReqHeaders().GetSortedHeaders() {
72+
for _, v := range h.Values(true) {
73+
@renderHeader(h.Name(), v.Value(), getHeaderDiffAttrs(v.State()))
74+
}
75+
}
7876
<tr class="hdr-type"><th colspan="2"><abbr title="State of the headers after VCL processing.">VCL Headers</abbr></th></tr>
79-
// for _, hc := range reqHeadersState {
80-
// <tr>
81-
// @renderHeaderDiff(hc, false, getHeaderDiffAttrs(hc.State()))
82-
// </tr>
83-
// }
77+
for _, h := range tx.ReqHeaders().GetSortedHeaders() {
78+
for _, v := range h.Values(false) {
79+
@renderHeader(h.Name(), v.Value(), getHeaderDiffAttrs(v.State()))
80+
}
81+
}
8482
<tr class="hdr-type"><th colspan="2"><abbr title="Headers as initially sent by the client, before any VCL processing.">Original Response Headers</abbr></th></tr>
85-
// for _, hc := range respHeadersState {
86-
// if hc.IsOriginalHeader() {
87-
// <tr>
88-
// @renderHeaderDiff(hc, true, getHeaderDiffAttrs(header.OriginalHdr))
89-
// </tr>
90-
// }
91-
// }
83+
for _, h := range tx.RespHeaders().GetSortedHeaders() {
84+
for _, v := range h.Values(true) {
85+
@renderHeader(h.Name(), v.Value(), getHeaderDiffAttrs(v.State()))
86+
}
87+
}
9288
<tr class="hdr-type"><th colspan="2"><abbr title="State of the response headers after VCL processing.">VCL Response Headers</abbr></th></tr>
93-
// for _, hc := range respHeadersState {
94-
// <tr>
95-
// @renderHeaderDiff(hc, false, getHeaderDiffAttrs(hc.State()))
96-
// </tr>
97-
// }
89+
for _, h := range tx.RespHeaders().GetSortedHeaders() {
90+
for _, v := range h.Values(false) {
91+
@renderHeader(h.Name(), v.Value(), getHeaderDiffAttrs(v.State()))
92+
}
93+
}
9894
</tr>
9995
</table>
10096
</details>
@@ -106,6 +102,15 @@ templ renderTxHeaderTree(tx *vsl.Transaction, visited map[string]bool) {
106102
}
107103
}
108104

105+
templ renderHeader(name, value string, attrs templ.Attributes) {
106+
<tr>
107+
<th>{ name }</th>
108+
<td { attrs ... }>
109+
{ value }
110+
</td>
111+
</tr>
112+
}
113+
109114
func getHeaderDiffAttrs(state vsl.HdrState) templ.Attributes {
110115
switch state {
111116
case vsl.HdrStateReceived:
@@ -119,14 +124,3 @@ func getHeaderDiffAttrs(state vsl.HdrState) templ.Attributes {
119124
}
120125
return templ.Attributes{"class": "diffOriginal"}
121126
}
122-
123-
// templ renderHeaderDiff(hc vsl.HdrState, original bool, attrs templ.Attributes) {
124-
// <th>{ hc.String() }</th>
125-
// <td { attrs ... }>
126-
// if original {
127-
// { hc.OriginalValue() }
128-
// } else {
129-
// { hc.FinalValue() }
130-
// }
131-
// </td>
132-
// }

pkg/server/templates/content/tab_headers_templ.go

Lines changed: 112 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vsl/header.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package vsl
22

33
import (
44
"net/textproto"
5+
"sort"
56
)
67

78
// The RFCs allow multiple headers with the same name, and both set and unset
@@ -41,11 +42,16 @@ func (s HdrState) String() string {
4142

4243
// Header represents an HTTP header within the VSL
4344
type Header struct {
45+
id int
4446
name string
4547
values []HdrValue // Keeps track of the headers after VCL code execution
4648
receivedValues []HdrValue // Keeps track of the headers that were sent by the client
4749
}
4850

51+
func (h Header) ID() int {
52+
return h.id
53+
}
54+
4955
func (h Header) Name() string {
5056
return h.name
5157
}
@@ -89,7 +95,9 @@ func (h Headers) Add(name string, value string, state HdrState) {
8995
// Check if header already exists
9096
header, exists := h[name]
9197
if !exists {
98+
id := len(h) + 1
9299
header = Header{
100+
id: id,
93101
name: name,
94102
values: []HdrValue{},
95103
receivedValues: []HdrValue{},
@@ -185,6 +193,19 @@ func (h *Headers) Clear() {
185193
}
186194
}
187195

196+
func (h Headers) GetSortedHeaders() []Header {
197+
sorted := make([]Header, 0, len(h))
198+
for _, hdr := range h {
199+
sorted = append(sorted, hdr)
200+
}
201+
202+
sort.Slice(sorted, func(i, j int) bool {
203+
return sorted[i].ID() < sorted[j].ID()
204+
})
205+
206+
return sorted
207+
}
208+
188209
// CanonicalHeaderName returns the canonical format of the
189210
// header name. The canonicalization converts the first
190211
// letter and any letter following a hyphen to upper case;

vsl/parser.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (p *transactionParser) Parse() (TransactionSet, error) {
134134
}
135135

136136
if clientHeaders {
137-
if isVarnishModifiedHeader(record.Name()) {
137+
if isVarnishModifiedHeader(record.Name(), record.Tag()) {
138138
// Store them to process them later
139139
// since deletes only apply to processed headers we should at the end
140140
// only have the processed headers, if instead this header is added directly to 'headers'
@@ -158,7 +158,7 @@ func (p *transactionParser) Parse() (TransactionSet, error) {
158158

159159
// all headers going forward now are considered as processed by VCL
160160
if clientHeaders {
161-
if isVarnishModifiedHeader(record.Name()) {
161+
if isVarnishModifiedHeader(record.Name(), record.Tag()) {
162162
// Unset found while expecting client headers, assume we're on Varnish C code
163163
// add that header to a tempHeaders struct and parse it when the first VCL_call is encountered
164164
tempHeaders.Add(record.Name(), record.Value(), HdrStateReceived)
@@ -301,11 +301,18 @@ func processRecord(line string) (Record, error) {
301301
//
302302
// This includes headers like X-Forwarded-For, Via, and others
303303
// that Varnish may add, remove, or alter during request/response handling.
304-
func isVarnishModifiedHeader(name string) bool {
304+
func isVarnishModifiedHeader(name, tagName string) bool {
305305
if name == "" {
306306
return false
307307
}
308308

309+
// Only consider Recv headers
310+
switch tagName {
311+
case tag.ReqHeader, tag.ReqUnset:
312+
default:
313+
return false
314+
}
315+
309316
switch CanonicalHeaderName(name) {
310317
case "Via",
311318
"X-Forwarded-For",

0 commit comments

Comments
 (0)