Skip to content

Commit 00e2987

Browse files
committed
fix streaming
1 parent ec85788 commit 00e2987

File tree

8 files changed

+113
-175
lines changed

8 files changed

+113
-175
lines changed

.air.toml

Lines changed: 0 additions & 15 deletions
This file was deleted.

.env.test

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
export PROXY_HTTP_PORT=8081
2-
export PROXY_IMGPROXY_ENDPOINT=http://127.0.0.1:8082
1+
export PROXY_HTTP_PORT=8080
2+
export PROXY_IMGPROXY_ENDPOINT=http://127.0.0.1:8081
3+
export IMGPROXY_BIND=127.0.0.1:8081
4+
35
export AWS_ACCESS_KEY_ID=test
46
export AWS_SECRET_ACCESS_KEY=test
5-
export PROXY_S3_ENDPOINT=http://localhost:4566
7+
export PROXY_S3_ENDPOINT=http://localstack:4566
68
export PROXY_S3_BUCKET=test-bucket
79
export PROXY_S3_REGION=us-east-1
810

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build stage for Go proxy
2-
FROM golang:1.21-alpine AS builder
2+
FROM golang:1.24-alpine AS builder
33

44
WORKDIR /app
55

@@ -31,5 +31,5 @@ ENV PROXY_HTTP_PORT=8080
3131

3232
EXPOSE 8080
3333

34-
# Start proxy (which will start imgproxy)
34+
# Start proxy (which will start tigris-proxy & imgproxy)
3535
CMD ["/usr/local/bin/start_processes.sh"]

docker-compose.yml

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,11 @@ services:
1919
volumes:
2020
- ./init-localstack.sh:/docker-entrypoint-initaws.d/init-localstack.sh
2121

22-
imgproxy:
23-
image: ghcr.io/imgproxy/imgproxy:latest
22+
app:
23+
build: .
24+
env_file: .env.test
2425
ports:
25-
- "8082:8080"
26-
environment:
27-
- IMGPROXY_BIND=:8080
28-
29-
# app:
30-
# build: .
31-
# env_file: .env.test
32-
# environment:
33-
# - AWS_ACCESS_KEY_ID=test
34-
# - AWS_SECRET_ACCESS_KEY=test
35-
# ports:
36-
# - "8080:8080"
37-
# - "8081:8081"
38-
# depends_on:
39-
# localstack:
40-
# condition: service_healthy
26+
- "8080:8080"
27+
depends_on:
28+
localstack:
29+
condition: service_healthy

go.mod

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
11
module github.com/err0r500/imgproxy2tigris
22

3-
go 1.21
3+
go 1.24
4+
5+
toolchain go1.24.1
46

57
require (
6-
github.com/aws/aws-sdk-go-v2 v1.24.0
7-
github.com/aws/aws-sdk-go-v2/config v1.26.2
8-
github.com/aws/aws-sdk-go-v2/service/s3 v1.47.7
8+
github.com/aws/aws-sdk-go-v2 v1.36.3
9+
github.com/aws/aws-sdk-go-v2/config v1.29.9
10+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.66
11+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2
912
)
1013

1114
require (
12-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect
13-
github.com/aws/aws-sdk-go-v2/credentials v1.16.13 // indirect
14-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect
15-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect
16-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect
17-
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect
18-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect
19-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect
20-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect
21-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect
22-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect
23-
github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect
24-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect
25-
github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 // indirect
26-
github.com/aws/smithy-go v1.19.0 // indirect
15+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect
16+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62 // indirect
17+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
19+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
20+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
21+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect
25+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect
26+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1 // indirect
27+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1 // indirect
28+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect
29+
github.com/aws/smithy-go v1.22.2 // indirect
2730
)

