From 7a70b0a65b590e6391722671d23263736c6a9ae7 Mon Sep 17 00:00:00 2001 From: Victor Chudnovsky Date: Fri, 26 Apr 2024 14:29:48 -0700 Subject: [PATCH] feat: echo request headers in response over REST transport --- util/genrest/goviewcreator.go | 2 ++ util/genrest/resttools/headers.go | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/util/genrest/goviewcreator.go b/util/genrest/goviewcreator.go index d03b1a64..82d57507 100644 --- a/util/genrest/goviewcreator.go +++ b/util/genrest/goviewcreator.go @@ -93,6 +93,8 @@ func NewView(model *gomodel.Model) (*goview.View, error) { source.P(` backend.StdLog.Printf(" urlPathParams (expect %d, have %%d): %%q", numUrlPathParams, urlPathParams)`, len(allURLVariables)) source.P(` backend.StdLog.Printf(" urlRequestHeaders:\n%%s", resttools.PrettyPrintHeaders(r, " "))`) source.P("") + source.P(" resttools.IncludeRequestHeadersInResponse(w, r)") + source.P("") source.P(" if numUrlPathParams!=%d {", len(allURLVariables)) source.P(` backend.Error(w, http.StatusBadRequest, "found unexpected number of URL variables: expected %d, have %%d: %%#v", numUrlPathParams, urlPathParams)`, len(allURLVariables)) source.P(" return") diff --git a/util/genrest/resttools/headers.go b/util/genrest/resttools/headers.go index 3eebbe2e..a9a57da8 100644 --- a/util/genrest/resttools/headers.go +++ b/util/genrest/resttools/headers.go @@ -98,3 +98,16 @@ func PrettyPrintHeaders(request *http.Request, indentation string) string { } return strings.Join(lines, "\n") } + +// IncludeRequestHeadersInResponse includes all headers in the request `r` and includes them in the response `w`, +// prefixing each of these header keys with a constant to reflect they came from the request. +func IncludeRequestHeadersInResponse(w http.ResponseWriter, r *http.Request) { + const prefix = "x-showcase-request-" + + responseHeaders := w.Header() + for requestKey, valueList := range r.Header { + for _, value := range valueList { + responseHeaders.Add(prefix+requestKey, value) + } + } +}