]> go.fuhry.dev Git - runtime.git/commitdiff
[http/s3] support `if-modified-since` and `if-none-match`
authorDan Fuhry <dan@fuhry.com>
Tue, 19 Aug 2025 13:16:30 +0000 (09:16 -0400)
committerDan Fuhry <dan@fuhry.com>
Tue, 19 Aug 2025 13:16:30 +0000 (09:16 -0400)
http/route_action_s3.go

index 3ab3647a018b9feea032807809d787997fc3436c..4e5b6eea0b720c0af9afeef1ef1b6034b04fac2b 100644 (file)
@@ -6,6 +6,7 @@ import (
        "net/http"
        "strings"
        "sync"
+       "time"
 
        "github.com/minio/minio-go/v7"
        "github.com/minio/minio-go/v7/pkg/credentials"
@@ -75,6 +76,26 @@ func (a *S3Action) Handle(w http.ResponseWriter, r *http.Request, next http.Hand
                return
        }
 
+       if ims := r.Header.Get("if-modified-since"); ims != "" {
+               imsTime, err := time.Parse(http.TimeFormat, ims)
+               if err == nil && (imsTime.Equal(stat.LastModified) || imsTime.After(stat.LastModified)) {
+                       w.WriteHeader(http.StatusNotModified)
+                       return
+               }
+       }
+       w.Header().Set("last-modified", stat.LastModified.Format(http.TimeFormat))
+
+       if stat.ChecksumSHA1 != "" {
+               if inm := r.Header.Get("if-none-match"); inm != "" {
+                       if inm == stat.ChecksumSHA1 {
+                               w.WriteHeader(http.StatusNotModified)
+                               return
+                       }
+               }
+
+               w.Header().Set("ETag", stat.ChecksumSHA1)
+       }
+
        var seek int64
        var size = stat.Size
        if rh != nil {