go.sum

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
1-
github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk=
2-
github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4=
3-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs=
4-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo=
5-
github.com/aws/aws-sdk-go-v2/config v1.26.2 h1:+RWLEIWQIGgrz2pBPAUoGgNGs1TOyF4Hml7hCnYj2jc=
6-
github.com/aws/aws-sdk-go-v2/config v1.26.2/go.mod h1:l6xqvUxt0Oj7PI/SUXYLNyZ9T/yBPn3YTQcJLLOdtR8=
7-
github.com/aws/aws-sdk-go-v2/credentials v1.16.13 h1:WLABQ4Cp4vXtXfOWOS3MEZKr6AAYUpMczLhgKtAjQ/8=
8-
github.com/aws/aws-sdk-go-v2/credentials v1.16.13/go.mod h1:Qg6x82FXwW0sJHzYruxGiuApNo31UEtJvXVSZAXeWiw=
9-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58=
10-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw=
11-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs=
12-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4=
13-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls=
14-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU=
15-
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM=
16-
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY=
17-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 h1:ugD6qzjYtB7zM5PN/ZIeaAIyefPaD82G8+SJopgvUpw=
18-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9/go.mod h1:YD0aYBWCrPENpHolhKw2XDlTIWae2GKXT1T4o6N6hiM=
19-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw=
20-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ=
21-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 h1:/90OR2XbSYfXucBMJ4U14wrjlfleq/0SB6dZDPncgmo=
22-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9/go.mod h1:dN/Of9/fNZet7UrQQ6kTDo/VSwKPIq94vjlU16bRARc=
23-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU=
24-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0=
25-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 h1:iEAeF6YC3l4FzlJPP9H3Ko1TXpdjdqWffxXjp8SY6uk=
26-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9/go.mod h1:kjsXoK23q9Z/tLBrckZLLyvjhZoS+AGrzqzUfEClvMM=
27-
github.com/aws/aws-sdk-go-v2/service/s3 v1.47.7 h1:o0ASbVwUAIrfp/WcCac+6jioZt4Hd8k/1X8u7GJ/QeM=
28-
github.com/aws/aws-sdk-go-v2/service/s3 v1.47.7/go.mod h1:vADO6Jn+Rq4nDtfwNjhgR84qkZwiC6FqCaXdw/kYwjA=
29-
github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 h1:ldSFWz9tEHAwHNmjx2Cvy1MjP5/L9kNoR0skc6wyOOM=
30-
github.com/aws/aws-sdk-go-v2/service/sso v1.18.5/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc=
31-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 h1:2k9KmFawS63euAkY4/ixVNsYYwrwnd5fIvgEKkfZFNM=
32-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38=
33-
github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 h1:HJeiuZ2fldpd0WqngyMR6KW7ofkXNLyOaHwEIGm39Cs=
34-
github.com/aws/aws-sdk-go-v2/service/sts v1.26.6/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU=
35-
github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM=
36-
github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
37-
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
38-
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1+
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
2+
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
3+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs=
4+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14=
5+
github.com/aws/aws-sdk-go-v2/config v1.29.9 h1:Kg+fAYNaJeGXp1vmjtidss8O2uXIsXwaRqsQJKXVr+0=
6+
github.com/aws/aws-sdk-go-v2/config v1.29.9/go.mod h1:oU3jj2O53kgOU4TXq/yipt6ryiooYjlkqqVaZk7gY/U=
7+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62 h1:fvtQY3zFzYJ9CfixuAQ96IxDrBajbBWGqjNTCa79ocU=
8+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62/go.mod h1:ElETBxIQqcxej++Cs8GyPBbgMys5DgQPTwo7cUPDKt8=
9+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw=
10+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M=
11+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.66 h1:MTLivtC3s89de7Fe3P8rzML/8XPNRfuyJhlRTsCEt0k=
12+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.66/go.mod h1:NAuQ2s6gaFEsuTIb2+P5t6amB1w5MhvJFxppoezGWH0=
13+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
14+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
15+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
16+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
17+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
19+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM=
20+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs=
21+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
22+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
23+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 h1:lguz0bmOoGzozP9XfRJR1QIayEYo+2vP/No3OfLF0pU=
24+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0=
25+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
26+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY=
27+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg=
28+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA=
29+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2 h1:jIiopHEV22b4yQP2q36Y0OmwLbsxNWdWwfZRR5QRRO4=
30+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2/go.mod h1:U5SNqwhXB3Xe6F47kXvWihPl/ilGaEDe8HD/50Z9wxc=
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1 h1:8JdC7Gr9NROg1Rusk25IcZeTO59zLxsKgE0gkh5O6h0=
32+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI=
33+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1 h1:KwuLovgQPcdjNMfFt9OhUd9a2OwcOKhxfvF4glTzLuA=
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs=
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc=
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
37+
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
38+
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=

