Custom marshalers
Marshaler implementations can implement optional additional methods to customize their behaviour beyond the methods required by the core interface.
Stream delimiters
By default, a streamed response delimits each response body with a single newline ("\n"). You can change this delimiter by having your marshaler implement Delimited.
For example, to separate each entry with a pipe ("|") instead:
type YourMarshaler struct {
// ...
}
// ...
func (*YourMarshaler) Delimiter() []byte {
return []byte("|")
}
Stream content type
By default, a streamed response emits a Content-Type header that is the same for a unary response, from the ContentType() method of the Marshaler interface.
If you require the server to declare a distinct content type for stream responses versus unary responses, the marshaler must implement StreamContentType. This provides the MIME type when specifically responding to a streaming response.
For example, by default the JSONPb marshaler results in application/json for its Content-Type response header, irrespective of unary versus streaming. This can be changed for streaming endpoints by wrapping the marshaler with a custom marshaler that implements StreamContentType to return the NDJSON MIME type for streaming response endpoints:
type CustomJSONPb struct {
runtime.JSONPb
}
func (*CustomJSONPb) Delimiter() []byte {
// Strictly speaking this is already the default delimiter for JSONPb, but
// providing it here for completeness with an NDJSON marshaler all in one
// place.
return []byte("\n")
}
func (*CustomJSONPb) StreamContentType(interface{}) string {
return "application/x-ndjson"
}