From 21f423dd5a4fb27d36b899144e2108ca8fff64f0 Mon Sep 17 00:00:00 2001 From: Dan Fuhry Date: Tue, 8 Jul 2025 10:30:07 -0400 Subject: [PATCH] [http] fix s3 chunk size workaround, enable H2 ALPN - Set `NextProtos` to `[]string{"h2"}` when setting up tls config for http server - Use `io.CopyN` to stream response in route_action_s3 --- http/route_action_s3.go | 38 ++++---------------------------------- http/server.go | 1 + 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/http/route_action_s3.go b/http/route_action_s3.go index 49bf85b..7cabce6 100644 --- a/http/route_action_s3.go +++ b/http/route_action_s3.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "net/http" - "strconv" "strings" "sync" @@ -56,46 +55,17 @@ func (a *S3Action) Handle(w http.ResponseWriter, r *http.Request, next http.Hand stat, err := object.Stat() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + er := minio.ToErrorResponse(err) + w.WriteHeader(er.StatusCode) w.Write([]byte(fmt.Sprintf("failed to stat object %q: %+v", objPath, err))) return } w.Header().Set("content-type", stat.ContentType) + w.Header().Set("content-length", fmt.Sprintf("%d", stat.Size)) w.WriteHeader(http.StatusOK) - if strings.HasPrefix(stat.ContentType, "text/") || strings.HasPrefix(stat.ContentType, "application/") { - buf := make([]byte, 32*1024) - var out []byte - for { - nr, err := object.Read(buf) - if nr == 0 && err != nil { - break - } - end := nr - for i := nr; i > 0; i-- { - if buf[i-1] != '\000' { - end = i - break - } - } - out = append(out, buf[:end]...) - - if err == io.EOF { - break - } - } - w.Header().Set("content-length", strconv.Itoa(len(out))) - for nw := 0; nw < len(out); { - c, err := w.Write(out[nw:]) - if err != nil { - break - } - nw += c - } - } else { - io.Copy(w, object) - } + io.CopyN(w, object, stat.Size) } func (a *S3Action) minioClient() (mc *minio.Client, err error) { diff --git a/http/server.go b/http/server.go index 41afc7f..eb52e72 100644 --- a/http/server.go +++ b/http/server.go @@ -250,6 +250,7 @@ func (l *Listener) NewHTTPServerWithContext(ctx context.Context) (*http.Server, if err != nil { return nil, err } + tlsConfig.NextProtos = []string{"h2"} server.TLSConfig = tlsConfig } -- 2.50.1