working commit
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
6
go.mod
6
go.mod
@@ -2,10 +2,14 @@ module client
|
|||||||
|
|
||||||
go 1.25.0
|
go 1.25.0
|
||||||
|
|
||||||
require github.com/stretchr/testify v1.11.1
|
require (
|
||||||
|
github.com/opencontainers/image-spec v1.1.0
|
||||||
|
github.com/stretchr/testify v1.11.1
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
6
go.sum
6
go.sum
@@ -1,5 +1,11 @@
|
|||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
|
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
|
||||||
|
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
|
||||||
|
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
||||||
|
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MediaTypeDDMLv2 = "application/vnd.docker.distribution.manifest.list.v2+json"
|
MediaTypeDDMLv2 = "application/vnd.docker.distribution.manifest.list.v2+json"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package client
|
package repocli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|||||||
95
referer.go
95
referer.go
@@ -1,95 +0,0 @@
|
|||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Repository struct {
|
|
||||||
urlobj *url.URL
|
|
||||||
user, pass string
|
|
||||||
base string
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewRepository(rawrepo string) (*Repository, error) {
|
|
||||||
repo := &Repository{}
|
|
||||||
if !strings.Contains(rawrepo, "://") {
|
|
||||||
rawrepo = "https://" + rawrepo
|
|
||||||
}
|
|
||||||
urlobj, err := url.Parse(rawrepo)
|
|
||||||
if err != nil {
|
|
||||||
return repo, err
|
|
||||||
}
|
|
||||||
if urlobj.User != nil {
|
|
||||||
repo.user = urlobj.User.Username()
|
|
||||||
repo.pass, _ = urlobj.User.Password()
|
|
||||||
urlobj.User = nil
|
|
||||||
}
|
|
||||||
repo.urlobj = urlobj
|
|
||||||
repo.base = repo.urlobj.Path
|
|
||||||
repo.urlobj.Path = "/"
|
|
||||||
repo.urlobj = urlobj
|
|
||||||
|
|
||||||
return repo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Manifest(tag string) string {
|
|
||||||
curl := repo.urlobj.JoinPath("/v2", repo.base, "/manifests", tag)
|
|
||||||
return curl.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Blob(digest string) string {
|
|
||||||
curl := repo.urlobj.JoinPath("/v2", repo.base, "/blobs", digest)
|
|
||||||
return curl.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Upload() string {
|
|
||||||
curl := repo.urlobj.JoinPath("/v2", repo.base, "/blobs/uploads/")
|
|
||||||
return curl.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Patch(loc string) (string, error) {
|
|
||||||
var curl *url.URL
|
|
||||||
var out string
|
|
||||||
var err error
|
|
||||||
if isUUID(loc) {
|
|
||||||
curl = repo.urlobj.JoinPath("/v2/", repo.base, "/blobs/uploads/", loc)
|
|
||||||
return curl.String(), nil
|
|
||||||
}
|
|
||||||
if strings.Contains(loc, "://") {
|
|
||||||
curl, err = url.Parse(loc)
|
|
||||||
if err != nil {
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
curl = repo.urlobj.JoinPath(loc)
|
|
||||||
}
|
|
||||||
out = curl.String()
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Put(loc, digest string) (string, error) {
|
|
||||||
var curl *url.URL
|
|
||||||
var out string
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if isUUID(loc) {
|
|
||||||
curl = repo.urlobj.JoinPath("/v2/", repo.base, "/blobs/uploads/", loc)
|
|
||||||
} else if strings.Contains(loc, "://") {
|
|
||||||
curl, err = url.Parse(loc)
|
|
||||||
if err != nil {
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
curl = repo.urlobj.JoinPath(loc)
|
|
||||||
}
|
|
||||||
query := curl.Query()
|
|
||||||
query.Set("digest", digest)
|
|
||||||
curl.RawQuery = query.Encode()
|
|
||||||
out = curl.String()
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repository) Userinfo() (string, string) {
|
|
||||||
return repo.user, repo.pass
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user