mirror of
https://github.com/minio/minio.git
synced 2025-04-01 10:13:42 -04:00
fix: avoid buffering of server sent events by proxies (#10164)
This commit is contained in:
parent
fe157166ca
commit
25a55bae6f
@ -695,7 +695,7 @@ func (a adminAPIHandlers) HealHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Start writing response to client
|
// Start writing response to client
|
||||||
started = true
|
started = true
|
||||||
setCommonHeaders(w)
|
setCommonHeaders(w)
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
// Set 200 OK status
|
// Set 200 OK status
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
}
|
}
|
||||||
@ -995,7 +995,7 @@ func (a adminAPIHandlers) TraceHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
// Trace Publisher and peer-trace-client uses nonblocking send and hence does not wait for slow receivers.
|
// Trace Publisher and peer-trace-client uses nonblocking send and hence does not wait for slow receivers.
|
||||||
// Use buffered channel to take care of burst sends or slow w.Write()
|
// Use buffered channel to take care of burst sends or slow w.Write()
|
||||||
@ -1064,7 +1064,8 @@ func (a adminAPIHandlers) ConsoleLogHandler(w http.ResponseWriter, r *http.Reque
|
|||||||
// This is needed to make r.Context().Done() work as
|
// This is needed to make r.Context().Done() work as
|
||||||
// expected in case of read timeout
|
// expected in case of read timeout
|
||||||
w.Header().Add("Connection", "close")
|
w.Header().Add("Connection", "close")
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
|
||||||
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
logCh := make(chan interface{}, 4000)
|
logCh := make(chan interface{}, 4000)
|
||||||
|
|
||||||
@ -1223,7 +1224,9 @@ func (a adminAPIHandlers) OBDInfoHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
setCommonHeaders(w)
|
setCommonHeaders(w)
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
|
||||||
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
errResp := func(err error) {
|
errResp := func(err error) {
|
||||||
|
@ -38,6 +38,13 @@ func mustGetRequestID(t time.Time) string {
|
|||||||
return fmt.Sprintf("%X", t.UnixNano())
|
return fmt.Sprintf("%X", t.UnixNano())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setEventStreamHeaders to allow proxies to avoid buffering proxy responses
|
||||||
|
func setEventStreamHeaders(w http.ResponseWriter) {
|
||||||
|
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
||||||
|
w.Header().Set(xhttp.CacheControl, "no-cache") // nginx to turn off buffering
|
||||||
|
w.Header().Set("X-Accel-Buffering", "no") // nginx to turn off buffering
|
||||||
|
}
|
||||||
|
|
||||||
// Write http common headers
|
// Write http common headers
|
||||||
func setCommonHeaders(w http.ResponseWriter) {
|
func setCommonHeaders(w http.ResponseWriter) {
|
||||||
w.Header().Set(xhttp.ServerInfo, "MinIO/"+ReleaseTag)
|
w.Header().Set(xhttp.ServerInfo, "MinIO/"+ReleaseTag)
|
||||||
|
@ -22,7 +22,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
xhttp "github.com/minio/minio/cmd/http"
|
|
||||||
"github.com/minio/minio/cmd/logger"
|
"github.com/minio/minio/cmd/logger"
|
||||||
policy "github.com/minio/minio/pkg/bucket/policy"
|
policy "github.com/minio/minio/pkg/bucket/policy"
|
||||||
"github.com/minio/minio/pkg/event"
|
"github.com/minio/minio/pkg/event"
|
||||||
@ -119,7 +118,7 @@ func (api objectAPIHandlers) ListenNotificationHandler(w http.ResponseWriter, r
|
|||||||
|
|
||||||
rulesMap := event.NewRulesMap(eventNames, pattern, event.TargetID{ID: mustGetUUID()})
|
rulesMap := event.NewRulesMap(eventNames, pattern, event.TargetID{ID: mustGetUUID()})
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
// Listen Publisher and peer-listen-client uses nonblocking send and hence does not wait for slow receivers.
|
// Listen Publisher and peer-listen-client uses nonblocking send and hence does not wait for slow receivers.
|
||||||
// Use buffered channel to take care of burst sends or slow w.Write()
|
// Use buffered channel to take care of burst sends or slow w.Write()
|
||||||
|
@ -2615,7 +2615,9 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite
|
|||||||
w.Write(encodedErrorResponse)
|
w.Write(encodedErrorResponse)
|
||||||
w.(http.Flusher).Flush()
|
w.(http.Flusher).Flush()
|
||||||
}
|
}
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
|
||||||
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
w = &whiteSpaceWriter{ResponseWriter: w, Flusher: w.(http.Flusher)}
|
w = &whiteSpaceWriter{ResponseWriter: w, Flusher: w.(http.Flusher)}
|
||||||
completeDoneCh := sendWhiteSpace(w)
|
completeDoneCh := sendWhiteSpace(w)
|
||||||
objInfo, err := completeMultiPartUpload(ctx, bucket, object, uploadID, completeParts, opts)
|
objInfo, err := completeMultiPartUpload(ctx, bucket, object, uploadID, completeParts, opts)
|
||||||
|
@ -151,7 +151,8 @@ func (s *storageRESTServer) CrawlAndGetDataUsageHandler(w http.ResponseWriter, r
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
|
|
||||||
var cache dataUsageCache
|
var cache dataUsageCache
|
||||||
err := cache.deserialize(r.Body)
|
err := cache.deserialize(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -520,7 +521,7 @@ func (s *storageRESTServer) WalkSplunkHandler(w http.ResponseWriter, r *http.Req
|
|||||||
dirPath := vars[storageRESTDirPath]
|
dirPath := vars[storageRESTDirPath]
|
||||||
markerPath := vars[storageRESTMarkerPath]
|
markerPath := vars[storageRESTMarkerPath]
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
encoder := gob.NewEncoder(w)
|
encoder := gob.NewEncoder(w)
|
||||||
|
|
||||||
fch, err := s.storage.WalkSplunk(volume, dirPath, markerPath, r.Context().Done())
|
fch, err := s.storage.WalkSplunk(volume, dirPath, markerPath, r.Context().Done())
|
||||||
@ -548,7 +549,7 @@ func (s *storageRESTServer) WalkVersionsHandler(w http.ResponseWriter, r *http.R
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
encoder := gob.NewEncoder(w)
|
encoder := gob.NewEncoder(w)
|
||||||
|
|
||||||
fch, err := s.storage.WalkVersions(volume, dirPath, markerPath, recursive, r.Context().Done())
|
fch, err := s.storage.WalkVersions(volume, dirPath, markerPath, recursive, r.Context().Done())
|
||||||
@ -576,7 +577,7 @@ func (s *storageRESTServer) WalkHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
encoder := gob.NewEncoder(w)
|
encoder := gob.NewEncoder(w)
|
||||||
|
|
||||||
fch, err := s.storage.Walk(volume, dirPath, markerPath, recursive, r.Context().Done())
|
fch, err := s.storage.Walk(volume, dirPath, markerPath, recursive, r.Context().Done())
|
||||||
@ -659,7 +660,7 @@ func (s *storageRESTServer) DeleteVersionsHandler(w http.ResponseWriter, r *http
|
|||||||
|
|
||||||
dErrsResp := &DeleteVersionsErrsResp{Errs: make([]error, totalVersions)}
|
dErrsResp := &DeleteVersionsErrsResp{Errs: make([]error, totalVersions)}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
encoder := gob.NewEncoder(w)
|
encoder := gob.NewEncoder(w)
|
||||||
done := keepHTTPResponseAlive(w)
|
done := keepHTTPResponseAlive(w)
|
||||||
errs := s.storage.DeleteVersions(volume, versions)
|
errs := s.storage.DeleteVersions(volume, versions)
|
||||||
@ -805,7 +806,7 @@ func (s *storageRESTServer) VerifyFileHandler(w http.ResponseWriter, r *http.Req
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set(xhttp.ContentType, "text/event-stream")
|
setEventStreamHeaders(w)
|
||||||
encoder := gob.NewEncoder(w)
|
encoder := gob.NewEncoder(w)
|
||||||
done := keepHTTPResponseAlive(w)
|
done := keepHTTPResponseAlive(w)
|
||||||
err = s.storage.VerifyFile(volume, filePath, fi)
|
err = s.storage.VerifyFile(volume, filePath, fi)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user