index.html

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,10 @@
2727
</head>
2828
<body>
2929
<div class="image-container">
30-
<!-- imgProxy in docker
31-
<img src="http://localhost:8080/_/rs:fill:1160:532:1/g:ce/wm:0.5:soea:10:10:0.2/aHR0cHM6Ly93d3cuem9vcGx1cy5jby51ay9tYWdhemluZS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wMS9zdHJpcGVkLWdyZXkta2l0dGVuLTc2OHg1MTIuanBn" /> -->
32-
33-
tigris proxy :
34-
<img src="http://localhost:8081/_/rs:fill:1160:532:1/g:ce/wm:0.5:soea:10:10:0.2/aHR0cHM6Ly93d3cuem9vcGx1cy5jby51ay9tYWdhemluZS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wMS9zdHJpcGVkLWdyZXkta2l0dGVuLTc2OHg1MTIuanBn" />
35-
36-
<!-- imgProxy standalone
37-
<img src="http://localhost:8082/_/rs:fill:1160:532:1/g:ce/wm:0.5:soea:10:10:0.2/aHR0cHM6Ly93d3cuem9vcGx1cy5jby51ay9tYWdhemluZS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wMS9zdHJpcGVkLWdyZXkta2l0dGVuLTc2OHg1MTIuanBn" /> -->
38-
30+
<img
31+
src="http://localhost:4566/test-bucket/f245f88252712c73d1d62b78a427869f"
32+
onerror="this.src = 'http://localhost:8080/_/rs:fill:1160:532:1/g:ce/wm:0.5:soea:10:10:0.2/aHR0cHM6Ly93d3cuem9vcGx1cy5jby51ay9tYWdhemluZS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wMS9zdHJpcGVkLWdyZXkta2l0dGVuLTc2OHg1MTIuanBn';"
33+
/>
3934
</div>
4035
</body>
4136
</html>

main.go

Lines changed: 35 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ import (
1212
"net/http/httputil"
1313
"net/url"
1414
"os"
15-
"strings"
1615

1716
"github.com/aws/aws-sdk-go-v2/aws"
18-
//"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
1917
"github.com/aws/aws-sdk-go-v2/config"
18+
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
2019
"github.com/aws/aws-sdk-go-v2/service/s3"
2120
)
2221

@@ -42,7 +41,10 @@ func main() {
4241
cfg.ImgproxyEndpoint = "http://localhost:8080"
4342
}
4443

45-
s3Client := initS3Client(cfg)
44+
uploader := manager.NewUploader(initS3Client(cfg), func(u *manager.Uploader) {
45+
u.PartSize = 5 * 1024 * 1024
46+
u.BufferProvider = manager.NewBufferedReadSeekerWriteToPool(10 * 1024 * 1024)
47+
})
4648

4749
// Initialize the proxy
4850
target, err := url.Parse(cfg.ImgproxyEndpoint)
@@ -52,105 +54,67 @@ func main() {
5254
}
5355
proxy := httputil.NewSingleHostReverseProxy(target)
5456

55-
// Add response modifier for S3 upload
5657
proxy.ModifyResponse = func(resp *http.Response) error {
57-
// Only process successful responses
5858
if resp.StatusCode == http.StatusOK {
59-
// Read the entire response body
60-
body, err := io.ReadAll(resp.Body)
61-
if err != nil {
62-
slog.Error("Failed to read response body", "error", err)
63-
return err
64-
}
65-
resp.Body.Close()
66-
67-
// Start S3 upload in a goroutine as best-effort
59+
var buf bytes.Buffer
60+
teeReader := io.TeeReader(resp.Body, &buf)
61+
6862
go func() {
69-
ctx := context.Background()
70-
if err := uploadToS3(ctx, s3Client, cfg, bytes.NewReader(body), resp.Request.URL.Path); err != nil {
63+
if err := uploadToS3(context.Background(), uploader, cfg, &buf, resp.Request.URL.Path); err != nil {
7164
slog.Error("S3 upload failed", "error", err)
7265
}
7366
}()
7467

75-
// Set the response body to a new reader with the cached content
76-
resp.Body = io.NopCloser(bytes.NewReader(body))
68+
resp.Body = io.NopCloser(teeReader)
7769
}
7870
return nil
7971
}
8072

81-
http.HandleFunc("/", proxyHandler(s3Client, proxy))
82-
slog.Info("Starting proxy server", "port", os.Getenv("PROXY_HTTP_PORT"))
83-
err = http.ListenAndServe(fmt.Sprintf(":%s", os.Getenv("PROXY_HTTP_PORT")), nil)
84-
if err != nil {
85-
slog.Error("Server failed", "error", err)
86-
}
87-
}
88-
89-
func proxyHandler(s3Client *s3.Client, proxy *httputil.ReverseProxy) http.HandlerFunc {
90-
return func(w http.ResponseWriter, r *http.Request) {
91-
slog.Info("Proxying request", "path", r.URL.Path)
73+
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
9274
proxy.ServeHTTP(w, r)
93-
}
94-
}
75+
})
9576

