History

fix: avoid buffering of server sent events by proxies (#10164)

Harshavardhana committed 6 years ago

Commit 25a55ba1 parent fe157165 files · +25 −13Browse files

Unified · Split

5 files
  1. cmd/admin-handlers.go +7 −4
  2. cmd/api-headers.go +7 −0
  3. cmd/listen-notification-handlers.go +1 −2
  4. cmd/object-handlers.go +3 −1
  5. cmd/storage-rest-server.go +7 −6
cmd/admin-handlers.go+7−4
@@ -695,7 +695,7 @@ func (a adminAPIHandlers) HealHandler(w http.ResponseWriter, r *http.Request) { · 694 unmodified lines
695695 // Start writing response to client
696696 started = true
697697 setCommonHeaders(w)
698− w.Header().Set(xhttp.ContentType, "text/event-stream")
698+ setEventStreamHeaders(w)
699699 // Set 200 OK status
700700 w.WriteHeader(200)
701701 }
@@ -995,7 +995,7 @@ func (a adminAPIHandlers) TraceHandler(w http.ResponseWriter, r *http.Request) { · 293 unmodified lines
995995 return
996996 }
997997
998− w.Header().Set(xhttp.ContentType, "text/event-stream")
998+ setEventStreamHeaders(w)
999999
10001000 // Trace Publisher and peer-trace-client uses nonblocking send and hence does not wait for slow receivers.
10011001 // 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 · 62 unmodified lines
10641064 // This is needed to make r.Context().Done() work as
10651065 // expected in case of read timeout
10661066 w.Header().Add("Connection", "close")
1067− w.Header().Set(xhttp.ContentType, "text/event-stream")
1067+
1068+ setEventStreamHeaders(w)
10681069
10691070 logCh := make(chan interface{}, 4000)
10701071
@@ -1223,7 +1224,9 @@ func (a adminAPIHandlers) OBDInfoHandler(w http.ResponseWriter, r *http.Request) · 152 unmodified lines
12231224 }
12241225
12251226 setCommonHeaders(w)
1226− w.Header().Set(xhttp.ContentType, "text/event-stream")
1227+
1228+ setEventStreamHeaders(w)
1229+
12271230 w.WriteHeader(http.StatusOK)
12281231
12291232 errResp := func(err error) {
cmd/api-headers.go+7−0
@@ -38,6 +38,13 @@ func mustGetRequestID(t time.Time) string { · 37 unmodified lines
3838 return fmt.Sprintf("%X", t.UnixNano())
3939 }
4040
41+// setEventStreamHeaders to allow proxies to avoid buffering proxy responses
42+func setEventStreamHeaders(w http.ResponseWriter) {
43+ w.Header().Set(xhttp.ContentType, "text/event-stream")
44+ w.Header().Set(xhttp.CacheControl, "no-cache") // nginx to turn off buffering
45+ w.Header().Set("X-Accel-Buffering", "no") // nginx to turn off buffering
46+}
47+
4148 // Write http common headers
4249 func setCommonHeaders(w http.ResponseWriter) {
4350 w.Header().Set(xhttp.ServerInfo, "MinIO/"+ReleaseTag)
cmd/listen-notification-handlers.go+1−2
@@ -22,7 +22,6 @@ import ( · 21 unmodified lines
2222 "time"
2323
2424 "github.com/gorilla/mux"
25− xhttp "github.com/minio/minio/cmd/http"
2625 "github.com/minio/minio/cmd/logger"
2726 policy "github.com/minio/minio/pkg/bucket/policy"
2827 "github.com/minio/minio/pkg/event"
@@ -119,7 +118,7 @@ func (api objectAPIHandlers) ListenNotificationHandler(w http.ResponseWriter, r · 90 unmodified lines
119118
120119 rulesMap := event.NewRulesMap(eventNames, pattern, event.TargetID{ID: mustGetUUID()})
121120
122− w.Header().Set(xhttp.ContentType, "text/event-stream")
121+ setEventStreamHeaders(w)
123122
124123 // Listen Publisher and peer-listen-client uses nonblocking send and hence does not wait for slow receivers.
125124 // Use buffered channel to take care of burst sends or slow w.Write()
cmd/object-handlers.go+3−1
@@ -2615,7 +2615,9 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite · 2614 unmodified lines
26152615 w.Write(encodedErrorResponse)
26162616 w.(http.Flusher).Flush()
26172617 }
2618− w.Header().Set(xhttp.ContentType, "text/event-stream")
2618+
2619+ setEventStreamHeaders(w)
2620+
26192621 w = &whiteSpaceWriter{ResponseWriter: w, Flusher: w.(http.Flusher)}
26202622 completeDoneCh := sendWhiteSpace(w)
26212623 objInfo, err := completeMultiPartUpload(ctx, bucket, object, uploadID, completeParts, opts)
cmd/storage-rest-server.go+7−6
@@ -151,7 +151,8 @@ func (s *storageRESTServer) CrawlAndGetDataUsageHandler(w http.ResponseWriter, r · 150 unmodified lines
151151 return
152152 }
153153
154− w.Header().Set(xhttp.ContentType, "text/event-stream")
154+ setEventStreamHeaders(w)
155+
155156 var cache dataUsageCache
156157 err := cache.deserialize(r.Body)
157158 if err != nil {
@@ -520,7 +521,7 @@ func (s *storageRESTServer) WalkSplunkHandler(w http.ResponseWriter, r *http.Req · 362 unmodified lines
520521 dirPath := vars[storageRESTDirPath]
521522 markerPath := vars[storageRESTMarkerPath]
522523
523− w.Header().Set(xhttp.ContentType, "text/event-stream")
524+ setEventStreamHeaders(w)
524525 encoder := gob.NewEncoder(w)
525526
526527 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 · 21 unmodified lines
548549 return
549550 }
550551
551− w.Header().Set(xhttp.ContentType, "text/event-stream")
552+ setEventStreamHeaders(w)
552553 encoder := gob.NewEncoder(w)
553554
554555 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) · 21 unmodified lines
576577 return
577578 }
578579
579− w.Header().Set(xhttp.ContentType, "text/event-stream")
580+ setEventStreamHeaders(w)
580581 encoder := gob.NewEncoder(w)
581582
582583 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 · 76 unmodified lines
659660
660661 dErrsResp := &DeleteVersionsErrsResp{Errs: make([]error, totalVersions)}
661662
662− w.Header().Set(xhttp.ContentType, "text/event-stream")
663+ setEventStreamHeaders(w)
663664 encoder := gob.NewEncoder(w)
664665 done := keepHTTPResponseAlive(w)
665666 errs := s.storage.DeleteVersions(volume, versions)
@@ -805,7 +806,7 @@ func (s *storageRESTServer) VerifyFileHandler(w http.ResponseWriter, r *http.Req · 139 unmodified lines
805806 return
806807 }
807808
808− w.Header().Set(xhttp.ContentType, "text/event-stream")
809+ setEventStreamHeaders(w)
809810 encoder := gob.NewEncoder(w)
810811 done := keepHTTPResponseAlive(w)
811812 err = s.storage.VerifyFile(volume, filePath, fi)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t