Documentation
¶
Overview ¶
Package goproxy implements a minimalist Go module proxy handler.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Cacher ¶
type Cacher interface {
// Get gets the matched cache for the name. It returns the
// `os.ErrNotExist` if not found.
//
// It is the caller's responsibility to close the returned
// `io.ReadCloser`.
//
// Note that the returned `io.ReadCloser` can optionally implement the
// following interfaces:
// * `io.Seeker`
// For the Range request header.
// * `interface{ ModTime() time.Time }`
// For the Last-Modified response header.
// * `interface{ Checksum() []byte }`
// For the ETag response header.
Get(ctx context.Context, name string) (io.ReadCloser, error)
// Set sets the content as a cache with the name.
Set(ctx context.Context, name string, content io.Reader) error
}
Cacher defines a set of intuitive methods used to cache module files for the `Goproxy`.
type DirCacher ¶ added in v0.4.0
type DirCacher string
DirCacher implements the `Cacher` using a directory on the local filesystem. If the directory does not exist, it will be created with 0700 permissions.
type Goproxy ¶
type Goproxy struct {
// GoBinName is the name of the Go binary.
//
// If the `GoBinName` is empty, the "go" is used.
//
// Not that the version of the Go binary targeted by the `GoBinName`
// must be at least v1.11.
GoBinName string `mapstructure:"go_bin_name"`
// GoBinEnv is the environment of the Go binary. Each entry is of the
// form "key=value".
//
// If the `GoBinEnv` is nil, the result of the `os.Environ()` is used.
//
// If the `GoBinEnv` contains duplicate environment keys, only the last
// value in the slice for each duplicate key is used.
//
// Note that GOPROXY (with comma-separated list support), GONOPROXY,
// GOSUMDB, GONOSUMDB and GOPRIVATE are built-in supported. It means
// that they can be set even the version of the Go binary targeted by
// the `GoBinName` is before v1.13.
GoBinEnv []string `mapstructure:"go_bin_env"`
// GoBinMaxWorkers is the maximum number of commands allowed for the Go
// binary to execute at the same time.
//
// If the `GoBinMaxWorkers` is zero, there is no limitation.
GoBinMaxWorkers int `mapstructure:"go_bin_max_workers"`
// PathPrefix is the prefix of all request paths. It will be used to
// trim the request paths via the `strings.TrimPrefix`.
//
// If the `PathPrefix` is not empty, it must start with "/", and usually
// should also end with "/".
PathPrefix string `mapstructure:"path_prefix"`
// Cacher is the `Cacher` that used to cache module files.
//
// If the `Cacher` is nil, the module files will be temporarily stored
// in the local disk and discarded as the request ends.
Cacher Cacher `mapstructure:"-"`
// CacherMaxCacheBytes is the maximum number of bytes allowed for the
// `Cacher` to store a cache.
//
// If the `CacherMaxCacheBytes` is zero, there is no limitation.
CacherMaxCacheBytes int `mapstructure:"cacher_max_cache_bytes"`
// ProxiedSUMDBs is the list of proxied checksum databases.
//
// If the `ProxiedSUMDBs` is not nil, each value should be given the
// format of "<sumdb-name>" or "<sumdb-name> <sumdb-URL>". The first
// format can be seen as a shorthand for the second format. In the case
// of the first format, the corresponding checksum database URL will be
// the checksum database name itself as a host with an "https" scheme.
ProxiedSUMDBs []string `mapstructure:"proxied_sumdbs"`
// Transport is used to perform all requests except those started by
// calling the go binary targeted by the `GoBinName`.
//
// If the `Transport` is nil, the `http.DefaultTransport` is used.
Transport http.RoundTripper `mapstructure:"-"`
// ErrorLogger is the `log.Logger` that logs errors that occur while
// proxying.
//
// If the `ErrorLogger` is nil, logging is done via the "log" package's
// standard logger.
ErrorLogger *log.Logger `mapstructure:"-"`
// contains filtered or unexported fields
}
Goproxy is the top-level struct of this project.
Note that the `Goproxy` will not mess with your environment variables, it will still follow your GOPROXY, GONOPROXY, GOSUMDB, GONOSUMDB and GOPRIVATE. It means that you can set GOPROXY to serve the `Goproxy` itself under other proxies, and by setting GONOPROXY and GOPRIVATE to indicate which modules the `Goproxy` should download directly instead of using those proxies. And of course, you can also set GOSUMDB, GONOSUMDB and GOPRIVATE to indicate how the `Goproxy` should verify the modules.
Since GOPROXY with comma-separated list support, GONOPROXY, GOSUMDB, GONOSUMDB and GOPRIVATE were first introduced in Go 1.13, so we implemented a built-in support for them. Now, you can set them even the version of the Go binary targeted by the `Goproxy.GoBinName` is before v1.13.
It is highly recommended not to modify the value of any field of the `Goproxy` after calling the `Goproxy.ServeHTTP`, which will cause unpredictable problems.