96-
// generateS3Key creates a hash from the imgproxy URL parts after the signature
97-
func generateS3Key(path string) string {
98-
// Split path into components
99-
parts := strings.Split(strings.TrimPrefix(path, "/"), "/")
100-
if len(parts) < 3 {
101-
return ""
77+
if err := http.ListenAndServe(fmt.Sprintf(":%s", os.Getenv("PROXY_HTTP_PORT")), nil); err != nil {
78+
slog.Error("Server failed", "error", err)
10279
}
103-
104-
// Everything after signature (processing options and source URL)
105-
toHash := strings.Join(parts[1:], "/")
106-
107-
// Generate MD5 hash
108-
hash := md5.Sum([]byte(toHash))
109-
return hex.EncodeToString(hash[:])
11080
}
11181

112-
func uploadToS3(ctx context.Context, client *s3.Client, cfg Config, r io.Reader, path string) error {
113-
// Generate key from URL path
82+
func uploadToS3(ctx context.Context, uploader *manager.Uploader, cfg Config, r io.Reader, path string) error {
11483
key := generateS3Key(path)
115-
if key == "" {
116-
return fmt.Errorf("invalid URL path format")
117-
}
11884

119-
slog.Info("Uploading to S3", "path", path, "key", key)
120-
_, err := client.PutObject(ctx, &s3.PutObjectInput{
85+
_, err := uploader.Upload(ctx, &s3.PutObjectInput{
12186
Bucket: aws.String(cfg.S3Bucket),
12287
Key: aws.String(key),
12388
Body: r,
12489
})
12590

126-
return err
91+
if err != nil {
92+
slog.Error("Upload failed", "path", path, "key", key, "error", err)
93+
return err
94+
}
95+
96+
slog.Info("Uploaded to S3", "path", path, "bucket", cfg.S3Bucket, "key", key)
97+
return nil
98+
}
99+
100+
// generateS3Key creates a hash from the imgproxy URL path
101+
func generateS3Key(path string) string {
102+
hash := md5.Sum([]byte(path))
103+
return hex.EncodeToString(hash[:])
127104
}
128105

129106
func initS3Client(cfg Config) *s3.Client {
130-
customResolver := aws.EndpointResolverWithOptionsFunc(
131-
func(service, region string, opts ...interface{}) (aws.Endpoint, error) {
132-
if cfg.S3Endpoint != "" {
133-
return aws.Endpoint{
134-
PartitionID: "aws",
135-
URL: cfg.S3Endpoint,
136-
SigningRegion: cfg.S3Region,
137-
}, nil
138-
}
139-
return aws.Endpoint{}, &aws.EndpointNotFoundError{}
140-
},
141-
)
142-
143-
awsCfg, err := config.LoadDefaultConfig(context.Background(),
144-
config.WithEndpointResolverWithOptions(customResolver),
145-
config.WithRegion(cfg.S3Region),
146-
)
107+
sdkConfig, err := config.LoadDefaultConfig(context.Background())
147108
if err != nil {
148109
slog.Error("Failed to initialize AWS config", "error", err)
149110
os.Exit(1)
150111
}
151112

152-
// Create S3 client with path-style addressing required for LocalStack
153-
return s3.NewFromConfig(awsCfg, func(o *s3.Options) {
113+
svc := s3.NewFromConfig(sdkConfig, func(o *s3.Options) {
114+
o.BaseEndpoint = aws.String(cfg.S3Endpoint)
115+
o.Region = cfg.S3Region
154116
o.UsePathStyle = true
155117
})
118+
119+
return svc
156120
}

0 commit comments

Comments
 (0)