mirror of
https://github.com/kubernetes-sigs/prometheus-adapter.git
synced 2026-04-06 17:57:51 +00:00
Travis seems to be having issues pulling deps, so we'll have to check in the vendor directory and prevent the makefile from trying to regenerate it normally.
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package restful
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
)
|
|
|
|
// Copyright 2018 Ernest Micklei. All rights reserved.
|
|
// Use of this source code is governed by a license
|
|
// that can be found in the LICENSE file.
|
|
|
|
// PathProcessor is extra behaviour that a Router can provide to extract path parameters from the path.
|
|
// If a Router does not implement this interface then the default behaviour will be used.
|
|
type PathProcessor interface {
|
|
// ExtractParameters gets the path parameters defined in the route and webService from the urlPath
|
|
ExtractParameters(route *Route, webService *WebService, urlPath string) map[string]string
|
|
}
|
|
|
|
type defaultPathProcessor struct{}
|
|
|
|
// Extract the parameters from the request url path
|
|
func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath string) map[string]string {
|
|
urlParts := tokenizePath(urlPath)
|
|
pathParameters := map[string]string{}
|
|
for i, key := range r.pathParts {
|
|
var value string
|
|
if i >= len(urlParts) {
|
|
value = ""
|
|
} else {
|
|
value = urlParts[i]
|
|
}
|
|
if strings.HasPrefix(key, "{") { // path-parameter
|
|
if colon := strings.Index(key, ":"); colon != -1 {
|
|
// extract by regex
|
|
regPart := key[colon+1 : len(key)-1]
|
|
keyPart := key[1:colon]
|
|
if regPart == "*" {
|
|
pathParameters[keyPart] = untokenizePath(i, urlParts)
|
|
break
|
|
} else {
|
|
pathParameters[keyPart] = value
|
|
}
|
|
} else {
|
|
// without enclosing {}
|
|
pathParameters[key[1:len(key)-1]] = value
|
|
}
|
|
}
|
|
}
|
|
return pathParameters
|
|
}
|
|
|
|
// Untokenize back into an URL path using the slash separator
|
|
func untokenizePath(offset int, parts []string) string {
|
|
var buffer bytes.Buffer
|
|
for p := offset; p < len(parts); p++ {
|
|
buffer.WriteString(parts[p])
|
|
// do not end
|
|
if p < len(parts)-1 {
|
|
buffer.WriteString("/")
|
|
}
|
|
}
|
|
return buffer.String()
|
|
}
|