README
Goproxy
A minimalist Go module proxy handler.
Goproxy has fully implemented the Go's
module proxy protocol.
Our goal is to find the most dead simple way to provide a minimalist handler
that can act as a full-featured Go module proxy for those who want to build
their own proxies. Yeah, there is no Makefile
, no configuration files, no
crazy file organization, no lengthy documentation, no annoying stuff, just a
goproxy.Goproxy
that
implements the http.Handler
.
Features
- Extremely easy to use
- One struct:
goproxy.Goproxy
- Two interfaces:
goproxy.Cacher
andgoproxy.Cache
- One struct:
- Built-in
GOPROXY
support- Defaulted to
https://proxy.golang.org,direct
(just like what Go is doing right now)
- Defaulted to
- Built-in
GONOPROXY
support - Built-in
GOSUMDB
support- Defaulted to
sum.golang.org
(just like what Go is doing right now)
- Defaulted to
- Built-in
GONOSUMDB
support - Built-in
GOPRIVATE
support - Supports serving under other Go module proxies by setting
GOPROXY
- Supports proxying checksum databases
- Supports multiple mainstream implementations of the
goproxy.Cacher
- Disk:
cacher.Disk
- MinIO:
cacher.MinIO
- Google Cloud Storage:
cacher.GCS
- Amazon Simple Storage Service:
cacher.S3
- Microsoft Azure Blob Storage:
cacher.MABS
- DigitalOcean Spaces:
cacher.DOS
- Alibaba Cloud Object Storage Service:
cacher.OSS
- Qiniu Cloud Kodo:
cacher.Kodo
- Disk:
Installation
Open your terminal and execute
$ go get github.com/goproxy/goproxy
done.
The only requirement is the Go, at least v1.13.
Quick Start
Create a file named goproxy.go
package main
import (
"net/http"
"github.com/goproxy/goproxy"
)
func main() {
http.ListenAndServe("localhost:8080", goproxy.New())
}
and run it
$ go run goproxy.go
then try it by setting GOPROXY
to http://localhost:8080
by following the
instructions below. In addition, we also recommend that you set GO111MODULE
to
on
instead of auto
when you are working with Go modules.
Go 1.13 and above (RECOMMENDED)
Open your terminal and execute
$ go env -w GOPROXY=http://localhost:8080,direct
done.
macOS or Linux
Open your terminal and execute
$ export GOPROXY=http://localhost:8080
or
$ echo "export GOPROXY=http://localhost:8080" >> ~/.profile && source ~/.profile
done.
Windows
Open your PowerShell and execute
C:\> $env:GOPROXY = "http://localhost:8080"
or
1. Open the Start Search, type in "env"
2. Choose the "Edit the system environment variables"
3. Click the "Environment Variables…" button
4. Under the "User variables for <YOUR_USERNAME>" section (the upper half)
5. Click the "New..." button
6. Choose the "Variable name" input bar, type in "GOPROXY"
7. Choose the "Variable value" input bar, type in "http://localhost:8080"
8. Click the "OK" button
done.
Community
If you want to discuss Goproxy, or ask questions about it, simply post questions or ideas here.
Contributing
If you want to help build Goproxy, simply follow this to send pull requests here.
License
This project is licensed under the Unlicense.
License can be found here.
Documentation
Overview ¶
Package goproxy implements a minimalist Go module proxy handler.
Index ¶
Constants ¶
Variables ¶
var ErrCacheNotFound = errors.New("cache not found")
ErrCacheNotFound is the error resulting if a path search failed to find a cache.
Functions ¶
Types ¶
type Cache ¶
type Cache interface { io.Reader io.Seeker io.Closer // Name returns the unique Unix path style name. Name() string // MIMEType returns the MIME type. MIMEType() string // Size returns the length in bytes. Size() int64 // ModTime returns the modification time. ModTime() time.Time // Checksum returns the checksum. Checksum() []byte }
Cache is the cache unit of the `Cacher`.
type Cacher ¶
type Cacher interface { // NewHash returns a new instance of the `hash.Hash` used to compute the // checksums of the caches. NewHash() hash.Hash // Cache returns the matched `Cache` for the name from the underlying // cacher. It returns the `ErrCacheNotFound` if not found. // // It is the caller's responsibility to close the returned `Cache`. Cache(ctx context.Context, name string) (Cache, error) // SetCache sets the c to the underlying cacher. // // It is the caller's responsibility to close the c. SetCache(ctx context.Context, c Cache) error }
Cacher is the interface that defines a set of methods used to cache module files for the `Goproxy`.
If you are looking for some useful implementations of the `Cacher`, simply visit the "github.com/goproxy/goproxy/cacher" package.
type Goproxy ¶
type Goproxy struct { // GoBinName is the name of the Go binary. // // The version of the Go binary target by the `GoBinName` must be at // least v1.11. // // Default value: "go" GoBinName string `mapstructure:"go_bin_name"` // GoBinEnv is the environment of the Go binary. Each entry is of the // form "key=value". // // 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 target by the // `GoBinName` is before v1.13. // // If the `GoBinEnv` contains duplicate environment keys, only the last // value in the slice for each duplicate key is used. // // Default value: `os.Environ()` 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. // // Default value: 0 GoBinMaxWorkers int `mapstructure:"go_bin_max_workers"` // GoBinFetchTimeout is the maximum duration allowed for the Go binary // to fetch a module. // // Default value: `time.Minute` GoBinFetchTimeout time.Duration `mapstructure:"go_bin_fetch_timeout"` // 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 should start with "/". // // Default value: "" 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. // // Default value: nil Cacher Cacher `mapstructure:"cacher"` // CacherMaxCacheBytes is the maximum number of bytes allowed for the // `Cacher` to store a cache. // // If the `CacherMaxCacheBytes` is zero, there is no limitation. // // Default value: 0 CacherMaxCacheBytes int `mapstructure:"cacher_max_cache_bytes"` // ProxiedSUMDBs is the proxied checksum databases. 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. // // Default value: nil ProxiedSUMDBs []string `mapstructure:"proxied_sumdbs"` // InsecureMode indicates whether the insecure mode is enabled. // // If the `InsecureMode` is true, TLS accepts any certificate presented // by the server and any host name in that certificate. InsecureMode bool `mapstructure:"insecure_mode"` // 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. // // Default value: nil 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 target 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.
The new instances of the `Goproxy` should only be created by calling the `New`.
Directories
Path | Synopsis |
---|---|
cacher |