Files
evening_detective_server/cmd/evening_detective_server/rawbody.go
T
2026-08-20 23:17:52 +07:00

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)
}