|
3 | 3 | package vsl |
4 | 4 |
|
5 | 5 | import ( |
| 6 | + "strings" |
6 | 7 | "testing" |
| 8 | + |
| 9 | + "github.com/aorith/varnishlog-parser/assets" |
7 | 10 | ) |
8 | 11 |
|
9 | 12 | func TestHeadersAddAndValues(t *testing.T) { |
@@ -87,3 +90,118 @@ func TestCanonicalHeaderName(t *testing.T) { |
87 | 90 | } |
88 | 91 | } |
89 | 92 | } |
| 93 | + |
| 94 | +type testHeader struct { |
| 95 | + name string |
| 96 | + values []HdrValue |
| 97 | +} |
| 98 | + |
| 99 | +func TestHeadersFromCompleteVCL(t *testing.T) { |
| 100 | + ts, err := NewTransactionParser(strings.NewReader(assets.VCLComplete1)).Parse() |
| 101 | + if err != nil { |
| 102 | + t.Fatalf("vsl parser failed: %s", err) |
| 103 | + } |
| 104 | + |
| 105 | + tt1 := []testHeader{ |
| 106 | + {name: "Host", values: []HdrValue{{value: "www.example1.org", state: HdrStateReceived}}}, |
| 107 | + {name: "User-Agent", values: []HdrValue{{value: "curl/8.7.1", state: HdrStateReceived}}}, |
| 108 | + {name: "Accept", values: []HdrValue{{value: "*/*", state: HdrStateReceived}}}, |
| 109 | + {name: "Secret", values: []HdrValue{{value: "1234", state: HdrStateReceived}}}, |
| 110 | + {name: "X-Forwarded-For", values: []HdrValue{{value: "1.1.1.1, 2.2.2.2", state: HdrStateReceived}}}, |
| 111 | + {name: "Via", values: []HdrValue{}}, |
| 112 | + {name: "Xid", values: []HdrValue{}}, |
| 113 | + {name: "X-Test-Header", values: []HdrValue{}}, |
| 114 | + } |
| 115 | + |
| 116 | + testHeaders(t, tt1, ts.Transactions()[1].ReqHeaders.GetSortedHeaders(), true) |
| 117 | + |
| 118 | + tt2 := []testHeader{ |
| 119 | + {name: "Host", values: []HdrValue{{value: "www.example1.org", state: HdrStateReceived}}}, |
| 120 | + {name: "User-Agent", values: []HdrValue{{value: "curl/8.7.1", state: HdrStateReceived}}}, |
| 121 | + {name: "Accept", values: []HdrValue{{value: "*/*", state: HdrStateReceived}}}, |
| 122 | + {name: "Secret", values: []HdrValue{{value: "1234", state: HdrStateReceived}}}, |
| 123 | + {name: "X-Forwarded-For", values: []HdrValue{{value: "1.1.1.1, 2.2.2.2, 192.168.65.1", state: HdrStateModified}}}, |
| 124 | + {name: "Via", values: []HdrValue{{value: "1.1 b736436225f7 (Varnish/7.5)", state: HdrStateAdded}}}, |
| 125 | + {name: "Xid", values: []HdrValue{{value: "262", state: HdrStateAdded}}}, |
| 126 | + {name: "X-Test-Header", values: []HdrValue{{value: "Test Value", state: HdrStateDeleted}}}, |
| 127 | + } |
| 128 | + |
| 129 | + testHeaders(t, tt2, ts.Transactions()[1].ReqHeaders.GetSortedHeaders(), false) |
| 130 | + |
| 131 | + tt3 := []testHeader{ |
| 132 | + {name: "Date", values: []HdrValue{{value: "Fri, 01 Nov 2024 19:59:58 GMT", state: HdrStateReceived}}}, |
| 133 | + {name: "Server", values: []HdrValue{{value: "Varnish", state: HdrStateReceived}}}, |
| 134 | + {name: "X-Varnish", values: []HdrValue{{value: "2", state: HdrStateReceived}, {value: "262", state: HdrStateReceived}}}, |
| 135 | + {name: "Content-Type", values: []HdrValue{{value: "text/html; charset=utf-8", state: HdrStateReceived}}}, |
| 136 | + {name: "Content-Length", values: []HdrValue{{value: "82", state: HdrStateReceived}}}, |
| 137 | + {name: "Cache-Control", values: []HdrValue{{value: "max-age=5", state: HdrStateReceived}}}, |
| 138 | + {name: "Age", values: []HdrValue{{value: "0", state: HdrStateReceived}}}, |
| 139 | + {name: "Via", values: []HdrValue{{value: "1.1 b736436225f7 (Varnish/7.5)", state: HdrStateReceived}}}, |
| 140 | + {name: "Accept-Ranges", values: []HdrValue{{value: "bytes", state: HdrStateReceived}}}, |
| 141 | + {name: "X-Greet", values: []HdrValue{}}, |
| 142 | + {name: "Connection", values: []HdrValue{}}, |
| 143 | + {name: "Transfer-Encoding", values: []HdrValue{}}, |
| 144 | + } |
| 145 | + |
| 146 | + testHeaders(t, tt3, ts.Transactions()[1].RespHeaders.GetSortedHeaders(), true) |
| 147 | + |
| 148 | + tt4 := []testHeader{ |
| 149 | + {name: "Date", values: []HdrValue{{value: "Fri, 01 Nov 2024 19:59:58 GMT", state: HdrStateReceived}}}, |
| 150 | + {name: "Server", values: []HdrValue{{value: "Varnish", state: HdrStateReceived}}}, |
| 151 | + {name: "X-Varnish", values: []HdrValue{{value: "2", state: HdrStateReceived}, {value: "262", state: HdrStateReceived}}}, |
| 152 | + {name: "Content-Type", values: []HdrValue{{value: "text/html; charset=utf-8", state: HdrStateReceived}}}, |
| 153 | + {name: "Content-Length", values: []HdrValue{{value: "82", state: HdrStateDeleted}}}, |
| 154 | + {name: "Cache-Control", values: []HdrValue{{value: "max-age=5", state: HdrStateReceived}}}, |
| 155 | + {name: "Age", values: []HdrValue{{value: "0", state: HdrStateReceived}}}, |
| 156 | + {name: "Via", values: []HdrValue{{value: "1.1 b736436225f7 (Varnish/7.5)", state: HdrStateReceived}}}, |
| 157 | + {name: "Accept-Ranges", values: []HdrValue{{value: "bytes", state: HdrStateReceived}}}, |
| 158 | + {name: "X-Greet", values: []HdrValue{{value: "Hello", state: HdrStateAdded}}}, |
| 159 | + {name: "Connection", values: []HdrValue{{value: "keep-alive", state: HdrStateAdded}}}, |
| 160 | + {name: "Transfer-Encoding", values: []HdrValue{{value: "chunked", state: HdrStateAdded}}}, |
| 161 | + } |
| 162 | + |
| 163 | + testHeaders(t, tt4, ts.Transactions()[1].RespHeaders.GetSortedHeaders(), false) |
| 164 | + |
| 165 | + ts, err = NewTransactionParser(strings.NewReader(assets.VCLCached)).Parse() |
| 166 | + if err != nil { |
| 167 | + t.Fatalf("vsl parser failed: %s", err) |
| 168 | + } |
| 169 | + |
| 170 | + tt5 := []testHeader{ |
| 171 | + {name: "Host", values: []HdrValue{{value: "varnishlog.iou.re", state: HdrStateReceived}}}, |
| 172 | + {name: "Accept", values: []HdrValue{{value: "*/*", state: HdrStateReceived}}}, |
| 173 | + {name: "Cached", values: []HdrValue{{value: "1", state: HdrStateReceived}}}, |
| 174 | + {name: "User-Agent", values: []HdrValue{{value: "hurl/7.0.0", state: HdrStateReceived}}}, |
| 175 | + {name: "X-Forwarded-For", values: []HdrValue{{value: "1.2.3.4, 192.168.65.1", state: HdrStateModified}}}, |
| 176 | + {name: "Via", values: []HdrValue{{value: "1.1 e088e52945df (Varnish/7.7)", state: HdrStateAdded}}}, |
| 177 | + {name: "Whoami", values: []HdrValue{{value: "1", state: HdrStateAdded}}}, |
| 178 | + } |
| 179 | + |
| 180 | + testHeaders(t, tt5, ts.Transactions()[0].ReqHeaders.GetSortedHeaders(), false) |
| 181 | +} |
| 182 | + |
| 183 | +func testHeaders(t *testing.T, tt []testHeader, headers []Header, received bool) { |
| 184 | + want := []testHeader{} |
| 185 | + for _, v := range headers { |
| 186 | + th := testHeader{name: v.name, values: v.Values(received)} |
| 187 | + want = append(want, th) |
| 188 | + } |
| 189 | + |
| 190 | + if len(want) != len(tt) { |
| 191 | + t.Fatalf("ReqHeaders len; want %d, got %d", len(want), len(tt)) |
| 192 | + } |
| 193 | + |
| 194 | + for i := range want { |
| 195 | + if want[i].name != tt[i].name { |
| 196 | + t.Errorf("ReqHeaders; want %v, got %v", want[i].name, tt[i].name) |
| 197 | + } |
| 198 | + if len(want[i].values) != len(tt[i].values) { |
| 199 | + t.Fatalf("ReqHeaders values len; %s; want %d, got %d", want[i].name, len(want[i].values), len(tt[i].values)) |
| 200 | + } |
| 201 | + for j := range want[i].values { |
| 202 | + if want[i].values[j].value != tt[i].values[j].value || want[i].values[j].state != tt[i].values[j].state { |
| 203 | + t.Errorf("ReqHeaders; values[%d] %s; want %v, got %v", j, want[i].name, want[i].values[j], tt[i].values[j]) |
| 204 | + } |
| 205 | + } |
| 206 | + } |
| 207 | +} |
0 commit comments