Complete new bucket layout with preview
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
8a313c2b28
commit
b439555c46
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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, "",
|
||||
|
|
Loading…
Reference in New Issue