generated from VLADIMIR/template
add zip
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user