diff --git a/cmd/preview/preview.go b/cmd/preview/preview.go index d4d93d8..e27779b 100644 --- a/cmd/preview/preview.go +++ b/cmd/preview/preview.go @@ -4,16 +4,17 @@ import ( "fmt" "log" "net/http" - "net/url" "sync" "time" "git.makerforce.io/photos/photos/internal/httphelpers" lib "git.makerforce.io/photos/photos/pkg/bucket" - "github.com/minio/minio-go" + "git.makerforce.io/photos/photos/pkg/credentials" + "git.makerforce.io/photos/photos/pkg/signer" + "github.com/davidbyttow/govips/pkg/vips" ) -var creds *credentials.Cred +var creds *credentials.Client var sig *signer.Signer type resizeOperation struct { @@ -44,18 +45,18 @@ func main() { transport := &http.Transport{ MaxIdleConns: 4, MaxIdleConnsPerHost: 4, - IdleConnTimeout: 30 * time.Second, + IdleConnTimeout: 60 * time.Second, DisableCompression: true, } http.DefaultClient = &http.Client{ Transport: transport, - Timeout: 5 * time.Second, + Timeout: 60 * time.Second, } server := &http.Server{ Addr: ":8003", ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, + WriteTimeout: 60 * time.Second, } http.HandleFunc("/update", update) err = server.ListenAndServe() @@ -65,6 +66,8 @@ func main() { } func update(w http.ResponseWriter, req *http.Request) { + var err error + if req.Method != http.MethodPost { err := fmt.Errorf("%w: %v", httphelpers.ErrorMethodNotAllowed, req.Method) httphelpers.ErrorResponse(w, err) @@ -94,6 +97,7 @@ func update(w http.ResponseWriter, req *http.Request) { httphelpers.ErrorResponse(w, err) return } + log.Printf("Got credentials") // Obtain preview options /* @@ -101,6 +105,7 @@ func update(w http.ResponseWriter, req *http.Request) { previewOptions := bucketMetadata.PreviewOptions */ previewOptions := lib.DefaultPreviewOptions() + log.Printf("Preview options: %v", previewOptions) // Get photo original, err := getPhoto(bucket, cred, photo) @@ -108,6 +113,7 @@ func update(w http.ResponseWriter, req *http.Request) { httphelpers.ErrorResponse(w, err) return } + log.Printf("Original photo filesize: %v", len(original)) // First, extract photo size width, height, err := readsize(original) @@ -115,10 +121,11 @@ func update(w http.ResponseWriter, req *http.Request) { httphelpers.ErrorResponse(w, err) return } - s := bucket.PhotoMetadataSize{ + s := lib.PhotoMetadataSize{ Width: width, Height: height, } + log.Printf("Photo size: %v", s) err = putPhotoMetadataSize(bucket, cred, photo, s) if err != nil { httphelpers.ErrorResponse(w, err) @@ -126,6 +133,7 @@ func update(w http.ResponseWriter, req *http.Request) { } // Do other resizes + log.Printf("Starting resizes") resizes := make([]resizeOperation, len(previewOptions)) for i := range resizes { resizes[i] = resizeOperation{ @@ -172,7 +180,7 @@ func update(w http.ResponseWriter, req *http.Request) { wg.Add(1) go func() { preview := photo.GetPreview(op.previewOption) - err := client.PutPreview(bucket, preview, op.output) + err := putPreview(bucket, cred, preview, op.output) log.Printf("Uploaded photo %s at h%dq%d: %v", photo, op.previewOption.Height, op.previewOption.Quality, err) op.err = err wg.Done() @@ -192,5 +200,6 @@ func update(w http.ResponseWriter, req *http.Request) { for _, op := range resizes { timings = append(timings, op.took) } + log.Printf("Resizes took: %v", timings) w.Header().Add("X-Debug-Resize-Timings", fmt.Sprintf("%v", timings)) } diff --git a/cmd/preview/req.go b/cmd/preview/req.go index 6feaa76..3b19774 100644 --- a/cmd/preview/req.go +++ b/cmd/preview/req.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "io/ioutil" "net/http" @@ -12,7 +13,7 @@ import ( // TODO: handle errors nicer func getPhoto(bucket lib.Bucket, cred credentials.Credential, photo lib.Photo) ([]byte, error) { - unsignedReq, err := http.NewRequest(http.MethodGET, bucket.URL(photo).String(), nil) + unsignedReq, err := http.NewRequest(http.MethodGet, bucket.URL(photo).String(), nil) if err != nil { return nil, err } @@ -40,7 +41,23 @@ func putPhotoMetadataSize(bucket lib.Bucket, cred credentials.Credential, photo if err != nil { return err } - unsignedReq, err := http.NewRequest(http.MethodPUT, bucket.URL(photo.MetadataSize()).String(), bytes.NewBuffer(buf)) + unsignedReq, err := http.NewRequest(http.MethodPut, bucket.URL(photo.MetadataSize()).String(), bytes.NewBuffer(buf)) + if err != nil { + return err + } + signedReq := sig.Sign(unsignedReq, cred) + + resp, err := http.DefaultClient.Do(signedReq) + if err != nil { + return err + } + defer resp.Body.Close() + + return httphelpers.ErrorFromStatus(resp.StatusCode) +} + +func putPreview(bucket lib.Bucket, cred credentials.Credential, preview lib.Preview, buf []byte) error { + unsignedReq, err := http.NewRequest(http.MethodPut, bucket.URL(preview).String(), bytes.NewBuffer(buf)) if err != nil { return err } diff --git a/pkg/bucket/bucket.go b/pkg/bucket/bucket.go index cf7882b..d6ac7ac 100644 --- a/pkg/bucket/bucket.go +++ b/pkg/bucket/bucket.go @@ -17,7 +17,7 @@ func (b Bucket) Validate() error { // Ensure is URL u, err := url.ParseRequestURI(string(b)) if err != nil { - return fmt.Errorf("%w: %w: %v", ErrorInvalidBucket, err, b) + return fmt.Errorf("%w: %v: %v", ErrorInvalidBucket, err.Error(), b) } if u.Scheme != "http" && u.Scheme != "https" { return fmt.Errorf("%w: %v", ErrorInvalidBucket, b) diff --git a/pkg/signer/signer.go b/pkg/signer/signer.go index c1b404e..e5de7b9 100644 --- a/pkg/signer/signer.go +++ b/pkg/signer/signer.go @@ -67,6 +67,8 @@ func (s *Signer) PreSignWrite(req *http.Request, cred credentials.Credential) *h } func (s *Signer) Sign(req *http.Request, cred credentials.Credential) *http.Request { + // All payloads unsigned + req.Header.Set("X-Amz-Content-Sha256", "UNSIGNED-PAYLOAD") signedReq := signer.SignV4( *req, cred.AccessKey, cred.SecretKey, "",