From 6285d65b6a752896870ebdd5abae3b1afd8ac529 Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 29 Aug 2022 12:07:49 -0500 Subject: [PATCH] fix: remove `(http.Server).ReadHeaderTimeout` (#3730) * fix: remove `(http.Server).ReadHeaderTimeout` Fixes https://github.com/coder/coder/issues/3710. It caused some race condition for websockets where the server sent the first message. * comment why disabled --- cli/server.go | 19 +++++++++++++------ coderd/httpmw/workspaceparam.go | 9 +++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/cli/server.go b/cli/server.go index c2b20b660c..b66ce7f690 100644 --- a/cli/server.go +++ b/cli/server.go @@ -496,12 +496,16 @@ func Server(newAPI func(*coderd.Options) *coderd.API) *cobra.Command { shutdownConnsCtx, shutdownConns := context.WithCancel(ctx) defer shutdownConns() + + // ReadHeaderTimeout is purposefully not enabled. It caused some issues with + // websockets over the dev tunnel. + // See: https://github.com/coder/coder/pull/3730 + //nolint:gosec server := &http.Server{ // These errors are typically noise like "TLS: EOF". Vault does similar: // https://github.com/hashicorp/vault/blob/e2490059d0711635e529a4efcbaa1b26998d6e1c/command/server.go#L2714 - ErrorLog: log.New(io.Discard, "", 0), - Handler: coderAPI.Handler, - ReadHeaderTimeout: time.Minute, + ErrorLog: log.New(io.Discard, "", 0), + Handler: coderAPI.Handler, BaseContext: func(_ net.Listener) context.Context { return shutdownConnsCtx }, @@ -1106,10 +1110,13 @@ func configureGithubOAuth2(accessURL *url.URL, clientID, clientSecret string, al func serveHandler(ctx context.Context, logger slog.Logger, handler http.Handler, addr, name string) (closeFunc func()) { logger.Debug(ctx, "http server listening", slog.F("addr", addr), slog.F("name", name)) + // ReadHeaderTimeout is purposefully not enabled. It caused some issues with + // websockets over the dev tunnel. + // See: https://github.com/coder/coder/pull/3730 + //nolint:gosec srv := &http.Server{ - Addr: addr, - Handler: handler, - ReadHeaderTimeout: time.Minute, + Addr: addr, + Handler: handler, } go func() { err := srv.ListenAndServe() diff --git a/coderd/httpmw/workspaceparam.go b/coderd/httpmw/workspaceparam.go index 1ce23a20d9..7c38c41f32 100644 --- a/coderd/httpmw/workspaceparam.go +++ b/coderd/httpmw/workspaceparam.go @@ -8,11 +8,12 @@ import ( "net/http" "strings" + "github.com/go-chi/chi/v5" + "github.com/google/uuid" + "github.com/coder/coder/coderd/database" "github.com/coder/coder/coderd/httpapi" "github.com/coder/coder/codersdk" - "github.com/go-chi/chi/v5" - "github.com/google/uuid" ) type workspaceParamContextKey struct{} @@ -57,8 +58,8 @@ func ExtractWorkspaceParam(db database.Store) func(http.Handler) http.Handler { // "workspace_and_agent" URL parameter. `ExtractUserParam` must be called // before this. // This can be in the form of: -// - ".[workspace-agent]" : If multiple agents exist -// - "" : If one agent exists +// - ".[workspace-agent]" : If multiple agents exist +// - "" : If one agent exists func ExtractWorkspaceAndAgentParam(db database.Store) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {