caddy/caddyhttp/push/link_parser.go
Mateusz Gajewski 6d7462ac99 push: Allow pushing multiple resources via Link header (#1798)
* Allow pushing multiple resources via Link header

* Add nopush test case

* Extract Link header parsing to separate function

* Parser regexp-free

* Remove dead code, thx gometalinter

* Redundant condition - won't happen

* Reduce duplication
2017-08-28 19:38:29 -06:00

64 lines
1.2 KiB
Go

package push
import (
"strings"
)
const (
commaSeparator = ","
semicolonSeparator = ";"
equalSeparator = "="
)
type linkResource struct {
uri string
params map[string]string
}
// parseLinkHeader is responsible for parsing Link header and returning list of found resources.
//
// Accepted formats are:
// Link: </resource>; as=script
// Link: </resource>; as=script,</resource2>; as=style
// Link: </resource>;</resource2>
func parseLinkHeader(header string) []linkResource {
resources := []linkResource{}
if header == "" {
return resources
}
for _, link := range strings.Split(header, commaSeparator) {
l := linkResource{params: make(map[string]string)}
li, ri := strings.Index(link, "<"), strings.Index(link, ">")
if li == -1 || ri == -1 {
continue
}
l.uri = strings.TrimSpace(link[li+1 : ri])
for _, param := range strings.Split(strings.TrimSpace(link[ri+1:]), semicolonSeparator) {
parts := strings.SplitN(strings.TrimSpace(param), equalSeparator, 2)
key := strings.TrimSpace(parts[0])
if key == "" {
continue
}
if len(parts) == 1 {
l.params[key] = key
}
if len(parts) == 2 {
l.params[key] = strings.TrimSpace(parts[1])
}
}
resources = append(resources, l)
}
return resources
}