dashboard / erock/pico / feat(storage): base storage fn #69 rss

accepted · opened on 2025-06-08T14:58:33Z by erock
Help
checkout latest patchset:
ssh pr.pico.sh print pr-69 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print ps-X | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 69
add review to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add --review 69
accept PR:
ssh pr.pico.sh pr accept 69
close PR:
ssh pr.pico.sh pr close 69

Logs

erock created pr with ps-137 on 2025-06-08T14:58:33Z
erock added ps-139 on 2025-06-08T15:26:57Z
erock changed status on 2025-08-10T18:58:58Z {"status":"accepted"}

Patchsets

ps-137 by erock on 2025-06-08T14:58:33Z
Range Diff ↕ rd-139
1: 827f272 = 1: 827f272 feat(storage): base storage fn
2: e63282c = 2: e63282c feat(prose): use storage base for prose
3: 2a52510 = 3: 2a52510 refactor(prose): use fs adapter for images
-: ------- > 4: 6ddc654 refactor: proxy headers for images
ps-139 by erock on 2025-06-08T15:26:57Z

Range-diff rd-139

title
feat(storage): base storage fn
description
Patch equal
old #1
827f272
new #1
827f272
title
feat(prose): use storage base for prose
description
Patch equal
old #2
e63282c
new #2
e63282c
title
refactor(prose): use fs adapter for images
description
Patch equal
old #3
2a52510
new #3
2a52510
title
refactor: proxy headers for images
description
Patch added
old #0
(none)
new #4
6ddc654
Back to top
1: 827f272 = 1: 827f272 feat(storage): base storage fn
2: e63282c = 2: e63282c feat(prose): use storage base for prose
3: 2a52510 = 3: 2a52510 refactor(prose): use fs adapter for images
-: ------- > 4: 6ddc654 refactor: proxy headers for images

old


                    

new

old:pkg/apps/prose/api.go new:pkg/apps/prose/api.go
 	}
 
 	fmt.Println("HERERERERER", fname, opts)
-	contents, info, err := st.ServeObject(bucket, fname, opts)
+	contents, info, err := st.ServeObject(r, bucket, fname, opts)
 	if err != nil {
 		logger.Error("serve object", "err", err)
 		http.Error(w, err.Error(), http.StatusUnprocessableEntity)

old


                    

new

old:pkg/shared/storage/fs.go new:pkg/shared/storage/fs.go
 	"fmt"
 	"io"
 	"log/slog"
+	"net/http"
 	"os"
 	"path/filepath"
 	"strings"
 	return &StorageFS{st, logger}, nil
 }
 
-func (s *StorageFS) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
+func (s *StorageFS) ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
 	var rc io.ReadCloser
 	info := &sst.ObjectInfo{}
 	var err error
 	} else {
 		filePath := filepath.Join(bucket.Name, fpath)
 		dataURL := fmt.Sprintf("local:///%s", filePath)
-		rc, info, err = HandleProxy(s.Logger, dataURL, opts)
+		rc, info, err = HandleProxy(r, s.Logger, dataURL, opts)
 	}
 	if err != nil {
 		return nil, nil, err

old


                    

new

old:pkg/shared/storage/memory.go new:pkg/shared/storage/memory.go
 	return &StorageMemory{st}, nil
 }
 
-func (s *StorageMemory) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
+func (s *StorageMemory) ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
 	obj, info, err := s.GetObject(bucket, fpath)
 	if info.Metadata == nil {
 		info.Metadata = make(http.Header)

old


                    

new

old:pkg/shared/storage/minio.go new:pkg/shared/storage/minio.go
 	"fmt"
 	"io"
 	"log/slog"
+	"net/http"
 	"os"
 	"path/filepath"
 	"strings"
 	return &StorageMinio{st}, nil
 }
 
-func (s *StorageMinio) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
+func (s *StorageMinio) ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
 	var rc io.ReadCloser
 	info := &sst.ObjectInfo{}
 	var err error
 	} else {
 		filePath := filepath.Join(bucket.Name, fpath)
 		dataURL := fmt.Sprintf("s3://%s", filePath)
-		rc, info, err = HandleProxy(s.Logger, dataURL, opts)
+		rc, info, err = HandleProxy(r, s.Logger, dataURL, opts)
 	}
 	if err != nil {
 		return nil, nil, err

old


                    

new

old:pkg/shared/storage/proxy.go new:pkg/shared/storage/proxy.go
 	return processOpts
 }
 
-func HandleProxy(logger *slog.Logger, dataURL string, opts *ImgProcessOpts) (io.ReadCloser, *storage.ObjectInfo, error) {
+func HandleProxy(r *http.Request, logger *slog.Logger, dataURL string, opts *ImgProcessOpts) (io.ReadCloser, *storage.ObjectInfo, error) {
 	imgProxyURL := os.Getenv("IMGPROXY_URL")
 	imgProxySalt := os.Getenv("IMGPROXY_SALT")
 	imgProxyKey := os.Getenv("IMGPROXY_KEY")
 	}
 	proxyAddress := fmt.Sprintf("%s/%s%s", imgProxyURL, signature, processPath)
 
-	res, err := http.Get(proxyAddress)
+	req, err := http.NewRequest(http.MethodGet, proxyAddress, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+	req.Header.Set("accept", r.Header.Get("accept"))
+	req.Header.Set("accept-encoding", r.Header.Get("accept-encoding"))
+	req.Header.Set("accept-language", r.Header.Get("accept-language"))
+	req.Header.Set("content-type", r.Header.Get("content-type"))
+	fmt.Println("HEADERS", req.Header)
+	res, err := http.DefaultClient.Do(req)
 	if err != nil {
 		return nil, nil, err
 	}

old


                    

new

old:pkg/shared/storage/storage.go new:pkg/shared/storage/storage.go
 
 import (
 	"io"
+	"net/http"
 
 	sst "github.com/picosh/pico/pkg/pobj/storage"
 )
 
 type StorageServe interface {
 	sst.ObjectStorage
-	ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error)
+	ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error)
 }