generated from VLADIMIR/template
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
|
"google.golang.org/genproto/googleapis/api/httpbody"
|
|
)
|
|
|
|
// rawBodyMarshaler — маршалер для бинарного тела (application/zip и др.):
|
|
// запрос попадает в HttpBody.Data без base64-JSON, для остального делегирует
|
|
// JSON-маршалеру (работает и {"data": "<base64>"}).
|
|
type rawBodyMarshaler struct {
|
|
runtime.Marshaler
|
|
}
|
|
|
|
func (m *rawBodyMarshaler) NewDecoder(r io.Reader) runtime.Decoder {
|
|
return rawBodyDecoder{
|
|
Decoder: m.Marshaler.NewDecoder(r),
|
|
r: r,
|
|
}
|
|
}
|
|
|
|
// rawBodyDecoder — Decoder: для *httpbody.HttpBody читает тело целиком в Data,
|
|
// для protobuf-сообщений декодирует JSON как обычно.
|
|
type rawBodyDecoder struct {
|
|
runtime.Decoder
|
|
r io.Reader
|
|
}
|
|
|
|
func (d rawBodyDecoder) Decode(v interface{}) error {
|
|
if body, ok := v.(*httpbody.HttpBody); ok {
|
|
data, err := io.ReadAll(d.r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
body.Data = data
|
|
return nil
|
|
}
|
|
return d.Decoder.Decode(v)
|
|
}
|