Prevent addition of duplicate path prefixes.
I think I understand this now; the failure comes from here: https://golang.org/src/cmd/go/vcs.go#L818 and makes it so one can't both host: - github.com/foo - github.com/foo/bar which would have to clone the latter inside of the former. Fixes #1.
This commit is contained in:
parent
b0ebbf742b
commit
557717c138
@ -31,6 +31,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
return
|
||||
}
|
||||
p.Path = fmt.Sprintf("%s/%s", s.hostname, strings.Trim(req.URL.Path, "/"))
|
||||
if !Valid(p.Path, s.storage.All()) {
|
||||
http.Error(w, fmt.Sprintf("invalid path; prefix already taken %q", req.URL.Path), http.StatusConflict)
|
||||
return
|
||||
}
|
||||
s.storage.Add(p)
|
||||
case "PATCH":
|
||||
default:
|
||||
|
10
storage.go
10
storage.go
@ -2,9 +2,19 @@ package vain
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func Valid(p string, packages []Package) bool {
|
||||
for _, pkg := range packages {
|
||||
if strings.HasPrefix(pkg.Path, p) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type MemStore struct {
|
||||
l sync.RWMutex
|
||||
p map[string]Package
|
||||
|
57
vain_test.go
57
vain_test.go
@ -35,3 +35,60 @@ func TestVcsStrings(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestValid(t *testing.T) {
|
||||
tests := []struct {
|
||||
pkgs []Package
|
||||
in string
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
pkgs: []Package{},
|
||||
in: "bobo",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
pkgs: []Package{
|
||||
{Path: ""},
|
||||
},
|
||||
in: "bobo",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
pkgs: []Package{
|
||||
{Path: "bobo"},
|
||||
},
|
||||
in: "bobo",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
pkgs: []Package{
|
||||
{Path: "a/b/c"},
|
||||
},
|
||||
in: "a/b/c",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
pkgs: []Package{
|
||||
{Path: "foo/bar"},
|
||||
{Path: "foo/baz"},
|
||||
},
|
||||
in: "foo",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
pkgs: []Package{
|
||||
{Path: "bilbo"},
|
||||
{Path: "frodo"},
|
||||
},
|
||||
in: "foo/bar/baz",
|
||||
want: true,
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
got := Valid(test.in, test.pkgs)
|
||||
if got != test.want {
|
||||
t.Errorf("Incorrect testing of %q against %#v; got %t, want %t", test.in, test.pkgs, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user