diff --git a/.gitignore b/.gitignore index 63da34e..f8624a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ +# Original sites.json + +# Build Files +/s3-proxy + +# Vendor +/vendor diff --git a/config.go b/config.go index bb06500..d4ec2be 100644 --- a/config.go +++ b/config.go @@ -26,6 +26,7 @@ const ( kPrefixKeyName = "S3PROXY_OPTION_PREFIX" kForceSSLKeyName = "S3PROXY_OPTION_FORCE_SSL" kProxiedKeyName = "S3PROXY_OPTION_PROXIED" + kEndpointKeyName = "S3PROXY_OPTION_ENDPOINT" ) func ConfiguredProxyHandler() (http.Handler, error) { @@ -80,6 +81,7 @@ func createSingle() (http.Handler, error) { Prefix: os.Getenv(kPrefixKeyName), ForceSSL: os.Getenv(kForceSSLKeyName) == "true", Proxied: os.Getenv(kProxiedKeyName) == "true", + Endpoint: os.Getenv(kEndpointKeyName), } s := Site{ @@ -103,7 +105,7 @@ func createSingle() (http.Handler, error) { func createSiteHandler(s Site) http.Handler { var handler http.Handler - proxy := NewS3Proxy(s.AWSKey, s.AWSSecret, s.AWSRegion, s.AWSBucket) + proxy := NewS3Proxy(s.AWSKey, s.AWSSecret, s.AWSRegion, s.AWSBucket, s.Options.Endpoint) handler = NewProxyHandler(proxy, s.Options.Prefix) if s.Options.Website { diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..60fedbc --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module github.com/lexi-the-cute/s3-proxy + +go 1.21.0 + +require ( + github.com/aws/aws-sdk-go v1.7.7-0.20170309013840-37f127c188d1 + github.com/gorilla/handlers v0.0.0-20170224193955-13d73096a474 +) + +require ( + github.com/go-ini/ini v1.25.3-0.20170223222215-c437d20015c2 // indirect + github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7 // indirect + github.com/smartystreets/goconvey v1.8.1 // indirect + github.com/stretchr/testify v1.8.4 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2e62eaa --- /dev/null +++ b/go.sum @@ -0,0 +1,24 @@ +github.com/aws/aws-sdk-go v1.7.7-0.20170309013840-37f127c188d1 h1:kiold1f/BW2ImHHXjJdTAVg6IdbitFS8dtBkFdgn2dg= +github.com/aws/aws-sdk-go v1.7.7-0.20170309013840-37f127c188d1/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= +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/go-ini/ini v1.25.3-0.20170223222215-c437d20015c2 h1:fQTW7Ld5mxOCS6aa1a3ncoq0uPA09+p+c/cYil0KI/E= +github.com/go-ini/ini v1.25.3-0.20170223222215-c437d20015c2/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/handlers v0.0.0-20170224193955-13d73096a474 h1:KNovrfevBTefw9X8FKnoaKhKOc+UWmGsQRsiZRTkGl4= +github.com/gorilla/handlers v0.0.0-20170224193955-13d73096a474/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7 h1:SMvOWPJCES2GdFracYbBQh93GXac8fq7HeN6JnpduB8= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +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/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= +github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= +github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= +github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 73eaefa..0974ea0 100644 --- a/main.go +++ b/main.go @@ -30,6 +30,7 @@ type Options struct { Prefix string `json:"prefix"` ForceSSL bool `json:"forceSsl"` Proxied bool `json:"proxied"` + Endpoint string `json:"endpoint"` } func main() { diff --git a/proxy.go b/proxy.go index ac7aa94..7398caf 100644 --- a/proxy.go +++ b/proxy.go @@ -5,6 +5,7 @@ import ( "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/aws/endpoints" ) type S3Proxy interface { @@ -17,10 +18,21 @@ type RealS3Proxy struct { s3 *s3.S3 } -func NewS3Proxy(key, secret, region, bucket string) S3Proxy { +func NewS3Proxy(key, secret, region, bucket, endpoint string) S3Proxy { + endpointResolver := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { + if endpoint != "" { + return endpoints.ResolvedEndpoint{ + URL: endpoint, + }, nil + } + + return endpoints.DefaultResolver().EndpointFor(service, region, optFns...) + } + sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String(region), Credentials: credentials.NewStaticCredentials(key, secret, ""), + EndpointResolver: endpoints.ResolverFunc(endpointResolver), })) return &RealS3Proxy{ diff --git a/vendor/vendor.json b/vendor/vendor.json deleted file mode 100644 index 8b88af3..0000000 --- a/vendor/vendor.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "comment": "", - "heroku": { - "goVersion": "go1.8", - "install": [ - "." - ] - }, - "ignore": "test", - "package": [ - { - "checksumSHA1": "7FqljsUg3Y2h76u1VBZOEPpDdn8=", - "path": "github.com/aws/aws-sdk-go", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "ZEZ4PBsI1pw2HLKmajnpyvNQpRA=", - "path": "github.com/aws/aws-sdk-go/aws", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Y9W+4GimK4Fuxq+vyIskVYFRnX4=", - "path": "github.com/aws/aws-sdk-go/aws/awserr", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "yyYr41HZ1Aq0hWc3J5ijXwYEcac=", - "path": "github.com/aws/aws-sdk-go/aws/awsutil", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "iThCyNRL/oQFD9CF2SYgBGl+aww=", - "path": "github.com/aws/aws-sdk-go/aws/client", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "ieAJ+Cvp/PKv1LpUEnUXpc3OI6E=", - "path": "github.com/aws/aws-sdk-go/aws/client/metadata", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Fl8vRSCY0MbM04cmiz/0MID+goA=", - "path": "github.com/aws/aws-sdk-go/aws/corehandlers", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "zu5C95rmCZff6NYZb62lEaT5ibE=", - "path": "github.com/aws/aws-sdk-go/aws/credentials", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "u3GOAJLmdvbuNUeUEcZSEAOeL/0=", - "path": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "NUJUTWlc1sV8b7WjfiYc4JZbXl0=", - "path": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "6cj/zsRmcxkE1TLS+v910GbQYg0=", - "path": "github.com/aws/aws-sdk-go/aws/credentials/stscreds", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "lqh3fG7wCochvB4iHAZJuhhEJW0=", - "path": "github.com/aws/aws-sdk-go/aws/defaults", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "/EXbk/z2TWjWc1Hvb4QYs3Wmhb8=", - "path": "github.com/aws/aws-sdk-go/aws/ec2metadata", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "RTIgFaXgsZqDSq9lyZrY9E7q83E=", - "path": "github.com/aws/aws-sdk-go/aws/endpoints", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "M78rTxU55Qagqr3MYj91im2031E=", - "path": "github.com/aws/aws-sdk-go/aws/request", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "u6tKvFGcRQ1xtby1ONjgyUTgcpg=", - "path": "github.com/aws/aws-sdk-go/aws/session", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "0FvPLvkBUpTElfUc/FZtPsJfuV0=", - "path": "github.com/aws/aws-sdk-go/aws/signer/v4", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "wk7EyvDaHwb5qqoOP/4d3cV0708=", - "path": "github.com/aws/aws-sdk-go/private/protocol", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "ZqY5RWavBLWTo6j9xqdyBEaNFRk=", - "path": "github.com/aws/aws-sdk-go/private/protocol/query", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Drt1JfLMa0DQEZLWrnMlTWaIcC8=", - "path": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "szZSLm3BlYkL3vqlZhNAlYk8iwM=", - "path": "github.com/aws/aws-sdk-go/private/protocol/rest", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "ODo+ko8D6unAxZuN1jGzMcN4QCc=", - "path": "github.com/aws/aws-sdk-go/private/protocol/restxml", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "lZ1z4xAbT8euCzKoAsnEYic60VE=", - "path": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Eo9yODN5U99BK0pMzoqnBm7PCrY=", - "path": "github.com/aws/aws-sdk-go/private/waiter", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "eEWM4wKzVbRqAwIy3MdMCDUGs2s=", - "path": "github.com/aws/aws-sdk-go/service/s3", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Knj17ZMPWkGYTm2hZxEgnuboMM4=", - "path": "github.com/aws/aws-sdk-go/service/sts", - "revision": "37f127c188d13d8cbdd1abc6969ab33a79ecaa38", - "revisionTime": "2017-03-09T01:38:40Z" - }, - { - "checksumSHA1": "Cu67hH9Sg86TBZb4An5owwfzEN0=", - "path": "github.com/go-ini/ini", - "revision": "c437d20015c2ab6454b7a66a13109ff0fb99e17a", - "revisionTime": "2017-02-23T22:22:15Z" - }, - { - "checksumSHA1": "+/oy2SsS8YvHVvQGcWUDbaajeXQ=", - "path": "github.com/gorilla/handlers", - "revision": "13d73096a474cac93275c679c7b8a2dc17ddba82", - "revisionTime": "2017-02-24T19:39:55Z" - }, - { - "checksumSHA1": "0ZrwvB6KoGPj2PoDNSEJwxQ6Mog=", - "path": "github.com/jmespath/go-jmespath", - "revision": "bd40a432e4c76585ef6b72d3fd96fb9b6dc7b68d", - "revisionTime": "2016-08-03T19:07:31Z" - } - ], - "rootPath": "github.com/jcomo/s3-proxy" -}