mirror of
https://github.com/1f349/gomvn.git
synced 2024-10-18 09:21:48 +01:00
48 lines
957 B
Go
48 lines
957 B
Go
package paths
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
type Paths struct {
|
|
Repository []string
|
|
}
|
|
|
|
func (p Paths) NormalizePath(path string) string {
|
|
if path[0] == '/' {
|
|
path = path[1:]
|
|
}
|
|
if strings.Contains(path, "..") || strings.Contains(path, "~") {
|
|
return ""
|
|
}
|
|
if strings.Count(path, "/") <= 1 {
|
|
return path
|
|
}
|
|
for _, repo := range p.Repository {
|
|
if strings.HasPrefix(path, repo) {
|
|
return path
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (p Paths) ParsePath(req *http.Request) (string, error) {
|
|
path := p.NormalizePath(req.URL.Path)
|
|
if strings.Count(path, "/") < 3 {
|
|
return "", fmt.Errorf("path should be repository/group/artifact")
|
|
}
|
|
return path, nil
|
|
}
|
|
|
|
func (p Paths) ParsePathParts(req *http.Request) (string, string, string, error) {
|
|
path, err := p.ParsePath(req)
|
|
if err != nil {
|
|
return "", "", "", err
|
|
}
|
|
parts := strings.Split(path, "/")
|
|
last := len(parts) - 1
|
|
return parts[0], strings.Join(parts[1:last-1], "/"), parts[last], nil
|
|
}
|