go.uber.org/yarpc@v1.72.1/encoding/thrift/envelope.go (about) 1 // Copyright (c) 2022 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package thrift 22 23 import ( 24 "fmt" 25 "io" 26 27 "go.uber.org/thriftrw/protocol" 28 "go.uber.org/thriftrw/protocol/stream" 29 "go.uber.org/thriftrw/wire" 30 ) 31 32 type errUnexpectedEnvelopeType wire.EnvelopeType 33 34 func (e errUnexpectedEnvelopeType) Error() string { 35 return fmt.Sprintf("unexpected envelope type: %v", wire.EnvelopeType(e)) 36 } 37 38 // disableEnvelopingProtocol wraps a protocol to not envelope payloads. 39 type disableEnvelopingProtocol struct { 40 protocol.Protocol 41 42 // EnvelopeType to use for decoded envelopes. 43 Type wire.EnvelopeType 44 } 45 46 func (ev disableEnvelopingProtocol) EncodeEnveloped(e wire.Envelope, w io.Writer) error { 47 return ev.Encode(e.Value, w) 48 } 49 50 func (ev disableEnvelopingProtocol) DecodeEnveloped(r io.ReaderAt) (wire.Envelope, error) { 51 value, err := ev.Decode(r, wire.TStruct) 52 return wire.Envelope{ 53 Name: "", // we don't use the decoded name anywhere 54 Type: ev.Type, 55 SeqID: 1, 56 Value: value, 57 }, err 58 } 59 60 // disableEnvelopingNoWireProtocol wraps a 'stream.Protocol' to explicitly not 61 // perform any enveloping for payloads. For both the underlying 'stream.Reader' 62 // and 'stream.Writer' only the 'Begin's are overridden as the 'End's are 63 // already no-ops. 64 type disableEnvelopingNoWireProtocol struct { 65 stream.Protocol 66 67 // EnvelopeType to use for decoded envelopes. 68 Type wire.EnvelopeType 69 } 70 71 func (evnw disableEnvelopingNoWireProtocol) Reader(r io.Reader) stream.Reader { 72 return disableEnvelopingNoWireReader{ 73 Reader: evnw.Protocol.Reader(r), 74 Type: evnw.Type, 75 } 76 } 77 78 func (evnw disableEnvelopingNoWireProtocol) Writer(w io.Writer) stream.Writer { 79 return disableEnvelopingNoWireWriter{ 80 Writer: evnw.Protocol.Writer(w), 81 } 82 } 83 84 // disableEnvelopingNoWireReader overrides the normal ReadEnvelopeBegin with 85 // returning a fake envelope header without performing any reading. 86 type disableEnvelopingNoWireReader struct { 87 stream.Reader 88 89 Type wire.EnvelopeType 90 } 91 92 func (evnwr disableEnvelopingNoWireReader) ReadEnvelopeBegin() (stream.EnvelopeHeader, error) { 93 return stream.EnvelopeHeader{ 94 Name: "", // we don't use the decoded name anywhere 95 Type: evnwr.Type, 96 SeqID: 1, 97 }, nil 98 } 99 100 // disableEnvelopingNoWireWriter overrides the normal WriteEnvelopeBegin with not 101 // performing any writing of any enveloping. 102 type disableEnvelopingNoWireWriter struct { 103 stream.Writer 104 } 105 106 func (evnww disableEnvelopingNoWireWriter) WriteEnvelopeBegin(stream.EnvelopeHeader) error { 107 return nil 108 }