Skip to content

Commit

Permalink
Add namespace in error (#12061)
Browse files Browse the repository at this point in the history
* hghaf099-VAULT-1303-Adding namespace in error when it is set

* casting ResponseWriter in handleMonitor to logical.NamespaceResponseWriter

* Casting ResponseWriter conditionally for http.Flusher
Adding changelog

* Improving changlog message
  • Loading branch information
hghaf099 committed Jul 14, 2021
1 parent 1d0c286 commit 3a92d77
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 5 deletions.
18 changes: 15 additions & 3 deletions api/response.go
Expand Up @@ -41,12 +41,14 @@ func (r *Response) Error() error {

r.Body.Close()
r.Body = ioutil.NopCloser(bodyBuf)
ns := r.Header.Get("X-Vault-Namespace")

// Build up the error object
respErr := &ResponseError{
HTTPMethod: r.Request.Method,
URL: r.Request.URL.String(),
StatusCode: r.StatusCode,
HTTPMethod: r.Request.Method,
URL: r.Request.URL.String(),
StatusCode: r.StatusCode,
NamespacePath: ns,
}

// Decode the error response if we can. Note that we wrap the bodyBuf
Expand Down Expand Up @@ -92,6 +94,10 @@ type ResponseError struct {

// Errors are the underlying errors returned by Vault.
Errors []string

// Namespace path to be reported to the client if it is set to anything other
// than root
NamespacePath string
}

// Error returns a human-readable error string for the response error.
Expand All @@ -101,9 +107,15 @@ func (r *ResponseError) Error() string {
errString = "Raw Message"
}

ns := r.NamespacePath
if ns != "" && ns != "root" {
ns = "Namespace: " + ns + "\n"
}

var errBody bytes.Buffer
errBody.WriteString(fmt.Sprintf(
"Error making API request.\n\n"+
ns+
"URL: %s %s\n"+
"Code: %d. %s:\n\n",
r.HTTPMethod, r.URL, r.StatusCode, errString))
Expand Down
3 changes: 3 additions & 0 deletions changelog/12061.txt
@@ -0,0 +1,3 @@
```release-note:bug
core (enterprise): namespace header included in responses, Go client uses it when displaying error messages
```
5 changes: 4 additions & 1 deletion http/handler.go
Expand Up @@ -350,7 +350,10 @@ func wrapGenericHandler(core *vault.Core, h http.Handler, props *vault.HandlerPr
return
}

h.ServeHTTP(w, r)
h.ServeHTTP(&logical.NamespaceResponseWriter{
ResponseWriter: w,
NamespacePath: r.Header.Get("X-Vault-Namespace"),
}, r)

cancelFunc()
return
Expand Down
10 changes: 10 additions & 0 deletions sdk/logical/response_util.go
Expand Up @@ -155,7 +155,17 @@ func AdjustErrorStatusCode(status *int, err error) {
}
}

type NamespaceResponseWriter struct {
http.ResponseWriter
NamespacePath string
}

func RespondError(w http.ResponseWriter, status int, err error) {
nw, ok := w.(*NamespaceResponseWriter)
if ok && nw.NamespacePath != "" && nw.NamespacePath != "root" {
nw.Header().Set("X-Vault-Namespace", nw.NamespacePath)
}

AdjustErrorStatusCode(&status, err)

w.Header().Set("Content-Type", "application/json")
Expand Down
7 changes: 6 additions & 1 deletion vault/logical_system.go
Expand Up @@ -2925,7 +2925,12 @@ func (b *SystemBackend) handleMonitor(ctx context.Context, req *logical.Request,

flusher, ok := w.ResponseWriter.(http.Flusher)
if !ok {
return logical.ErrorResponse("streaming not supported"), nil
// Casting the logical.ResponseWriter and try http.Flusher again
nw := w.ResponseWriter.(*logical.NamespaceResponseWriter)
flusher, ok = nw.ResponseWriter.(http.Flusher)
if !ok {
return logical.ErrorResponse("streaming not supported"), nil
}
}

isJson := b.Core.LogFormat() == "json"
Expand Down

0 comments on commit 3a92d77

Please sign in to comment.