// handleRequestForwarding determines whether to forward a request or not, // falling back on the older behavior of redirecting the client func handleRequestForwarding(core *vault.Core, handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Header.Get(vault.IntNoForwardingHeaderName) != "" { handler.ServeHTTP(w, r) return } if r.Header.Get(NoRequestForwardingHeaderName) != "" { // Forwarding explicitly disabled, fall back to previous behavior core.Logger().Trace("http/handleRequestForwarding: forwarding disabled by client request") handler.ServeHTTP(w, r) return } // Note: in an HA setup, this call will also ensure that connections to // the leader are set up, as that happens once the advertised cluster // values are read during this function isLeader, leaderAddr, err := core.Leader() if err != nil { if err == vault.ErrHANotEnabled { // Standalone node, serve request normally handler.ServeHTTP(w, r) return } // Some internal error occurred respondError(w, http.StatusInternalServerError, err) return } if isLeader { // No forwarding needed, we're leader handler.ServeHTTP(w, r) return } if leaderAddr == "" { respondError(w, http.StatusInternalServerError, fmt.Errorf("node not active but active node not found")) return } // Attempt forwarding the request. If we cannot forward -- perhaps it's // been disabled on the active node -- this will return with an // ErrCannotForward and we simply fall back statusCode, header, retBytes, err := core.ForwardRequest(r) if err != nil { if err == vault.ErrCannotForward { core.Logger().Trace("http/handleRequestForwarding: cannot forward (possibly disabled on active node), falling back") } else { core.Logger().Error("http/handleRequestForwarding: error forwarding request", "error", err) } // Fall back to redirection handler.ServeHTTP(w, r) return } if header != nil { for k, v := range header { for _, j := range v { w.Header().Add(k, j) } } } w.WriteHeader(statusCode) w.Write(retBytes) return }) }
// handleRequestForwarding determines whether to forward a request or not, // falling back on the older behavior of redirecting the client func handleRequestForwarding(core *vault.Core, handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Header.Get(vault.IntNoForwardingHeaderName) != "" { handler.ServeHTTP(w, r) return } if r.Header.Get(NoRequestForwardingHeaderName) != "" { // Forwarding explicitly disabled, fall back to previous behavior core.Logger().Printf("[TRACE] http/handleRequestForwarding: forwarding disabled by client request") handler.ServeHTTP(w, r) return } // Note: in an HA setup, this call will also ensure that connections to // the leader are set up, as that happens once the advertised cluster // values are read during this function isLeader, leaderAddr, err := core.Leader() if err != nil { if err == vault.ErrHANotEnabled { // Standalone node, serve request normally handler.ServeHTTP(w, r) return } // Some internal error occurred respondError(w, http.StatusInternalServerError, err) return } if isLeader { // No forwarding needed, we're leader handler.ServeHTTP(w, r) return } if leaderAddr == "" { respondError(w, http.StatusInternalServerError, fmt.Errorf("node not active but active node not found")) return } // Attempt forwarding the request. If we cannot forward -- perhaps it's // been disabled on the active node -- this will return with an // ErrCannotForward and we simply fall back resp, err := core.ForwardRequest(r) if err != nil { if err == vault.ErrCannotForward { core.Logger().Printf("[TRACE] http/handleRequestForwarding: cannot forward (possibly disabled on active node), falling back") } else { core.Logger().Printf("[ERR] http/handleRequestForwarding: error forwarding request: %v", err) } // Fall back to redirection handler.ServeHTTP(w, r) return } defer resp.Body.Close() // Read the body into a buffer so we can write it back out to the // original requestor buf := bytes.NewBuffer(nil) _, err = buf.ReadFrom(resp.Body) if err != nil { core.Logger().Printf("[ERR] http/handleRequestForwarding: error reading response body: %v", err) respondError(w, http.StatusInternalServerError, err) return } w.WriteHeader(resp.StatusCode) w.Write(buf.Bytes()) return }) }