package runtime import ( "google.golang.org/genproto/googleapis/api/httpbody" ) // SetHTTPBodyMarshaler overwrite the default marshaler with the HTTPBodyMarshaler func SetHTTPBodyMarshaler(serveMux *ServeMux) { serveMux.marshalers.mimeMap[MIMEWildcard] = &HTTPBodyMarshaler{ Marshaler: &JSONPb{OrigName: true}, } } // HTTPBodyMarshaler is a Marshaler which supports marshaling of a // google.api.HttpBody message as the full response body if it is // the actual message used as the response. If not, then this will // simply fallback to the Marshaler specified as its default Marshaler. type HTTPBodyMarshaler struct { Marshaler } // ContentType implementation to keep backwards compatibility with marshal interface func (h *HTTPBodyMarshaler) ContentType() string { return h.ContentTypeFromMessage(nil) } // ContentTypeFromMessage in case v is a google.api.HttpBody message it returns // its specified content type otherwise fall back to the default Marshaler. func (h *HTTPBodyMarshaler) ContentTypeFromMessage(v interface{}) string { if httpBody, ok := v.(*httpbody.HttpBody); ok { return httpBody.GetContentType() } return h.Marshaler.ContentType() } // Marshal marshals "v" by returning the body bytes if v is a // google.api.HttpBody message, otherwise it falls back to the default Marshaler. func (h *HTTPBodyMarshaler) Marshal(v interface{}) ([]byte, error) { if httpBody, ok := v.(*httpbody.HttpBody); ok { return httpBody.Data, nil } return h.Marshaler.Marshal(v) }