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
|
return
|
||||||
}
|
}
|
||||||
p.Path = fmt.Sprintf("%s/%s", s.hostname, strings.Trim(req.URL.Path, "/"))
|
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)
|
s.storage.Add(p)
|
||||||
case "PATCH":
|
case "PATCH":
|
||||||
default:
|
default:
|
||||||
|
10
storage.go
10
storage.go
@ -2,9 +2,19 @@ package vain
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"strings"
|
||||||
"sync"
|
"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 {
|
type MemStore struct {
|
||||||
l sync.RWMutex
|
l sync.RWMutex
|
||||||
p map[string]Package
|
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