From 26da4a148bc47b00e0606faa26a73b48fabe9f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lumi=C3=A8re=20=C3=89lev=C3=A9?= <88174309+PoneyClairDeLune@users.noreply.github.com> Date: Wed, 7 Aug 2024 11:22:06 +0000 Subject: [PATCH 1/7] Added two additional types of excluded files. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index c77bc579c8ef..9d1242be8aa9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,10 @@ # Dependency directories (remove the comment below to include it) # vendor/ +# Temporary lock files +*.swp +.~lock.* + *.DS_Store .idea *.zip From 586d37274655440c61f73cbf33c91d1e50cd57a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lumi=C3=A8re=20=C3=89lev=C3=A9?= <88174309+PoneyClairDeLune@users.noreply.github.com> Date: Wed, 7 Aug 2024 11:35:42 +0000 Subject: [PATCH 2/7] Added a header to disable middlebox caching. --- transport/internet/splithttp/hub.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/transport/internet/splithttp/hub.go b/transport/internet/splithttp/hub.go index 3ba429ea459a..421d05aa48c0 100644 --- a/transport/internet/splithttp/hub.go +++ b/transport/internet/splithttp/hub.go @@ -188,6 +188,10 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req // magic header to make the HTTP middle box consider this as SSE to disable buffer writer.Header().Set("Content-Type", "text/event-stream") } + // A web-compliant header telling all middleboxes to disable caching. + // Should be able to prevent overloading the cache, or stop CDNs from + // teeing the response stream into their cache, causing slowdowns. + writer.Header().Set("Cache-Control", "no-store") writer.WriteHeader(http.StatusOK) // send a chunk immediately to enable CDN streaming. From a7cf93bd8ba890c35d0ebdfb17c75b8dfd7a7bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lumi=C3=A8re=20=C3=89lev=C3=A9?= <88174309+PoneyClairDeLune@users.noreply.github.com> Date: Wed, 7 Aug 2024 11:58:03 +0000 Subject: [PATCH 3/7] Filling default values for middleboxes. Crappy code, I know :P --- transport/internet/splithttp/client.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/transport/internet/splithttp/client.go b/transport/internet/splithttp/client.go index f9b7cba17ce9..e02c3cf85470 100644 --- a/transport/internet/splithttp/client.go +++ b/transport/internet/splithttp/client.go @@ -38,6 +38,12 @@ type DefaultDialerClient struct { dialUploadConn func(ctxInner context.Context) (net.Conn, error) } +func splitHttpWriteHeaderWhenEmpty(headers *http.Header, key string, value string) { + if headers.Get(key) == "" { + headers.Add(key, value) + } +} + func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) { var remoteAddr gonet.Addr var localAddr gonet.Addr @@ -74,6 +80,10 @@ func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) } req.Header = c.transportConfig.GetRequestHeader() + // Tell the middleboxes to expect an SSE response + splitHttpWriteHeaderWhenEmpty(&req.Header, "Accept", "text/event-stream") + // Tell the middleboxes to not serve from cache altogether + splitHttpWriteHeaderWhenEmpty(&req.Header, "Cache-Control", "no-cache") response, err := c.download.Do(req) gotConn.Close() From 00b4987ef0298faa089d88e2717be7a3a3cf4248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lumi=C3=A8re=20=C3=89lev=C3=A9?= <88174309+PoneyClairDeLune@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:21:28 +0000 Subject: [PATCH 4/7] Oops, forgot the upload streams... --- transport/internet/splithttp/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/transport/internet/splithttp/client.go b/transport/internet/splithttp/client.go index e02c3cf85470..2fc8287c7837 100644 --- a/transport/internet/splithttp/client.go +++ b/transport/internet/splithttp/client.go @@ -132,6 +132,10 @@ func (c *DefaultDialerClient) SendUploadRequest(ctx context.Context, url string, } req.ContentLength = contentLength req.Header = c.transportConfig.GetRequestHeader() + // Tell the middleboxes to expect an SSE response + splitHttpWriteHeaderWhenEmpty(&req.Header, "Accept", "text/event-stream") + // Tell the middleboxes to not serve from cache altogether + splitHttpWriteHeaderWhenEmpty(&req.Header, "Cache-Control", "no-cache") if c.isH2 || c.isH3 { resp, err := c.upload.Do(req) From 03809cf918c74383a831beec6d65b886fa7f9976 Mon Sep 17 00:00:00 2001 From: RPRX <63339210+RPRX@users.noreply.github.com> Date: Sat, 10 Aug 2024 23:46:17 +0000 Subject: [PATCH 5/7] Update .gitignore --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index 9d1242be8aa9..c77bc579c8ef 100644 --- a/.gitignore +++ b/.gitignore @@ -14,10 +14,6 @@ # Dependency directories (remove the comment below to include it) # vendor/ -# Temporary lock files -*.swp -.~lock.* - *.DS_Store .idea *.zip From bc6849748200d9f049ab8265f18d2a6f1a780341 Mon Sep 17 00:00:00 2001 From: RPRX <63339210+RPRX@users.noreply.github.com> Date: Sat, 10 Aug 2024 23:47:25 +0000 Subject: [PATCH 6/7] Update client.go --- transport/internet/splithttp/client.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/transport/internet/splithttp/client.go b/transport/internet/splithttp/client.go index 2fc8287c7837..f9b7cba17ce9 100644 --- a/transport/internet/splithttp/client.go +++ b/transport/internet/splithttp/client.go @@ -38,12 +38,6 @@ type DefaultDialerClient struct { dialUploadConn func(ctxInner context.Context) (net.Conn, error) } -func splitHttpWriteHeaderWhenEmpty(headers *http.Header, key string, value string) { - if headers.Get(key) == "" { - headers.Add(key, value) - } -} - func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) { var remoteAddr gonet.Addr var localAddr gonet.Addr @@ -80,10 +74,6 @@ func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) } req.Header = c.transportConfig.GetRequestHeader() - // Tell the middleboxes to expect an SSE response - splitHttpWriteHeaderWhenEmpty(&req.Header, "Accept", "text/event-stream") - // Tell the middleboxes to not serve from cache altogether - splitHttpWriteHeaderWhenEmpty(&req.Header, "Cache-Control", "no-cache") response, err := c.download.Do(req) gotConn.Close() @@ -132,10 +122,6 @@ func (c *DefaultDialerClient) SendUploadRequest(ctx context.Context, url string, } req.ContentLength = contentLength req.Header = c.transportConfig.GetRequestHeader() - // Tell the middleboxes to expect an SSE response - splitHttpWriteHeaderWhenEmpty(&req.Header, "Accept", "text/event-stream") - // Tell the middleboxes to not serve from cache altogether - splitHttpWriteHeaderWhenEmpty(&req.Header, "Cache-Control", "no-cache") if c.isH2 || c.isH3 { resp, err := c.upload.Do(req) From adc238c9b181107a1565925299abc86716d7eff1 Mon Sep 17 00:00:00 2001 From: RPRX <63339210+RPRX@users.noreply.github.com> Date: Sat, 10 Aug 2024 23:49:18 +0000 Subject: [PATCH 7/7] Update hub.go --- transport/internet/splithttp/hub.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/transport/internet/splithttp/hub.go b/transport/internet/splithttp/hub.go index 421d05aa48c0..0c9b4d39ff52 100644 --- a/transport/internet/splithttp/hub.go +++ b/transport/internet/splithttp/hub.go @@ -184,14 +184,14 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req // magic header instructs nginx + apache to not buffer response body writer.Header().Set("X-Accel-Buffering", "no") - if !h.config.NoSSEHeader { - // magic header to make the HTTP middle box consider this as SSE to disable buffer - writer.Header().Set("Content-Type", "text/event-stream") - } // A web-compliant header telling all middleboxes to disable caching. // Should be able to prevent overloading the cache, or stop CDNs from // teeing the response stream into their cache, causing slowdowns. writer.Header().Set("Cache-Control", "no-store") + if !h.config.NoSSEHeader { + // magic header to make the HTTP middle box consider this as SSE to disable buffer + writer.Header().Set("Content-Type", "text/event-stream") + } writer.WriteHeader(http.StatusOK) // send a chunk immediately to enable CDN streaming.