Browse Source

Fix 404 errors, add SSL_CERT_FILE to Dockerfile

Previously, missing files would return a "corrupt metadata" error
because errors were not being properly handled in the S3 backend. This
change catches not found errors and passes them up to be handled
accordingly.

Alpine Linux puts the CA cert bundle at /etc/ssl/cert.pem by default; to
ensure that Go looks in that location, we now set the SSL_CERT_FILE
environment variable.
pull/156/head
mutantmonkey 6 years ago
parent
commit
d509f46a7f
  1. 2
      Dockerfile
  2. 30
      backends/s3/s3.go

2
Dockerfile

@ -13,6 +13,8 @@ FROM alpine:3.8
COPY --from=build /go/bin/linx-server /usr/local/bin/linx-server COPY --from=build /go/bin/linx-server /usr/local/bin/linx-server
ENV GOPATH /go ENV GOPATH /go
ENV SSL_CERT_FILE /etc/ssl/cert.pem
COPY static /go/src/github.com/andreimarcu/linx-server/static/ COPY static /go/src/github.com/andreimarcu/linx-server/static/
COPY templates /go/src/github.com/andreimarcu/linx-server/templates/ COPY templates /go/src/github.com/andreimarcu/linx-server/templates/

30
backends/s3/s3.go

@ -22,11 +22,10 @@ type S3Backend struct {
} }
func (b S3Backend) Delete(key string) error { func (b S3Backend) Delete(key string) error {
input := &s3.DeleteObjectInput{
_, err := b.svc.DeleteObject(&s3.DeleteObjectInput{
Bucket: aws.String(b.bucket), Bucket: aws.String(b.bucket),
Key: aws.String(key), Key: aws.String(key),
}
_, err := b.svc.DeleteObject(input)
})
if err != nil { if err != nil {
return err return err
} }
@ -34,23 +33,22 @@ func (b S3Backend) Delete(key string) error {
} }
func (b S3Backend) Exists(key string) (bool, error) { func (b S3Backend) Exists(key string) (bool, error) {
input := &s3.HeadObjectInput{
_, err := b.svc.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(b.bucket), Bucket: aws.String(b.bucket),
Key: aws.String(key), Key: aws.String(key),
}
_, err := b.svc.HeadObject(input)
})
return err == nil, err return err == nil, err
} }
func (b S3Backend) Head(key string) (metadata backends.Metadata, err error) { func (b S3Backend) Head(key string) (metadata backends.Metadata, err error) {
input := &s3.HeadObjectInput{
var result *s3.HeadObjectOutput
result, err = b.svc.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(b.bucket), Bucket: aws.String(b.bucket),
Key: aws.String(key), Key: aws.String(key),
}
result, err := b.svc.HeadObject(input)
})
if err != nil { if err != nil {
if aerr, ok := err.(awserr.Error); ok { if aerr, ok := err.(awserr.Error); ok {
if aerr.Code() == s3.ErrCodeNoSuchKey {
if aerr.Code() == s3.ErrCodeNoSuchKey || aerr.Code() == "NotFound" {
err = backends.NotFoundErr err = backends.NotFoundErr
} }
} }
@ -62,14 +60,14 @@ func (b S3Backend) Head(key string) (metadata backends.Metadata, err error) {
} }
func (b S3Backend) Get(key string) (metadata backends.Metadata, r io.ReadCloser, err error) { func (b S3Backend) Get(key string) (metadata backends.Metadata, r io.ReadCloser, err error) {
input := &s3.GetObjectInput{
var result *s3.GetObjectOutput
result, err = b.svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(b.bucket), Bucket: aws.String(b.bucket),
Key: aws.String(key), Key: aws.String(key),
}
result, err := b.svc.GetObject(input)
})
if err != nil { if err != nil {
if aerr, ok := err.(awserr.Error); ok { if aerr, ok := err.(awserr.Error); ok {
if aerr.Code() == s3.ErrCodeNoSuchKey {
if aerr.Code() == s3.ErrCodeNoSuchKey || aerr.Code() == "NotFound" {
err = backends.NotFoundErr err = backends.NotFoundErr
} }
} }
@ -94,7 +92,7 @@ func mapMetadata(m backends.Metadata) map[string]*string {
func unmapMetadata(input map[string]*string) (m backends.Metadata, err error) { func unmapMetadata(input map[string]*string) (m backends.Metadata, err error) {
expiry, err := strconv.ParseInt(aws.StringValue(input["Expiry"]), 10, 64) expiry, err := strconv.ParseInt(aws.StringValue(input["Expiry"]), 10, 64)
if err != nil { if err != nil {
return
return m, err
} }
m.Expiry = time.Unix(expiry, 0) m.Expiry = time.Unix(expiry, 0)
@ -112,7 +110,7 @@ func unmapMetadata(input map[string]*string) (m backends.Metadata, err error) {
func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) { func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) {
tmpDst, err := ioutil.TempFile("", "linx-server-upload") tmpDst, err := ioutil.TempFile("", "linx-server-upload")
if err != nil { if err != nil {
return
return m, err
} }
defer tmpDst.Close() defer tmpDst.Close()
defer os.Remove(tmpDst.Name()) defer os.Remove(tmpDst.Name())

Loading…
Cancel
Save