mirror of
https://github.com/1Password/onepassword-operator.git
synced 2025-10-23 07:58:04 +00:00
Update packages and add vendor directory
This commit is contained in:
0
vendor/github.com/uber/jaeger-client-go/thrift/.nocover
generated
vendored
Normal file
0
vendor/github.com/uber/jaeger-client-go/thrift/.nocover
generated
vendored
Normal file
11
vendor/github.com/uber/jaeger-client-go/thrift/README.md
generated
vendored
Normal file
11
vendor/github.com/uber/jaeger-client-go/thrift/README.md
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# Apache Thrift
|
||||
|
||||
This is a partial copy of Apache Thrift v0.14.1 (https://github.com/apache/thrift/commit/f6fa1794539e68ac294038ac388d6bde40a6c237).
|
||||
|
||||
It is vendored code to avoid compatibility issues with Thrift versions.
|
||||
|
||||
The file logger.go is modified to remove dependency on "testing" (see Issue #585).
|
||||
|
||||
See:
|
||||
* https://github.com/jaegertracing/jaeger-client-go/pull/584
|
||||
* https://github.com/jaegertracing/jaeger-client-go/pull/303
|
180
vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go
generated
vendored
Normal file
180
vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go
generated
vendored
Normal file
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
const (
|
||||
UNKNOWN_APPLICATION_EXCEPTION = 0
|
||||
UNKNOWN_METHOD = 1
|
||||
INVALID_MESSAGE_TYPE_EXCEPTION = 2
|
||||
WRONG_METHOD_NAME = 3
|
||||
BAD_SEQUENCE_ID = 4
|
||||
MISSING_RESULT = 5
|
||||
INTERNAL_ERROR = 6
|
||||
PROTOCOL_ERROR = 7
|
||||
INVALID_TRANSFORM = 8
|
||||
INVALID_PROTOCOL = 9
|
||||
UNSUPPORTED_CLIENT_TYPE = 10
|
||||
)
|
||||
|
||||
var defaultApplicationExceptionMessage = map[int32]string{
|
||||
UNKNOWN_APPLICATION_EXCEPTION: "unknown application exception",
|
||||
UNKNOWN_METHOD: "unknown method",
|
||||
INVALID_MESSAGE_TYPE_EXCEPTION: "invalid message type",
|
||||
WRONG_METHOD_NAME: "wrong method name",
|
||||
BAD_SEQUENCE_ID: "bad sequence ID",
|
||||
MISSING_RESULT: "missing result",
|
||||
INTERNAL_ERROR: "unknown internal error",
|
||||
PROTOCOL_ERROR: "unknown protocol error",
|
||||
INVALID_TRANSFORM: "Invalid transform",
|
||||
INVALID_PROTOCOL: "Invalid protocol",
|
||||
UNSUPPORTED_CLIENT_TYPE: "Unsupported client type",
|
||||
}
|
||||
|
||||
// Application level Thrift exception
|
||||
type TApplicationException interface {
|
||||
TException
|
||||
TypeId() int32
|
||||
Read(ctx context.Context, iprot TProtocol) error
|
||||
Write(ctx context.Context, oprot TProtocol) error
|
||||
}
|
||||
|
||||
type tApplicationException struct {
|
||||
message string
|
||||
type_ int32
|
||||
}
|
||||
|
||||
var _ TApplicationException = (*tApplicationException)(nil)
|
||||
|
||||
func (tApplicationException) TExceptionType() TExceptionType {
|
||||
return TExceptionTypeApplication
|
||||
}
|
||||
|
||||
func (e tApplicationException) Error() string {
|
||||
if e.message != "" {
|
||||
return e.message
|
||||
}
|
||||
return defaultApplicationExceptionMessage[e.type_]
|
||||
}
|
||||
|
||||
func NewTApplicationException(type_ int32, message string) TApplicationException {
|
||||
return &tApplicationException{message, type_}
|
||||
}
|
||||
|
||||
func (p *tApplicationException) TypeId() int32 {
|
||||
return p.type_
|
||||
}
|
||||
|
||||
func (p *tApplicationException) Read(ctx context.Context, iprot TProtocol) error {
|
||||
// TODO: this should really be generated by the compiler
|
||||
_, err := iprot.ReadStructBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
message := ""
|
||||
type_ := int32(UNKNOWN_APPLICATION_EXCEPTION)
|
||||
|
||||
for {
|
||||
_, ttype, id, err := iprot.ReadFieldBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if ttype == STOP {
|
||||
break
|
||||
}
|
||||
switch id {
|
||||
case 1:
|
||||
if ttype == STRING {
|
||||
if message, err = iprot.ReadString(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case 2:
|
||||
if ttype == I32 {
|
||||
if type_, err = iprot.ReadI32(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
default:
|
||||
if err = SkipDefaultDepth(ctx, iprot, ttype); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err = iprot.ReadFieldEnd(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := iprot.ReadStructEnd(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
p.message = message
|
||||
p.type_ = type_
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *tApplicationException) Write(ctx context.Context, oprot TProtocol) (err error) {
|
||||
err = oprot.WriteStructBegin(ctx, "TApplicationException")
|
||||
if len(p.Error()) > 0 {
|
||||
err = oprot.WriteFieldBegin(ctx, "message", STRING, 1)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteString(ctx, p.Error())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteFieldEnd(ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
err = oprot.WriteFieldBegin(ctx, "type", I32, 2)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteI32(ctx, p.type_)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteFieldEnd(ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteFieldStop(ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = oprot.WriteStructEnd(ctx)
|
||||
return
|
||||
}
|
555
vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go
generated
vendored
Normal file
555
vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go
generated
vendored
Normal file
@@ -0,0 +1,555 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
)
|
||||
|
||||
type TBinaryProtocol struct {
|
||||
trans TRichTransport
|
||||
origTransport TTransport
|
||||
cfg *TConfiguration
|
||||
buffer [64]byte
|
||||
}
|
||||
|
||||
type TBinaryProtocolFactory struct {
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTBinaryProtocolConf instead.
|
||||
func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol {
|
||||
return NewTBinaryProtocolConf(t, &TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTBinaryProtocolConf instead.
|
||||
func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol {
|
||||
return NewTBinaryProtocolConf(t, &TConfiguration{
|
||||
TBinaryStrictRead: &strictRead,
|
||||
TBinaryStrictWrite: &strictWrite,
|
||||
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
func NewTBinaryProtocolConf(t TTransport, conf *TConfiguration) *TBinaryProtocol {
|
||||
PropagateTConfiguration(t, conf)
|
||||
p := &TBinaryProtocol{
|
||||
origTransport: t,
|
||||
cfg: conf,
|
||||
}
|
||||
if et, ok := t.(TRichTransport); ok {
|
||||
p.trans = et
|
||||
} else {
|
||||
p.trans = NewTRichTransport(t)
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTBinaryProtocolFactoryConf instead.
|
||||
func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory {
|
||||
return NewTBinaryProtocolFactoryConf(&TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTBinaryProtocolFactoryConf instead.
|
||||
func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory {
|
||||
return NewTBinaryProtocolFactoryConf(&TConfiguration{
|
||||
TBinaryStrictRead: &strictRead,
|
||||
TBinaryStrictWrite: &strictWrite,
|
||||
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
func NewTBinaryProtocolFactoryConf(conf *TConfiguration) *TBinaryProtocolFactory {
|
||||
return &TBinaryProtocolFactory{
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol {
|
||||
return NewTBinaryProtocolConf(t, p.cfg)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocolFactory) SetTConfiguration(conf *TConfiguration) {
|
||||
p.cfg = conf
|
||||
}
|
||||
|
||||
/**
|
||||
* Writing Methods
|
||||
*/
|
||||
|
||||
func (p *TBinaryProtocol) WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqId int32) error {
|
||||
if p.cfg.GetTBinaryStrictWrite() {
|
||||
version := uint32(VERSION_1) | uint32(typeId)
|
||||
e := p.WriteI32(ctx, int32(version))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteString(ctx, name)
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI32(ctx, seqId)
|
||||
return e
|
||||
} else {
|
||||
e := p.WriteString(ctx, name)
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteByte(ctx, int8(typeId))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI32(ctx, seqId)
|
||||
return e
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteMessageEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteStructBegin(ctx context.Context, name string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteStructEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error {
|
||||
e := p.WriteByte(ctx, int8(typeId))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI16(ctx, id)
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteFieldEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteFieldStop(ctx context.Context) error {
|
||||
e := p.WriteByte(ctx, STOP)
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error {
|
||||
e := p.WriteByte(ctx, int8(keyType))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteByte(ctx, int8(valueType))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI32(ctx, int32(size))
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteMapEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteListBegin(ctx context.Context, elemType TType, size int) error {
|
||||
e := p.WriteByte(ctx, int8(elemType))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI32(ctx, int32(size))
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteListEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteSetBegin(ctx context.Context, elemType TType, size int) error {
|
||||
e := p.WriteByte(ctx, int8(elemType))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
e = p.WriteI32(ctx, int32(size))
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteSetEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteBool(ctx context.Context, value bool) error {
|
||||
if value {
|
||||
return p.WriteByte(ctx, 1)
|
||||
}
|
||||
return p.WriteByte(ctx, 0)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteByte(ctx context.Context, value int8) error {
|
||||
e := p.trans.WriteByte(byte(value))
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteI16(ctx context.Context, value int16) error {
|
||||
v := p.buffer[0:2]
|
||||
binary.BigEndian.PutUint16(v, uint16(value))
|
||||
_, e := p.trans.Write(v)
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteI32(ctx context.Context, value int32) error {
|
||||
v := p.buffer[0:4]
|
||||
binary.BigEndian.PutUint32(v, uint32(value))
|
||||
_, e := p.trans.Write(v)
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteI64(ctx context.Context, value int64) error {
|
||||
v := p.buffer[0:8]
|
||||
binary.BigEndian.PutUint64(v, uint64(value))
|
||||
_, err := p.trans.Write(v)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteDouble(ctx context.Context, value float64) error {
|
||||
return p.WriteI64(ctx, int64(math.Float64bits(value)))
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteString(ctx context.Context, value string) error {
|
||||
e := p.WriteI32(ctx, int32(len(value)))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
_, err := p.trans.WriteString(value)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) WriteBinary(ctx context.Context, value []byte) error {
|
||||
e := p.WriteI32(ctx, int32(len(value)))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
_, err := p.trans.Write(value)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
/**
|
||||
* Reading methods
|
||||
*/
|
||||
|
||||
func (p *TBinaryProtocol) ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqId int32, err error) {
|
||||
size, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
return "", typeId, 0, NewTProtocolException(e)
|
||||
}
|
||||
if size < 0 {
|
||||
typeId = TMessageType(size & 0x0ff)
|
||||
version := int64(int64(size) & VERSION_MASK)
|
||||
if version != VERSION_1 {
|
||||
return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin"))
|
||||
}
|
||||
name, e = p.ReadString(ctx)
|
||||
if e != nil {
|
||||
return name, typeId, seqId, NewTProtocolException(e)
|
||||
}
|
||||
seqId, e = p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
return name, typeId, seqId, NewTProtocolException(e)
|
||||
}
|
||||
return name, typeId, seqId, nil
|
||||
}
|
||||
if p.cfg.GetTBinaryStrictRead() {
|
||||
return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin"))
|
||||
}
|
||||
name, e2 := p.readStringBody(size)
|
||||
if e2 != nil {
|
||||
return name, typeId, seqId, e2
|
||||
}
|
||||
b, e3 := p.ReadByte(ctx)
|
||||
if e3 != nil {
|
||||
return name, typeId, seqId, e3
|
||||
}
|
||||
typeId = TMessageType(b)
|
||||
seqId, e4 := p.ReadI32(ctx)
|
||||
if e4 != nil {
|
||||
return name, typeId, seqId, e4
|
||||
}
|
||||
return name, typeId, seqId, nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadMessageEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadStructBegin(ctx context.Context) (name string, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadStructEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadFieldBegin(ctx context.Context) (name string, typeId TType, seqId int16, err error) {
|
||||
t, err := p.ReadByte(ctx)
|
||||
typeId = TType(t)
|
||||
if err != nil {
|
||||
return name, typeId, seqId, err
|
||||
}
|
||||
if t != STOP {
|
||||
seqId, err = p.ReadI16(ctx)
|
||||
}
|
||||
return name, typeId, seqId, err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadFieldEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length"))
|
||||
|
||||
func (p *TBinaryProtocol) ReadMapBegin(ctx context.Context) (kType, vType TType, size int, err error) {
|
||||
k, e := p.ReadByte(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
kType = TType(k)
|
||||
v, e := p.ReadByte(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
vType = TType(v)
|
||||
size32, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
if size32 < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
size = int(size32)
|
||||
return kType, vType, size, nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadMapEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadListBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
b, e := p.ReadByte(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
elemType = TType(b)
|
||||
size32, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
if size32 < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
size = int(size32)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadListEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadSetBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
b, e := p.ReadByte(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
elemType = TType(b)
|
||||
size32, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
if size32 < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
size = int(size32)
|
||||
return elemType, size, nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadSetEnd(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadBool(ctx context.Context) (bool, error) {
|
||||
b, e := p.ReadByte(ctx)
|
||||
v := true
|
||||
if b != 1 {
|
||||
v = false
|
||||
}
|
||||
return v, e
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadByte(ctx context.Context) (int8, error) {
|
||||
v, err := p.trans.ReadByte()
|
||||
return int8(v), err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadI16(ctx context.Context) (value int16, err error) {
|
||||
buf := p.buffer[0:2]
|
||||
err = p.readAll(ctx, buf)
|
||||
value = int16(binary.BigEndian.Uint16(buf))
|
||||
return value, err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadI32(ctx context.Context) (value int32, err error) {
|
||||
buf := p.buffer[0:4]
|
||||
err = p.readAll(ctx, buf)
|
||||
value = int32(binary.BigEndian.Uint32(buf))
|
||||
return value, err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadI64(ctx context.Context) (value int64, err error) {
|
||||
buf := p.buffer[0:8]
|
||||
err = p.readAll(ctx, buf)
|
||||
value = int64(binary.BigEndian.Uint64(buf))
|
||||
return value, err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadDouble(ctx context.Context) (value float64, err error) {
|
||||
buf := p.buffer[0:8]
|
||||
err = p.readAll(ctx, buf)
|
||||
value = math.Float64frombits(binary.BigEndian.Uint64(buf))
|
||||
return value, err
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadString(ctx context.Context) (value string, err error) {
|
||||
size, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
return "", e
|
||||
}
|
||||
err = checkSizeForProtocol(size, p.cfg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if size < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
if size == 0 {
|
||||
return "", nil
|
||||
}
|
||||
if size < int32(len(p.buffer)) {
|
||||
// Avoid allocation on small reads
|
||||
buf := p.buffer[:size]
|
||||
read, e := io.ReadFull(p.trans, buf)
|
||||
return string(buf[:read]), NewTProtocolException(e)
|
||||
}
|
||||
|
||||
return p.readStringBody(size)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) ReadBinary(ctx context.Context) ([]byte, error) {
|
||||
size, e := p.ReadI32(ctx)
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
if err := checkSizeForProtocol(size, p.cfg); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
buf, err := safeReadBytes(size, p.trans)
|
||||
return buf, NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) Flush(ctx context.Context) (err error) {
|
||||
return NewTProtocolException(p.trans.Flush(ctx))
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) Skip(ctx context.Context, fieldType TType) (err error) {
|
||||
return SkipDefaultDepth(ctx, p, fieldType)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) Transport() TTransport {
|
||||
return p.origTransport
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) readAll(ctx context.Context, buf []byte) (err error) {
|
||||
var read int
|
||||
_, deadlineSet := ctx.Deadline()
|
||||
for {
|
||||
read, err = io.ReadFull(p.trans, buf)
|
||||
if deadlineSet && read == 0 && isTimeoutError(err) && ctx.Err() == nil {
|
||||
// This is I/O timeout without anything read,
|
||||
// and we still have time left, keep retrying.
|
||||
continue
|
||||
}
|
||||
// For anything else, don't retry
|
||||
break
|
||||
}
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) {
|
||||
buf, err := safeReadBytes(size, p.trans)
|
||||
return string(buf), NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TBinaryProtocol) SetTConfiguration(conf *TConfiguration) {
|
||||
PropagateTConfiguration(p.trans, conf)
|
||||
PropagateTConfiguration(p.origTransport, conf)
|
||||
p.cfg = conf
|
||||
}
|
||||
|
||||
var (
|
||||
_ TConfigurationSetter = (*TBinaryProtocolFactory)(nil)
|
||||
_ TConfigurationSetter = (*TBinaryProtocol)(nil)
|
||||
)
|
||||
|
||||
// This function is shared between TBinaryProtocol and TCompactProtocol.
|
||||
//
|
||||
// It tries to read size bytes from trans, in a way that prevents large
|
||||
// allocations when size is insanely large (mostly caused by malformed message).
|
||||
func safeReadBytes(size int32, trans io.Reader) ([]byte, error) {
|
||||
if size < 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
buf := new(bytes.Buffer)
|
||||
_, err := io.CopyN(buf, trans, int64(size))
|
||||
return buf.Bytes(), err
|
||||
}
|
109
vendor/github.com/uber/jaeger-client-go/thrift/client.go
generated
vendored
Normal file
109
vendor/github.com/uber/jaeger-client-go/thrift/client.go
generated
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// ResponseMeta represents the metadata attached to the response.
|
||||
type ResponseMeta struct {
|
||||
// The headers in the response, if any.
|
||||
// If the underlying transport/protocol is not THeader, this will always be nil.
|
||||
Headers THeaderMap
|
||||
}
|
||||
|
||||
type TClient interface {
|
||||
Call(ctx context.Context, method string, args, result TStruct) (ResponseMeta, error)
|
||||
}
|
||||
|
||||
type TStandardClient struct {
|
||||
seqId int32
|
||||
iprot, oprot TProtocol
|
||||
}
|
||||
|
||||
// TStandardClient implements TClient, and uses the standard message format for Thrift.
|
||||
// It is not safe for concurrent use.
|
||||
func NewTStandardClient(inputProtocol, outputProtocol TProtocol) *TStandardClient {
|
||||
return &TStandardClient{
|
||||
iprot: inputProtocol,
|
||||
oprot: outputProtocol,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TStandardClient) Send(ctx context.Context, oprot TProtocol, seqId int32, method string, args TStruct) error {
|
||||
// Set headers from context object on THeaderProtocol
|
||||
if headerProt, ok := oprot.(*THeaderProtocol); ok {
|
||||
headerProt.ClearWriteHeaders()
|
||||
for _, key := range GetWriteHeaderList(ctx) {
|
||||
if value, ok := GetHeader(ctx, key); ok {
|
||||
headerProt.SetWriteHeader(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := oprot.WriteMessageBegin(ctx, method, CALL, seqId); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := args.Write(ctx, oprot); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := oprot.WriteMessageEnd(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
return oprot.Flush(ctx)
|
||||
}
|
||||
|
||||
func (p *TStandardClient) Recv(ctx context.Context, iprot TProtocol, seqId int32, method string, result TStruct) error {
|
||||
rMethod, rTypeId, rSeqId, err := iprot.ReadMessageBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if method != rMethod {
|
||||
return NewTApplicationException(WRONG_METHOD_NAME, fmt.Sprintf("%s: wrong method name", method))
|
||||
} else if seqId != rSeqId {
|
||||
return NewTApplicationException(BAD_SEQUENCE_ID, fmt.Sprintf("%s: out of order sequence response", method))
|
||||
} else if rTypeId == EXCEPTION {
|
||||
var exception tApplicationException
|
||||
if err := exception.Read(ctx, iprot); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := iprot.ReadMessageEnd(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return &exception
|
||||
} else if rTypeId != REPLY {
|
||||
return NewTApplicationException(INVALID_MESSAGE_TYPE_EXCEPTION, fmt.Sprintf("%s: invalid message type", method))
|
||||
}
|
||||
|
||||
if err := result.Read(ctx, iprot); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return iprot.ReadMessageEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *TStandardClient) Call(ctx context.Context, method string, args, result TStruct) (ResponseMeta, error) {
|
||||
p.seqId++
|
||||
seqId := p.seqId
|
||||
|
||||
if err := p.Send(ctx, p.oprot, seqId, method, args); err != nil {
|
||||
return ResponseMeta{}, err
|
||||
}
|
||||
|
||||
// method is oneway
|
||||
if result == nil {
|
||||
return ResponseMeta{}, nil
|
||||
}
|
||||
|
||||
err := p.Recv(ctx, p.iprot, seqId, method, result)
|
||||
var headers THeaderMap
|
||||
if hp, ok := p.iprot.(*THeaderProtocol); ok {
|
||||
headers = hp.transport.readHeaders
|
||||
}
|
||||
return ResponseMeta{
|
||||
Headers: headers,
|
||||
}, err
|
||||
}
|
865
vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go
generated
vendored
Normal file
865
vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go
generated
vendored
Normal file
@@ -0,0 +1,865 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
)
|
||||
|
||||
const (
|
||||
COMPACT_PROTOCOL_ID = 0x082
|
||||
COMPACT_VERSION = 1
|
||||
COMPACT_VERSION_MASK = 0x1f
|
||||
COMPACT_TYPE_MASK = 0x0E0
|
||||
COMPACT_TYPE_BITS = 0x07
|
||||
COMPACT_TYPE_SHIFT_AMOUNT = 5
|
||||
)
|
||||
|
||||
type tCompactType byte
|
||||
|
||||
const (
|
||||
COMPACT_BOOLEAN_TRUE = 0x01
|
||||
COMPACT_BOOLEAN_FALSE = 0x02
|
||||
COMPACT_BYTE = 0x03
|
||||
COMPACT_I16 = 0x04
|
||||
COMPACT_I32 = 0x05
|
||||
COMPACT_I64 = 0x06
|
||||
COMPACT_DOUBLE = 0x07
|
||||
COMPACT_BINARY = 0x08
|
||||
COMPACT_LIST = 0x09
|
||||
COMPACT_SET = 0x0A
|
||||
COMPACT_MAP = 0x0B
|
||||
COMPACT_STRUCT = 0x0C
|
||||
)
|
||||
|
||||
var (
|
||||
ttypeToCompactType map[TType]tCompactType
|
||||
)
|
||||
|
||||
func init() {
|
||||
ttypeToCompactType = map[TType]tCompactType{
|
||||
STOP: STOP,
|
||||
BOOL: COMPACT_BOOLEAN_TRUE,
|
||||
BYTE: COMPACT_BYTE,
|
||||
I16: COMPACT_I16,
|
||||
I32: COMPACT_I32,
|
||||
I64: COMPACT_I64,
|
||||
DOUBLE: COMPACT_DOUBLE,
|
||||
STRING: COMPACT_BINARY,
|
||||
LIST: COMPACT_LIST,
|
||||
SET: COMPACT_SET,
|
||||
MAP: COMPACT_MAP,
|
||||
STRUCT: COMPACT_STRUCT,
|
||||
}
|
||||
}
|
||||
|
||||
type TCompactProtocolFactory struct {
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTCompactProtocolFactoryConf instead.
|
||||
func NewTCompactProtocolFactory() *TCompactProtocolFactory {
|
||||
return NewTCompactProtocolFactoryConf(&TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
func NewTCompactProtocolFactoryConf(conf *TConfiguration) *TCompactProtocolFactory {
|
||||
return &TCompactProtocolFactory{
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol {
|
||||
return NewTCompactProtocolConf(trans, p.cfg)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocolFactory) SetTConfiguration(conf *TConfiguration) {
|
||||
p.cfg = conf
|
||||
}
|
||||
|
||||
type TCompactProtocol struct {
|
||||
trans TRichTransport
|
||||
origTransport TTransport
|
||||
|
||||
cfg *TConfiguration
|
||||
|
||||
// Used to keep track of the last field for the current and previous structs,
|
||||
// so we can do the delta stuff.
|
||||
lastField []int
|
||||
lastFieldId int
|
||||
|
||||
// If we encounter a boolean field begin, save the TField here so it can
|
||||
// have the value incorporated.
|
||||
booleanFieldName string
|
||||
booleanFieldId int16
|
||||
booleanFieldPending bool
|
||||
|
||||
// If we read a field header, and it's a boolean field, save the boolean
|
||||
// value here so that readBool can use it.
|
||||
boolValue bool
|
||||
boolValueIsNotNull bool
|
||||
buffer [64]byte
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTCompactProtocolConf instead.
|
||||
func NewTCompactProtocol(trans TTransport) *TCompactProtocol {
|
||||
return NewTCompactProtocolConf(trans, &TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
func NewTCompactProtocolConf(trans TTransport, conf *TConfiguration) *TCompactProtocol {
|
||||
PropagateTConfiguration(trans, conf)
|
||||
p := &TCompactProtocol{
|
||||
origTransport: trans,
|
||||
cfg: conf,
|
||||
}
|
||||
if et, ok := trans.(TRichTransport); ok {
|
||||
p.trans = et
|
||||
} else {
|
||||
p.trans = NewTRichTransport(trans)
|
||||
}
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
//
|
||||
// Public Writing methods.
|
||||
//
|
||||
|
||||
// Write a message header to the wire. Compact Protocol messages contain the
|
||||
// protocol version so we can migrate forwards in the future if need be.
|
||||
func (p *TCompactProtocol) WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqid int32) error {
|
||||
err := p.writeByteDirect(COMPACT_PROTOCOL_ID)
|
||||
if err != nil {
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK))
|
||||
if err != nil {
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
_, err = p.writeVarint32(seqid)
|
||||
if err != nil {
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
e := p.WriteString(ctx, name)
|
||||
return e
|
||||
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteMessageEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Write a struct begin. This doesn't actually put anything on the wire. We
|
||||
// use it as an opportunity to put special placeholder markers on the field
|
||||
// stack so we can get the field id deltas correct.
|
||||
func (p *TCompactProtocol) WriteStructBegin(ctx context.Context, name string) error {
|
||||
p.lastField = append(p.lastField, p.lastFieldId)
|
||||
p.lastFieldId = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
// Write a struct end. This doesn't actually put anything on the wire. We use
|
||||
// this as an opportunity to pop the last field from the current struct off
|
||||
// of the field stack.
|
||||
func (p *TCompactProtocol) WriteStructEnd(ctx context.Context) error {
|
||||
if len(p.lastField) <= 0 {
|
||||
return NewTProtocolExceptionWithType(INVALID_DATA, errors.New("WriteStructEnd called without matching WriteStructBegin call before"))
|
||||
}
|
||||
p.lastFieldId = p.lastField[len(p.lastField)-1]
|
||||
p.lastField = p.lastField[:len(p.lastField)-1]
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error {
|
||||
if typeId == BOOL {
|
||||
// we want to possibly include the value, so we'll wait.
|
||||
p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true
|
||||
return nil
|
||||
}
|
||||
_, err := p.writeFieldBeginInternal(ctx, name, typeId, id, 0xFF)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// The workhorse of writeFieldBegin. It has the option of doing a
|
||||
// 'type override' of the type header. This is used specifically in the
|
||||
// boolean field case.
|
||||
func (p *TCompactProtocol) writeFieldBeginInternal(ctx context.Context, name string, typeId TType, id int16, typeOverride byte) (int, error) {
|
||||
// short lastField = lastField_.pop();
|
||||
|
||||
// if there's a type override, use that.
|
||||
var typeToWrite byte
|
||||
if typeOverride == 0xFF {
|
||||
typeToWrite = byte(p.getCompactType(typeId))
|
||||
} else {
|
||||
typeToWrite = typeOverride
|
||||
}
|
||||
// check if we can use delta encoding for the field id
|
||||
fieldId := int(id)
|
||||
written := 0
|
||||
if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 {
|
||||
// write them together
|
||||
err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
} else {
|
||||
// write them separate
|
||||
err := p.writeByteDirect(typeToWrite)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
err = p.WriteI16(ctx, id)
|
||||
written = 1 + 2
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
|
||||
p.lastFieldId = fieldId
|
||||
return written, nil
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteFieldEnd(ctx context.Context) error { return nil }
|
||||
|
||||
func (p *TCompactProtocol) WriteFieldStop(ctx context.Context) error {
|
||||
err := p.writeByteDirect(STOP)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error {
|
||||
if size == 0 {
|
||||
err := p.writeByteDirect(0)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
_, err := p.writeVarint32(int32(size))
|
||||
if err != nil {
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType)))
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteMapEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Write a list header.
|
||||
func (p *TCompactProtocol) WriteListBegin(ctx context.Context, elemType TType, size int) error {
|
||||
_, err := p.writeCollectionBegin(elemType, size)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteListEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Write a set header.
|
||||
func (p *TCompactProtocol) WriteSetBegin(ctx context.Context, elemType TType, size int) error {
|
||||
_, err := p.writeCollectionBegin(elemType, size)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) WriteSetEnd(ctx context.Context) error { return nil }
|
||||
|
||||
func (p *TCompactProtocol) WriteBool(ctx context.Context, value bool) error {
|
||||
v := byte(COMPACT_BOOLEAN_FALSE)
|
||||
if value {
|
||||
v = byte(COMPACT_BOOLEAN_TRUE)
|
||||
}
|
||||
if p.booleanFieldPending {
|
||||
// we haven't written the field header yet
|
||||
_, err := p.writeFieldBeginInternal(ctx, p.booleanFieldName, BOOL, p.booleanFieldId, v)
|
||||
p.booleanFieldPending = false
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
// we're not part of a field, so just write the value.
|
||||
err := p.writeByteDirect(v)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write a byte. Nothing to see here!
|
||||
func (p *TCompactProtocol) WriteByte(ctx context.Context, value int8) error {
|
||||
err := p.writeByteDirect(byte(value))
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write an I16 as a zigzag varint.
|
||||
func (p *TCompactProtocol) WriteI16(ctx context.Context, value int16) error {
|
||||
_, err := p.writeVarint32(p.int32ToZigzag(int32(value)))
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write an i32 as a zigzag varint.
|
||||
func (p *TCompactProtocol) WriteI32(ctx context.Context, value int32) error {
|
||||
_, err := p.writeVarint32(p.int32ToZigzag(value))
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write an i64 as a zigzag varint.
|
||||
func (p *TCompactProtocol) WriteI64(ctx context.Context, value int64) error {
|
||||
_, err := p.writeVarint64(p.int64ToZigzag(value))
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write a double to the wire as 8 bytes.
|
||||
func (p *TCompactProtocol) WriteDouble(ctx context.Context, value float64) error {
|
||||
buf := p.buffer[0:8]
|
||||
binary.LittleEndian.PutUint64(buf, math.Float64bits(value))
|
||||
_, err := p.trans.Write(buf)
|
||||
return NewTProtocolException(err)
|
||||
}
|
||||
|
||||
// Write a string to the wire with a varint size preceding.
|
||||
func (p *TCompactProtocol) WriteString(ctx context.Context, value string) error {
|
||||
_, e := p.writeVarint32(int32(len(value)))
|
||||
if e != nil {
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
if len(value) > 0 {
|
||||
}
|
||||
_, e = p.trans.WriteString(value)
|
||||
return e
|
||||
}
|
||||
|
||||
// Write a byte array, using a varint for the size.
|
||||
func (p *TCompactProtocol) WriteBinary(ctx context.Context, bin []byte) error {
|
||||
_, e := p.writeVarint32(int32(len(bin)))
|
||||
if e != nil {
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
if len(bin) > 0 {
|
||||
_, e = p.trans.Write(bin)
|
||||
return NewTProtocolException(e)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//
|
||||
// Reading methods.
|
||||
//
|
||||
|
||||
// Read a message header.
|
||||
func (p *TCompactProtocol) ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqId int32, err error) {
|
||||
var protocolId byte
|
||||
|
||||
_, deadlineSet := ctx.Deadline()
|
||||
for {
|
||||
protocolId, err = p.readByteDirect()
|
||||
if deadlineSet && isTimeoutError(err) && ctx.Err() == nil {
|
||||
// keep retrying I/O timeout errors since we still have
|
||||
// time left
|
||||
continue
|
||||
}
|
||||
// For anything else, don't retry
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if protocolId != COMPACT_PROTOCOL_ID {
|
||||
e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId)
|
||||
return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e)
|
||||
}
|
||||
|
||||
versionAndType, err := p.readByteDirect()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
version := versionAndType & COMPACT_VERSION_MASK
|
||||
typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS)
|
||||
if version != COMPACT_VERSION {
|
||||
e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version)
|
||||
err = NewTProtocolExceptionWithType(BAD_VERSION, e)
|
||||
return
|
||||
}
|
||||
seqId, e := p.readVarint32()
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
name, err = p.ReadString(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) ReadMessageEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Read a struct begin. There's nothing on the wire for this, but it is our
|
||||
// opportunity to push a new struct begin marker onto the field stack.
|
||||
func (p *TCompactProtocol) ReadStructBegin(ctx context.Context) (name string, err error) {
|
||||
p.lastField = append(p.lastField, p.lastFieldId)
|
||||
p.lastFieldId = 0
|
||||
return
|
||||
}
|
||||
|
||||
// Doesn't actually consume any wire data, just removes the last field for
|
||||
// this struct from the field stack.
|
||||
func (p *TCompactProtocol) ReadStructEnd(ctx context.Context) error {
|
||||
// consume the last field we read off the wire.
|
||||
if len(p.lastField) <= 0 {
|
||||
return NewTProtocolExceptionWithType(INVALID_DATA, errors.New("ReadStructEnd called without matching ReadStructBegin call before"))
|
||||
}
|
||||
p.lastFieldId = p.lastField[len(p.lastField)-1]
|
||||
p.lastField = p.lastField[:len(p.lastField)-1]
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read a field header off the wire.
|
||||
func (p *TCompactProtocol) ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error) {
|
||||
t, err := p.readByteDirect()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// if it's a stop, then we can return immediately, as the struct is over.
|
||||
if (t & 0x0f) == STOP {
|
||||
return "", STOP, 0, nil
|
||||
}
|
||||
|
||||
// mask off the 4 MSB of the type header. it could contain a field id delta.
|
||||
modifier := int16((t & 0xf0) >> 4)
|
||||
if modifier == 0 {
|
||||
// not a delta. look ahead for the zigzag varint field id.
|
||||
id, err = p.ReadI16(ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// has a delta. add the delta to the last read field id.
|
||||
id = int16(p.lastFieldId) + modifier
|
||||
}
|
||||
typeId, e := p.getTType(tCompactType(t & 0x0f))
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
|
||||
// if this happens to be a boolean field, the value is encoded in the type
|
||||
if p.isBoolType(t) {
|
||||
// save the boolean value in a special instance variable.
|
||||
p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE)
|
||||
p.boolValueIsNotNull = true
|
||||
}
|
||||
|
||||
// push the new field onto the field stack so we can keep the deltas going.
|
||||
p.lastFieldId = int(id)
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) ReadFieldEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Read a map header off the wire. If the size is zero, skip reading the key
|
||||
// and value type. This means that 0-length maps will yield TMaps without the
|
||||
// "correct" types.
|
||||
func (p *TCompactProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error) {
|
||||
size32, e := p.readVarint32()
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
if size32 < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
size = int(size32)
|
||||
|
||||
keyAndValueType := byte(STOP)
|
||||
if size != 0 {
|
||||
keyAndValueType, err = p.readByteDirect()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4))
|
||||
valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf))
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) ReadMapEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Read a list header off the wire. If the list size is 0-14, the size will
|
||||
// be packed into the element type header. If it's a longer list, the 4 MSB
|
||||
// of the element type header will be 0xF, and a varint will follow with the
|
||||
// true size.
|
||||
func (p *TCompactProtocol) ReadListBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
size_and_type, err := p.readByteDirect()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
size = int((size_and_type >> 4) & 0x0f)
|
||||
if size == 15 {
|
||||
size2, e := p.readVarint32()
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
if size2 < 0 {
|
||||
err = invalidDataLength
|
||||
return
|
||||
}
|
||||
size = int(size2)
|
||||
}
|
||||
elemType, e := p.getTType(tCompactType(size_and_type))
|
||||
if e != nil {
|
||||
err = NewTProtocolException(e)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) ReadListEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Read a set header off the wire. If the set size is 0-14, the size will
|
||||
// be packed into the element type header. If it's a longer set, the 4 MSB
|
||||
// of the element type header will be 0xF, and a varint will follow with the
|
||||
// true size.
|
||||
func (p *TCompactProtocol) ReadSetBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
return p.ReadListBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) ReadSetEnd(ctx context.Context) error { return nil }
|
||||
|
||||
// Read a boolean off the wire. If this is a boolean field, the value should
|
||||
// already have been read during readFieldBegin, so we'll just consume the
|
||||
// pre-stored value. Otherwise, read a byte.
|
||||
func (p *TCompactProtocol) ReadBool(ctx context.Context) (value bool, err error) {
|
||||
if p.boolValueIsNotNull {
|
||||
p.boolValueIsNotNull = false
|
||||
return p.boolValue, nil
|
||||
}
|
||||
v, err := p.readByteDirect()
|
||||
return v == COMPACT_BOOLEAN_TRUE, err
|
||||
}
|
||||
|
||||
// Read a single byte off the wire. Nothing interesting here.
|
||||
func (p *TCompactProtocol) ReadByte(ctx context.Context) (int8, error) {
|
||||
v, err := p.readByteDirect()
|
||||
if err != nil {
|
||||
return 0, NewTProtocolException(err)
|
||||
}
|
||||
return int8(v), err
|
||||
}
|
||||
|
||||
// Read an i16 from the wire as a zigzag varint.
|
||||
func (p *TCompactProtocol) ReadI16(ctx context.Context) (value int16, err error) {
|
||||
v, err := p.ReadI32(ctx)
|
||||
return int16(v), err
|
||||
}
|
||||
|
||||
// Read an i32 from the wire as a zigzag varint.
|
||||
func (p *TCompactProtocol) ReadI32(ctx context.Context) (value int32, err error) {
|
||||
v, e := p.readVarint32()
|
||||
if e != nil {
|
||||
return 0, NewTProtocolException(e)
|
||||
}
|
||||
value = p.zigzagToInt32(v)
|
||||
return value, nil
|
||||
}
|
||||
|
||||
// Read an i64 from the wire as a zigzag varint.
|
||||
func (p *TCompactProtocol) ReadI64(ctx context.Context) (value int64, err error) {
|
||||
v, e := p.readVarint64()
|
||||
if e != nil {
|
||||
return 0, NewTProtocolException(e)
|
||||
}
|
||||
value = p.zigzagToInt64(v)
|
||||
return value, nil
|
||||
}
|
||||
|
||||
// No magic here - just read a double off the wire.
|
||||
func (p *TCompactProtocol) ReadDouble(ctx context.Context) (value float64, err error) {
|
||||
longBits := p.buffer[0:8]
|
||||
_, e := io.ReadFull(p.trans, longBits)
|
||||
if e != nil {
|
||||
return 0.0, NewTProtocolException(e)
|
||||
}
|
||||
return math.Float64frombits(p.bytesToUint64(longBits)), nil
|
||||
}
|
||||
|
||||
// Reads a []byte (via readBinary), and then UTF-8 decodes it.
|
||||
func (p *TCompactProtocol) ReadString(ctx context.Context) (value string, err error) {
|
||||
length, e := p.readVarint32()
|
||||
if e != nil {
|
||||
return "", NewTProtocolException(e)
|
||||
}
|
||||
err = checkSizeForProtocol(length, p.cfg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if length == 0 {
|
||||
return "", nil
|
||||
}
|
||||
if length < int32(len(p.buffer)) {
|
||||
// Avoid allocation on small reads
|
||||
buf := p.buffer[:length]
|
||||
read, e := io.ReadFull(p.trans, buf)
|
||||
return string(buf[:read]), NewTProtocolException(e)
|
||||
}
|
||||
|
||||
buf, e := safeReadBytes(length, p.trans)
|
||||
return string(buf), NewTProtocolException(e)
|
||||
}
|
||||
|
||||
// Read a []byte from the wire.
|
||||
func (p *TCompactProtocol) ReadBinary(ctx context.Context) (value []byte, err error) {
|
||||
length, e := p.readVarint32()
|
||||
if e != nil {
|
||||
return nil, NewTProtocolException(e)
|
||||
}
|
||||
err = checkSizeForProtocol(length, p.cfg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if length == 0 {
|
||||
return []byte{}, nil
|
||||
}
|
||||
|
||||
buf, e := safeReadBytes(length, p.trans)
|
||||
return buf, NewTProtocolException(e)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) Flush(ctx context.Context) (err error) {
|
||||
return NewTProtocolException(p.trans.Flush(ctx))
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) Skip(ctx context.Context, fieldType TType) (err error) {
|
||||
return SkipDefaultDepth(ctx, p, fieldType)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) Transport() TTransport {
|
||||
return p.origTransport
|
||||
}
|
||||
|
||||
//
|
||||
// Internal writing methods
|
||||
//
|
||||
|
||||
// Abstract method for writing the start of lists and sets. List and sets on
|
||||
// the wire differ only by the type indicator.
|
||||
func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) {
|
||||
if size <= 14 {
|
||||
return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType))))
|
||||
}
|
||||
err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType)))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
m, err := p.writeVarint32(int32(size))
|
||||
return 1 + m, err
|
||||
}
|
||||
|
||||
// Write an i32 as a varint. Results in 1-5 bytes on the wire.
|
||||
// TODO(pomack): make a permanent buffer like writeVarint64?
|
||||
func (p *TCompactProtocol) writeVarint32(n int32) (int, error) {
|
||||
i32buf := p.buffer[0:5]
|
||||
idx := 0
|
||||
for {
|
||||
if (n & ^0x7F) == 0 {
|
||||
i32buf[idx] = byte(n)
|
||||
idx++
|
||||
// p.writeByteDirect(byte(n));
|
||||
break
|
||||
// return;
|
||||
} else {
|
||||
i32buf[idx] = byte((n & 0x7F) | 0x80)
|
||||
idx++
|
||||
// p.writeByteDirect(byte(((n & 0x7F) | 0x80)));
|
||||
u := uint32(n)
|
||||
n = int32(u >> 7)
|
||||
}
|
||||
}
|
||||
return p.trans.Write(i32buf[0:idx])
|
||||
}
|
||||
|
||||
// Write an i64 as a varint. Results in 1-10 bytes on the wire.
|
||||
func (p *TCompactProtocol) writeVarint64(n int64) (int, error) {
|
||||
varint64out := p.buffer[0:10]
|
||||
idx := 0
|
||||
for {
|
||||
if (n & ^0x7F) == 0 {
|
||||
varint64out[idx] = byte(n)
|
||||
idx++
|
||||
break
|
||||
} else {
|
||||
varint64out[idx] = byte((n & 0x7F) | 0x80)
|
||||
idx++
|
||||
u := uint64(n)
|
||||
n = int64(u >> 7)
|
||||
}
|
||||
}
|
||||
return p.trans.Write(varint64out[0:idx])
|
||||
}
|
||||
|
||||
// Convert l into a zigzag long. This allows negative numbers to be
|
||||
// represented compactly as a varint.
|
||||
func (p *TCompactProtocol) int64ToZigzag(l int64) int64 {
|
||||
return (l << 1) ^ (l >> 63)
|
||||
}
|
||||
|
||||
// Convert l into a zigzag long. This allows negative numbers to be
|
||||
// represented compactly as a varint.
|
||||
func (p *TCompactProtocol) int32ToZigzag(n int32) int32 {
|
||||
return (n << 1) ^ (n >> 31)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) {
|
||||
binary.LittleEndian.PutUint64(buf, n)
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) {
|
||||
binary.LittleEndian.PutUint64(buf, uint64(n))
|
||||
}
|
||||
|
||||
// Writes a byte without any possibility of all that field header nonsense.
|
||||
// Used internally by other writing methods that know they need to write a byte.
|
||||
func (p *TCompactProtocol) writeByteDirect(b byte) error {
|
||||
return p.trans.WriteByte(b)
|
||||
}
|
||||
|
||||
// Writes a byte without any possibility of all that field header nonsense.
|
||||
func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) {
|
||||
return 1, p.writeByteDirect(byte(n))
|
||||
}
|
||||
|
||||
//
|
||||
// Internal reading methods
|
||||
//
|
||||
|
||||
// Read an i32 from the wire as a varint. The MSB of each byte is set
|
||||
// if there is another byte to follow. This can read up to 5 bytes.
|
||||
func (p *TCompactProtocol) readVarint32() (int32, error) {
|
||||
// if the wire contains the right stuff, this will just truncate the i64 we
|
||||
// read and get us the right sign.
|
||||
v, err := p.readVarint64()
|
||||
return int32(v), err
|
||||
}
|
||||
|
||||
// Read an i64 from the wire as a proper varint. The MSB of each byte is set
|
||||
// if there is another byte to follow. This can read up to 10 bytes.
|
||||
func (p *TCompactProtocol) readVarint64() (int64, error) {
|
||||
shift := uint(0)
|
||||
result := int64(0)
|
||||
for {
|
||||
b, err := p.readByteDirect()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
result |= int64(b&0x7f) << shift
|
||||
if (b & 0x80) != 0x80 {
|
||||
break
|
||||
}
|
||||
shift += 7
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Read a byte, unlike ReadByte that reads Thrift-byte that is i8.
|
||||
func (p *TCompactProtocol) readByteDirect() (byte, error) {
|
||||
return p.trans.ReadByte()
|
||||
}
|
||||
|
||||
//
|
||||
// encoding helpers
|
||||
//
|
||||
|
||||
// Convert from zigzag int to int.
|
||||
func (p *TCompactProtocol) zigzagToInt32(n int32) int32 {
|
||||
u := uint32(n)
|
||||
return int32(u>>1) ^ -(n & 1)
|
||||
}
|
||||
|
||||
// Convert from zigzag long to long.
|
||||
func (p *TCompactProtocol) zigzagToInt64(n int64) int64 {
|
||||
u := uint64(n)
|
||||
return int64(u>>1) ^ -(n & 1)
|
||||
}
|
||||
|
||||
// Note that it's important that the mask bytes are long literals,
|
||||
// otherwise they'll default to ints, and when you shift an int left 56 bits,
|
||||
// you just get a messed up int.
|
||||
func (p *TCompactProtocol) bytesToInt64(b []byte) int64 {
|
||||
return int64(binary.LittleEndian.Uint64(b))
|
||||
}
|
||||
|
||||
// Note that it's important that the mask bytes are long literals,
|
||||
// otherwise they'll default to ints, and when you shift an int left 56 bits,
|
||||
// you just get a messed up int.
|
||||
func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 {
|
||||
return binary.LittleEndian.Uint64(b)
|
||||
}
|
||||
|
||||
//
|
||||
// type testing and converting
|
||||
//
|
||||
|
||||
func (p *TCompactProtocol) isBoolType(b byte) bool {
|
||||
return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE
|
||||
}
|
||||
|
||||
// Given a tCompactType constant, convert it to its corresponding
|
||||
// TType value.
|
||||
func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) {
|
||||
switch byte(t) & 0x0f {
|
||||
case STOP:
|
||||
return STOP, nil
|
||||
case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE:
|
||||
return BOOL, nil
|
||||
case COMPACT_BYTE:
|
||||
return BYTE, nil
|
||||
case COMPACT_I16:
|
||||
return I16, nil
|
||||
case COMPACT_I32:
|
||||
return I32, nil
|
||||
case COMPACT_I64:
|
||||
return I64, nil
|
||||
case COMPACT_DOUBLE:
|
||||
return DOUBLE, nil
|
||||
case COMPACT_BINARY:
|
||||
return STRING, nil
|
||||
case COMPACT_LIST:
|
||||
return LIST, nil
|
||||
case COMPACT_SET:
|
||||
return SET, nil
|
||||
case COMPACT_MAP:
|
||||
return MAP, nil
|
||||
case COMPACT_STRUCT:
|
||||
return STRUCT, nil
|
||||
}
|
||||
return STOP, NewTProtocolException(fmt.Errorf("don't know what type: %v", t&0x0f))
|
||||
}
|
||||
|
||||
// Given a TType value, find the appropriate TCompactProtocol.Types constant.
|
||||
func (p *TCompactProtocol) getCompactType(t TType) tCompactType {
|
||||
return ttypeToCompactType[t]
|
||||
}
|
||||
|
||||
func (p *TCompactProtocol) SetTConfiguration(conf *TConfiguration) {
|
||||
PropagateTConfiguration(p.trans, conf)
|
||||
PropagateTConfiguration(p.origTransport, conf)
|
||||
p.cfg = conf
|
||||
}
|
||||
|
||||
var (
|
||||
_ TConfigurationSetter = (*TCompactProtocolFactory)(nil)
|
||||
_ TConfigurationSetter = (*TCompactProtocol)(nil)
|
||||
)
|
378
vendor/github.com/uber/jaeger-client-go/thrift/configuration.go
generated
vendored
Normal file
378
vendor/github.com/uber/jaeger-client-go/thrift/configuration.go
generated
vendored
Normal file
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Default TConfiguration values.
|
||||
const (
|
||||
DEFAULT_MAX_MESSAGE_SIZE = 100 * 1024 * 1024
|
||||
DEFAULT_MAX_FRAME_SIZE = 16384000
|
||||
|
||||
DEFAULT_TBINARY_STRICT_READ = false
|
||||
DEFAULT_TBINARY_STRICT_WRITE = true
|
||||
|
||||
DEFAULT_CONNECT_TIMEOUT = 0
|
||||
DEFAULT_SOCKET_TIMEOUT = 0
|
||||
)
|
||||
|
||||
// TConfiguration defines some configurations shared between TTransport,
|
||||
// TProtocol, TTransportFactory, TProtocolFactory, and other implementations.
|
||||
//
|
||||
// When constructing TConfiguration, you only need to specify the non-default
|
||||
// fields. All zero values have sane default values.
|
||||
//
|
||||
// Not all configurations defined are applicable to all implementations.
|
||||
// Implementations are free to ignore the configurations not applicable to them.
|
||||
//
|
||||
// All functions attached to this type are nil-safe.
|
||||
//
|
||||
// See [1] for spec.
|
||||
//
|
||||
// NOTE: When using TConfiguration, fill in all the configurations you want to
|
||||
// set across the stack, not only the ones you want to set in the immediate
|
||||
// TTransport/TProtocol.
|
||||
//
|
||||
// For example, say you want to migrate this old code into using TConfiguration:
|
||||
//
|
||||
// sccket := thrift.NewTSocketTimeout("host:port", time.Second)
|
||||
// transFactory := thrift.NewTFramedTransportFactoryMaxLength(
|
||||
// thrift.NewTTransportFactory(),
|
||||
// 1024 * 1024 * 256,
|
||||
// )
|
||||
// protoFactory := thrift.NewTBinaryProtocolFactory(true, true)
|
||||
//
|
||||
// This is the wrong way to do it because in the end the TConfiguration used by
|
||||
// socket and transFactory will be overwritten by the one used by protoFactory
|
||||
// because of TConfiguration propagation:
|
||||
//
|
||||
// // bad example, DO NOT USE
|
||||
// sccket := thrift.NewTSocketConf("host:port", &thrift.TConfiguration{
|
||||
// ConnectTimeout: time.Second,
|
||||
// SocketTimeout: time.Second,
|
||||
// })
|
||||
// transFactory := thrift.NewTFramedTransportFactoryConf(
|
||||
// thrift.NewTTransportFactory(),
|
||||
// &thrift.TConfiguration{
|
||||
// MaxFrameSize: 1024 * 1024 * 256,
|
||||
// },
|
||||
// )
|
||||
// protoFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{
|
||||
// TBinaryStrictRead: thrift.BoolPtr(true),
|
||||
// TBinaryStrictWrite: thrift.BoolPtr(true),
|
||||
// })
|
||||
//
|
||||
// This is the correct way to do it:
|
||||
//
|
||||
// conf := &thrift.TConfiguration{
|
||||
// ConnectTimeout: time.Second,
|
||||
// SocketTimeout: time.Second,
|
||||
//
|
||||
// MaxFrameSize: 1024 * 1024 * 256,
|
||||
//
|
||||
// TBinaryStrictRead: thrift.BoolPtr(true),
|
||||
// TBinaryStrictWrite: thrift.BoolPtr(true),
|
||||
// }
|
||||
// sccket := thrift.NewTSocketConf("host:port", conf)
|
||||
// transFactory := thrift.NewTFramedTransportFactoryConf(thrift.NewTTransportFactory(), conf)
|
||||
// protoFactory := thrift.NewTBinaryProtocolFactoryConf(conf)
|
||||
//
|
||||
// [1]: https://github.com/apache/thrift/blob/master/doc/specs/thrift-tconfiguration.md
|
||||
type TConfiguration struct {
|
||||
// If <= 0, DEFAULT_MAX_MESSAGE_SIZE will be used instead.
|
||||
MaxMessageSize int32
|
||||
|
||||
// If <= 0, DEFAULT_MAX_FRAME_SIZE will be used instead.
|
||||
//
|
||||
// Also if MaxMessageSize < MaxFrameSize,
|
||||
// MaxMessageSize will be used instead.
|
||||
MaxFrameSize int32
|
||||
|
||||
// Connect and socket timeouts to be used by TSocket and TSSLSocket.
|
||||
//
|
||||
// 0 means no timeout.
|
||||
//
|
||||
// If <0, DEFAULT_CONNECT_TIMEOUT and DEFAULT_SOCKET_TIMEOUT will be
|
||||
// used.
|
||||
ConnectTimeout time.Duration
|
||||
SocketTimeout time.Duration
|
||||
|
||||
// TLS config to be used by TSSLSocket.
|
||||
TLSConfig *tls.Config
|
||||
|
||||
// Strict read/write configurations for TBinaryProtocol.
|
||||
//
|
||||
// BoolPtr helper function is available to use literal values.
|
||||
TBinaryStrictRead *bool
|
||||
TBinaryStrictWrite *bool
|
||||
|
||||
// The wrapped protocol id to be used in THeader transport/protocol.
|
||||
//
|
||||
// THeaderProtocolIDPtr and THeaderProtocolIDPtrMust helper functions
|
||||
// are provided to help filling this value.
|
||||
THeaderProtocolID *THeaderProtocolID
|
||||
|
||||
// Used internally by deprecated constructors, to avoid overriding
|
||||
// underlying TTransport/TProtocol's cfg by accidental propagations.
|
||||
//
|
||||
// For external users this is always false.
|
||||
noPropagation bool
|
||||
}
|
||||
|
||||
// GetMaxMessageSize returns the max message size an implementation should
|
||||
// follow.
|
||||
//
|
||||
// It's nil-safe. DEFAULT_MAX_MESSAGE_SIZE will be returned if tc is nil.
|
||||
func (tc *TConfiguration) GetMaxMessageSize() int32 {
|
||||
if tc == nil || tc.MaxMessageSize <= 0 {
|
||||
return DEFAULT_MAX_MESSAGE_SIZE
|
||||
}
|
||||
return tc.MaxMessageSize
|
||||
}
|
||||
|
||||
// GetMaxFrameSize returns the max frame size an implementation should follow.
|
||||
//
|
||||
// It's nil-safe. DEFAULT_MAX_FRAME_SIZE will be returned if tc is nil.
|
||||
//
|
||||
// If the configured max message size is smaller than the configured max frame
|
||||
// size, the smaller one will be returned instead.
|
||||
func (tc *TConfiguration) GetMaxFrameSize() int32 {
|
||||
if tc == nil {
|
||||
return DEFAULT_MAX_FRAME_SIZE
|
||||
}
|
||||
maxFrameSize := tc.MaxFrameSize
|
||||
if maxFrameSize <= 0 {
|
||||
maxFrameSize = DEFAULT_MAX_FRAME_SIZE
|
||||
}
|
||||
if maxMessageSize := tc.GetMaxMessageSize(); maxMessageSize < maxFrameSize {
|
||||
return maxMessageSize
|
||||
}
|
||||
return maxFrameSize
|
||||
}
|
||||
|
||||
// GetConnectTimeout returns the connect timeout should be used by TSocket and
|
||||
// TSSLSocket.
|
||||
//
|
||||
// It's nil-safe. If tc is nil, DEFAULT_CONNECT_TIMEOUT will be returned instead.
|
||||
func (tc *TConfiguration) GetConnectTimeout() time.Duration {
|
||||
if tc == nil || tc.ConnectTimeout < 0 {
|
||||
return DEFAULT_CONNECT_TIMEOUT
|
||||
}
|
||||
return tc.ConnectTimeout
|
||||
}
|
||||
|
||||
// GetSocketTimeout returns the socket timeout should be used by TSocket and
|
||||
// TSSLSocket.
|
||||
//
|
||||
// It's nil-safe. If tc is nil, DEFAULT_SOCKET_TIMEOUT will be returned instead.
|
||||
func (tc *TConfiguration) GetSocketTimeout() time.Duration {
|
||||
if tc == nil || tc.SocketTimeout < 0 {
|
||||
return DEFAULT_SOCKET_TIMEOUT
|
||||
}
|
||||
return tc.SocketTimeout
|
||||
}
|
||||
|
||||
// GetTLSConfig returns the tls config should be used by TSSLSocket.
|
||||
//
|
||||
// It's nil-safe. If tc is nil, nil will be returned instead.
|
||||
func (tc *TConfiguration) GetTLSConfig() *tls.Config {
|
||||
if tc == nil {
|
||||
return nil
|
||||
}
|
||||
return tc.TLSConfig
|
||||
}
|
||||
|
||||
// GetTBinaryStrictRead returns the strict read configuration TBinaryProtocol
|
||||
// should follow.
|
||||
//
|
||||
// It's nil-safe. DEFAULT_TBINARY_STRICT_READ will be returned if either tc or
|
||||
// tc.TBinaryStrictRead is nil.
|
||||
func (tc *TConfiguration) GetTBinaryStrictRead() bool {
|
||||
if tc == nil || tc.TBinaryStrictRead == nil {
|
||||
return DEFAULT_TBINARY_STRICT_READ
|
||||
}
|
||||
return *tc.TBinaryStrictRead
|
||||
}
|
||||
|
||||
// GetTBinaryStrictWrite returns the strict read configuration TBinaryProtocol
|
||||
// should follow.
|
||||
//
|
||||
// It's nil-safe. DEFAULT_TBINARY_STRICT_WRITE will be returned if either tc or
|
||||
// tc.TBinaryStrictWrite is nil.
|
||||
func (tc *TConfiguration) GetTBinaryStrictWrite() bool {
|
||||
if tc == nil || tc.TBinaryStrictWrite == nil {
|
||||
return DEFAULT_TBINARY_STRICT_WRITE
|
||||
}
|
||||
return *tc.TBinaryStrictWrite
|
||||
}
|
||||
|
||||
// GetTHeaderProtocolID returns the THeaderProtocolID should be used by
|
||||
// THeaderProtocol clients (for servers, they always use the same one as the
|
||||
// client instead).
|
||||
//
|
||||
// It's nil-safe. If either tc or tc.THeaderProtocolID is nil,
|
||||
// THeaderProtocolDefault will be returned instead.
|
||||
// THeaderProtocolDefault will also be returned if configured value is invalid.
|
||||
func (tc *TConfiguration) GetTHeaderProtocolID() THeaderProtocolID {
|
||||
if tc == nil || tc.THeaderProtocolID == nil {
|
||||
return THeaderProtocolDefault
|
||||
}
|
||||
protoID := *tc.THeaderProtocolID
|
||||
if err := protoID.Validate(); err != nil {
|
||||
return THeaderProtocolDefault
|
||||
}
|
||||
return protoID
|
||||
}
|
||||
|
||||
// THeaderProtocolIDPtr validates and returns the pointer to id.
|
||||
//
|
||||
// If id is not a valid THeaderProtocolID, a pointer to THeaderProtocolDefault
|
||||
// and the validation error will be returned.
|
||||
func THeaderProtocolIDPtr(id THeaderProtocolID) (*THeaderProtocolID, error) {
|
||||
err := id.Validate()
|
||||
if err != nil {
|
||||
id = THeaderProtocolDefault
|
||||
}
|
||||
return &id, err
|
||||
}
|
||||
|
||||
// THeaderProtocolIDPtrMust validates and returns the pointer to id.
|
||||
//
|
||||
// It's similar to THeaderProtocolIDPtr, but it panics on validation errors
|
||||
// instead of returning them.
|
||||
func THeaderProtocolIDPtrMust(id THeaderProtocolID) *THeaderProtocolID {
|
||||
ptr, err := THeaderProtocolIDPtr(id)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return ptr
|
||||
}
|
||||
|
||||
// TConfigurationSetter is an optional interface TProtocol, TTransport,
|
||||
// TProtocolFactory, TTransportFactory, and other implementations can implement.
|
||||
//
|
||||
// It's intended to be called during intializations.
|
||||
// The behavior of calling SetTConfiguration on a TTransport/TProtocol in the
|
||||
// middle of a message is undefined:
|
||||
// It may or may not change the behavior of the current processing message,
|
||||
// and it may even cause the current message to fail.
|
||||
//
|
||||
// Note for implementations: SetTConfiguration might be called multiple times
|
||||
// with the same value in quick successions due to the implementation of the
|
||||
// propagation. Implementations should make SetTConfiguration as simple as
|
||||
// possible (usually just overwrite the stored configuration and propagate it to
|
||||
// the wrapped TTransports/TProtocols).
|
||||
type TConfigurationSetter interface {
|
||||
SetTConfiguration(*TConfiguration)
|
||||
}
|
||||
|
||||
// PropagateTConfiguration propagates cfg to impl if impl implements
|
||||
// TConfigurationSetter and cfg is non-nil, otherwise it does nothing.
|
||||
//
|
||||
// NOTE: nil cfg is not propagated. If you want to propagate a TConfiguration
|
||||
// with everything being default value, use &TConfiguration{} explicitly instead.
|
||||
func PropagateTConfiguration(impl interface{}, cfg *TConfiguration) {
|
||||
if cfg == nil || cfg.noPropagation {
|
||||
return
|
||||
}
|
||||
|
||||
if setter, ok := impl.(TConfigurationSetter); ok {
|
||||
setter.SetTConfiguration(cfg)
|
||||
}
|
||||
}
|
||||
|
||||
func checkSizeForProtocol(size int32, cfg *TConfiguration) error {
|
||||
if size < 0 {
|
||||
return NewTProtocolExceptionWithType(
|
||||
NEGATIVE_SIZE,
|
||||
fmt.Errorf("negative size: %d", size),
|
||||
)
|
||||
}
|
||||
if size > cfg.GetMaxMessageSize() {
|
||||
return NewTProtocolExceptionWithType(
|
||||
SIZE_LIMIT,
|
||||
fmt.Errorf("size exceeded max allowed: %d", size),
|
||||
)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type tTransportFactoryConf struct {
|
||||
delegate TTransportFactory
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
func (f *tTransportFactoryConf) GetTransport(orig TTransport) (TTransport, error) {
|
||||
trans, err := f.delegate.GetTransport(orig)
|
||||
if err == nil {
|
||||
PropagateTConfiguration(orig, f.cfg)
|
||||
PropagateTConfiguration(trans, f.cfg)
|
||||
}
|
||||
return trans, err
|
||||
}
|
||||
|
||||
func (f *tTransportFactoryConf) SetTConfiguration(cfg *TConfiguration) {
|
||||
PropagateTConfiguration(f.delegate, f.cfg)
|
||||
f.cfg = cfg
|
||||
}
|
||||
|
||||
// TTransportFactoryConf wraps a TTransportFactory to propagate
|
||||
// TConfiguration on the factory's GetTransport calls.
|
||||
func TTransportFactoryConf(delegate TTransportFactory, conf *TConfiguration) TTransportFactory {
|
||||
return &tTransportFactoryConf{
|
||||
delegate: delegate,
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
type tProtocolFactoryConf struct {
|
||||
delegate TProtocolFactory
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
func (f *tProtocolFactoryConf) GetProtocol(trans TTransport) TProtocol {
|
||||
proto := f.delegate.GetProtocol(trans)
|
||||
PropagateTConfiguration(trans, f.cfg)
|
||||
PropagateTConfiguration(proto, f.cfg)
|
||||
return proto
|
||||
}
|
||||
|
||||
func (f *tProtocolFactoryConf) SetTConfiguration(cfg *TConfiguration) {
|
||||
PropagateTConfiguration(f.delegate, f.cfg)
|
||||
f.cfg = cfg
|
||||
}
|
||||
|
||||
// TProtocolFactoryConf wraps a TProtocolFactory to propagate
|
||||
// TConfiguration on the factory's GetProtocol calls.
|
||||
func TProtocolFactoryConf(delegate TProtocolFactory, conf *TConfiguration) TProtocolFactory {
|
||||
return &tProtocolFactoryConf{
|
||||
delegate: delegate,
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
_ TConfigurationSetter = (*tTransportFactoryConf)(nil)
|
||||
_ TConfigurationSetter = (*tProtocolFactoryConf)(nil)
|
||||
)
|
24
vendor/github.com/uber/jaeger-client-go/thrift/context.go
generated
vendored
Normal file
24
vendor/github.com/uber/jaeger-client-go/thrift/context.go
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import "context"
|
||||
|
||||
var defaultCtx = context.Background()
|
116
vendor/github.com/uber/jaeger-client-go/thrift/exception.go
generated
vendored
Normal file
116
vendor/github.com/uber/jaeger-client-go/thrift/exception.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
// Generic Thrift exception
|
||||
type TException interface {
|
||||
error
|
||||
|
||||
TExceptionType() TExceptionType
|
||||
}
|
||||
|
||||
// Prepends additional information to an error without losing the Thrift exception interface
|
||||
func PrependError(prepend string, err error) error {
|
||||
msg := prepend + err.Error()
|
||||
|
||||
var te TException
|
||||
if errors.As(err, &te) {
|
||||
switch te.TExceptionType() {
|
||||
case TExceptionTypeTransport:
|
||||
if t, ok := err.(TTransportException); ok {
|
||||
return prependTTransportException(prepend, t)
|
||||
}
|
||||
case TExceptionTypeProtocol:
|
||||
if t, ok := err.(TProtocolException); ok {
|
||||
return prependTProtocolException(prepend, t)
|
||||
}
|
||||
case TExceptionTypeApplication:
|
||||
var t TApplicationException
|
||||
if errors.As(err, &t) {
|
||||
return NewTApplicationException(t.TypeId(), msg)
|
||||
}
|
||||
}
|
||||
|
||||
return wrappedTException{
|
||||
err: err,
|
||||
msg: msg,
|
||||
tExceptionType: te.TExceptionType(),
|
||||
}
|
||||
}
|
||||
|
||||
return errors.New(msg)
|
||||
}
|
||||
|
||||
// TExceptionType is an enum type to categorize different "subclasses" of TExceptions.
|
||||
type TExceptionType byte
|
||||
|
||||
// TExceptionType values
|
||||
const (
|
||||
TExceptionTypeUnknown TExceptionType = iota
|
||||
TExceptionTypeCompiled // TExceptions defined in thrift files and generated by thrift compiler
|
||||
TExceptionTypeApplication // TApplicationExceptions
|
||||
TExceptionTypeProtocol // TProtocolExceptions
|
||||
TExceptionTypeTransport // TTransportExceptions
|
||||
)
|
||||
|
||||
// WrapTException wraps an error into TException.
|
||||
//
|
||||
// If err is nil or already TException, it's returned as-is.
|
||||
// Otherwise it will be wraped into TException with TExceptionType() returning
|
||||
// TExceptionTypeUnknown, and Unwrap() returning the original error.
|
||||
func WrapTException(err error) TException {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if te, ok := err.(TException); ok {
|
||||
return te
|
||||
}
|
||||
|
||||
return wrappedTException{
|
||||
err: err,
|
||||
msg: err.Error(),
|
||||
tExceptionType: TExceptionTypeUnknown,
|
||||
}
|
||||
}
|
||||
|
||||
type wrappedTException struct {
|
||||
err error
|
||||
msg string
|
||||
tExceptionType TExceptionType
|
||||
}
|
||||
|
||||
func (w wrappedTException) Error() string {
|
||||
return w.msg
|
||||
}
|
||||
|
||||
func (w wrappedTException) TExceptionType() TExceptionType {
|
||||
return w.tExceptionType
|
||||
}
|
||||
|
||||
func (w wrappedTException) Unwrap() error {
|
||||
return w.err
|
||||
}
|
||||
|
||||
var _ TException = wrappedTException{}
|
110
vendor/github.com/uber/jaeger-client-go/thrift/header_context.go
generated
vendored
Normal file
110
vendor/github.com/uber/jaeger-client-go/thrift/header_context.go
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
// See https://pkg.go.dev/context#WithValue on why do we need the unexported typedefs.
|
||||
type (
|
||||
headerKey string
|
||||
headerKeyList int
|
||||
)
|
||||
|
||||
// Values for headerKeyList.
|
||||
const (
|
||||
headerKeyListRead headerKeyList = iota
|
||||
headerKeyListWrite
|
||||
)
|
||||
|
||||
// SetHeader sets a header in the context.
|
||||
func SetHeader(ctx context.Context, key, value string) context.Context {
|
||||
return context.WithValue(
|
||||
ctx,
|
||||
headerKey(key),
|
||||
value,
|
||||
)
|
||||
}
|
||||
|
||||
// UnsetHeader unsets a previously set header in the context.
|
||||
func UnsetHeader(ctx context.Context, key string) context.Context {
|
||||
return context.WithValue(
|
||||
ctx,
|
||||
headerKey(key),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
||||
// GetHeader returns a value of the given header from the context.
|
||||
func GetHeader(ctx context.Context, key string) (value string, ok bool) {
|
||||
if v := ctx.Value(headerKey(key)); v != nil {
|
||||
value, ok = v.(string)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// SetReadHeaderList sets the key list of read THeaders in the context.
|
||||
func SetReadHeaderList(ctx context.Context, keys []string) context.Context {
|
||||
return context.WithValue(
|
||||
ctx,
|
||||
headerKeyListRead,
|
||||
keys,
|
||||
)
|
||||
}
|
||||
|
||||
// GetReadHeaderList returns the key list of read THeaders from the context.
|
||||
func GetReadHeaderList(ctx context.Context) []string {
|
||||
if v := ctx.Value(headerKeyListRead); v != nil {
|
||||
if value, ok := v.([]string); ok {
|
||||
return value
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetWriteHeaderList sets the key list of THeaders to write in the context.
|
||||
func SetWriteHeaderList(ctx context.Context, keys []string) context.Context {
|
||||
return context.WithValue(
|
||||
ctx,
|
||||
headerKeyListWrite,
|
||||
keys,
|
||||
)
|
||||
}
|
||||
|
||||
// GetWriteHeaderList returns the key list of THeaders to write from the context.
|
||||
func GetWriteHeaderList(ctx context.Context) []string {
|
||||
if v := ctx.Value(headerKeyListWrite); v != nil {
|
||||
if value, ok := v.([]string); ok {
|
||||
return value
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddReadTHeaderToContext adds the whole THeader headers into context.
|
||||
func AddReadTHeaderToContext(ctx context.Context, headers THeaderMap) context.Context {
|
||||
keys := make([]string, 0, len(headers))
|
||||
for key, value := range headers {
|
||||
ctx = SetHeader(ctx, key, value)
|
||||
keys = append(keys, key)
|
||||
}
|
||||
return SetReadHeaderList(ctx, keys)
|
||||
}
|
351
vendor/github.com/uber/jaeger-client-go/thrift/header_protocol.go
generated
vendored
Normal file
351
vendor/github.com/uber/jaeger-client-go/thrift/header_protocol.go
generated
vendored
Normal file
@@ -0,0 +1,351 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// THeaderProtocol is a thrift protocol that implements THeader:
|
||||
// https://github.com/apache/thrift/blob/master/doc/specs/HeaderFormat.md
|
||||
//
|
||||
// It supports either binary or compact protocol as the wrapped protocol.
|
||||
//
|
||||
// Most of the THeader handlings are happening inside THeaderTransport.
|
||||
type THeaderProtocol struct {
|
||||
transport *THeaderTransport
|
||||
|
||||
// Will be initialized on first read/write.
|
||||
protocol TProtocol
|
||||
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTHeaderProtocolConf instead.
|
||||
func NewTHeaderProtocol(trans TTransport) *THeaderProtocol {
|
||||
return newTHeaderProtocolConf(trans, &TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// NewTHeaderProtocolConf creates a new THeaderProtocol from the underlying
|
||||
// transport with given TConfiguration.
|
||||
//
|
||||
// The passed in transport will be wrapped with THeaderTransport.
|
||||
//
|
||||
// Note that THeaderTransport handles frame and zlib by itself,
|
||||
// so the underlying transport should be a raw socket transports (TSocket or TSSLSocket),
|
||||
// instead of rich transports like TZlibTransport or TFramedTransport.
|
||||
func NewTHeaderProtocolConf(trans TTransport, conf *TConfiguration) *THeaderProtocol {
|
||||
return newTHeaderProtocolConf(trans, conf)
|
||||
}
|
||||
|
||||
func newTHeaderProtocolConf(trans TTransport, cfg *TConfiguration) *THeaderProtocol {
|
||||
t := NewTHeaderTransportConf(trans, cfg)
|
||||
p, _ := t.cfg.GetTHeaderProtocolID().GetProtocol(t)
|
||||
PropagateTConfiguration(p, cfg)
|
||||
return &THeaderProtocol{
|
||||
transport: t,
|
||||
protocol: p,
|
||||
cfg: cfg,
|
||||
}
|
||||
}
|
||||
|
||||
type tHeaderProtocolFactory struct {
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
func (f tHeaderProtocolFactory) GetProtocol(trans TTransport) TProtocol {
|
||||
return newTHeaderProtocolConf(trans, f.cfg)
|
||||
}
|
||||
|
||||
func (f *tHeaderProtocolFactory) SetTConfiguration(cfg *TConfiguration) {
|
||||
f.cfg = cfg
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTHeaderProtocolFactoryConf instead.
|
||||
func NewTHeaderProtocolFactory() TProtocolFactory {
|
||||
return NewTHeaderProtocolFactoryConf(&TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// NewTHeaderProtocolFactoryConf creates a factory for THeader with given
|
||||
// TConfiguration.
|
||||
func NewTHeaderProtocolFactoryConf(conf *TConfiguration) TProtocolFactory {
|
||||
return tHeaderProtocolFactory{
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
// Transport returns the underlying transport.
|
||||
//
|
||||
// It's guaranteed to be of type *THeaderTransport.
|
||||
func (p *THeaderProtocol) Transport() TTransport {
|
||||
return p.transport
|
||||
}
|
||||
|
||||
// GetReadHeaders returns the THeaderMap read from transport.
|
||||
func (p *THeaderProtocol) GetReadHeaders() THeaderMap {
|
||||
return p.transport.GetReadHeaders()
|
||||
}
|
||||
|
||||
// SetWriteHeader sets a header for write.
|
||||
func (p *THeaderProtocol) SetWriteHeader(key, value string) {
|
||||
p.transport.SetWriteHeader(key, value)
|
||||
}
|
||||
|
||||
// ClearWriteHeaders clears all write headers previously set.
|
||||
func (p *THeaderProtocol) ClearWriteHeaders() {
|
||||
p.transport.ClearWriteHeaders()
|
||||
}
|
||||
|
||||
// AddTransform add a transform for writing.
|
||||
func (p *THeaderProtocol) AddTransform(transform THeaderTransformID) error {
|
||||
return p.transport.AddTransform(transform)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) Flush(ctx context.Context) error {
|
||||
return p.transport.Flush(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteMessageBegin(ctx context.Context, name string, typeID TMessageType, seqID int32) error {
|
||||
newProto, err := p.transport.Protocol().GetProtocol(p.transport)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
PropagateTConfiguration(newProto, p.cfg)
|
||||
p.protocol = newProto
|
||||
p.transport.SequenceID = seqID
|
||||
return p.protocol.WriteMessageBegin(ctx, name, typeID, seqID)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteMessageEnd(ctx context.Context) error {
|
||||
if err := p.protocol.WriteMessageEnd(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
return p.transport.Flush(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteStructBegin(ctx context.Context, name string) error {
|
||||
return p.protocol.WriteStructBegin(ctx, name)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteStructEnd(ctx context.Context) error {
|
||||
return p.protocol.WriteStructEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteFieldBegin(ctx context.Context, name string, typeID TType, id int16) error {
|
||||
return p.protocol.WriteFieldBegin(ctx, name, typeID, id)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteFieldEnd(ctx context.Context) error {
|
||||
return p.protocol.WriteFieldEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteFieldStop(ctx context.Context) error {
|
||||
return p.protocol.WriteFieldStop(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error {
|
||||
return p.protocol.WriteMapBegin(ctx, keyType, valueType, size)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteMapEnd(ctx context.Context) error {
|
||||
return p.protocol.WriteMapEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteListBegin(ctx context.Context, elemType TType, size int) error {
|
||||
return p.protocol.WriteListBegin(ctx, elemType, size)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteListEnd(ctx context.Context) error {
|
||||
return p.protocol.WriteListEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteSetBegin(ctx context.Context, elemType TType, size int) error {
|
||||
return p.protocol.WriteSetBegin(ctx, elemType, size)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteSetEnd(ctx context.Context) error {
|
||||
return p.protocol.WriteSetEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteBool(ctx context.Context, value bool) error {
|
||||
return p.protocol.WriteBool(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteByte(ctx context.Context, value int8) error {
|
||||
return p.protocol.WriteByte(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteI16(ctx context.Context, value int16) error {
|
||||
return p.protocol.WriteI16(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteI32(ctx context.Context, value int32) error {
|
||||
return p.protocol.WriteI32(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteI64(ctx context.Context, value int64) error {
|
||||
return p.protocol.WriteI64(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteDouble(ctx context.Context, value float64) error {
|
||||
return p.protocol.WriteDouble(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteString(ctx context.Context, value string) error {
|
||||
return p.protocol.WriteString(ctx, value)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) WriteBinary(ctx context.Context, value []byte) error {
|
||||
return p.protocol.WriteBinary(ctx, value)
|
||||
}
|
||||
|
||||
// ReadFrame calls underlying THeaderTransport's ReadFrame function.
|
||||
func (p *THeaderProtocol) ReadFrame(ctx context.Context) error {
|
||||
return p.transport.ReadFrame(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadMessageBegin(ctx context.Context) (name string, typeID TMessageType, seqID int32, err error) {
|
||||
if err = p.transport.ReadFrame(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
var newProto TProtocol
|
||||
newProto, err = p.transport.Protocol().GetProtocol(p.transport)
|
||||
if err != nil {
|
||||
var tAppExc TApplicationException
|
||||
if !errors.As(err, &tAppExc) {
|
||||
return
|
||||
}
|
||||
if e := p.protocol.WriteMessageBegin(ctx, "", EXCEPTION, seqID); e != nil {
|
||||
return
|
||||
}
|
||||
if e := tAppExc.Write(ctx, p.protocol); e != nil {
|
||||
return
|
||||
}
|
||||
if e := p.protocol.WriteMessageEnd(ctx); e != nil {
|
||||
return
|
||||
}
|
||||
if e := p.transport.Flush(ctx); e != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
PropagateTConfiguration(newProto, p.cfg)
|
||||
p.protocol = newProto
|
||||
|
||||
return p.protocol.ReadMessageBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadMessageEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadMessageEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadStructBegin(ctx context.Context) (name string, err error) {
|
||||
return p.protocol.ReadStructBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadStructEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadStructEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadFieldBegin(ctx context.Context) (name string, typeID TType, id int16, err error) {
|
||||
return p.protocol.ReadFieldBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadFieldEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadFieldEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error) {
|
||||
return p.protocol.ReadMapBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadMapEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadMapEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadListBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
return p.protocol.ReadListBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadListEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadListEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadSetBegin(ctx context.Context) (elemType TType, size int, err error) {
|
||||
return p.protocol.ReadSetBegin(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadSetEnd(ctx context.Context) error {
|
||||
return p.protocol.ReadSetEnd(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadBool(ctx context.Context) (value bool, err error) {
|
||||
return p.protocol.ReadBool(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadByte(ctx context.Context) (value int8, err error) {
|
||||
return p.protocol.ReadByte(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadI16(ctx context.Context) (value int16, err error) {
|
||||
return p.protocol.ReadI16(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadI32(ctx context.Context) (value int32, err error) {
|
||||
return p.protocol.ReadI32(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadI64(ctx context.Context) (value int64, err error) {
|
||||
return p.protocol.ReadI64(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadDouble(ctx context.Context) (value float64, err error) {
|
||||
return p.protocol.ReadDouble(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadString(ctx context.Context) (value string, err error) {
|
||||
return p.protocol.ReadString(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) ReadBinary(ctx context.Context) (value []byte, err error) {
|
||||
return p.protocol.ReadBinary(ctx)
|
||||
}
|
||||
|
||||
func (p *THeaderProtocol) Skip(ctx context.Context, fieldType TType) error {
|
||||
return p.protocol.Skip(ctx, fieldType)
|
||||
}
|
||||
|
||||
// SetTConfiguration implements TConfigurationSetter.
|
||||
func (p *THeaderProtocol) SetTConfiguration(cfg *TConfiguration) {
|
||||
PropagateTConfiguration(p.transport, cfg)
|
||||
PropagateTConfiguration(p.protocol, cfg)
|
||||
p.cfg = cfg
|
||||
}
|
||||
|
||||
var (
|
||||
_ TConfigurationSetter = (*tHeaderProtocolFactory)(nil)
|
||||
_ TConfigurationSetter = (*THeaderProtocol)(nil)
|
||||
)
|
810
vendor/github.com/uber/jaeger-client-go/thrift/header_transport.go
generated
vendored
Normal file
810
vendor/github.com/uber/jaeger-client-go/thrift/header_transport.go
generated
vendored
Normal file
@@ -0,0 +1,810 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"compress/zlib"
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
// Size in bytes for 32-bit ints.
|
||||
const size32 = 4
|
||||
|
||||
type headerMeta struct {
|
||||
MagicFlags uint32
|
||||
SequenceID int32
|
||||
HeaderLength uint16
|
||||
}
|
||||
|
||||
const headerMetaSize = 10
|
||||
|
||||
type clientType int
|
||||
|
||||
const (
|
||||
clientUnknown clientType = iota
|
||||
clientHeaders
|
||||
clientFramedBinary
|
||||
clientUnframedBinary
|
||||
clientFramedCompact
|
||||
clientUnframedCompact
|
||||
)
|
||||
|
||||
// Constants defined in THeader format:
|
||||
// https://github.com/apache/thrift/blob/master/doc/specs/HeaderFormat.md
|
||||
const (
|
||||
THeaderHeaderMagic uint32 = 0x0fff0000
|
||||
THeaderHeaderMask uint32 = 0xffff0000
|
||||
THeaderFlagsMask uint32 = 0x0000ffff
|
||||
THeaderMaxFrameSize uint32 = 0x3fffffff
|
||||
)
|
||||
|
||||
// THeaderMap is the type of the header map in THeader transport.
|
||||
type THeaderMap map[string]string
|
||||
|
||||
// THeaderProtocolID is the wrapped protocol id used in THeader.
|
||||
type THeaderProtocolID int32
|
||||
|
||||
// Supported THeaderProtocolID values.
|
||||
const (
|
||||
THeaderProtocolBinary THeaderProtocolID = 0x00
|
||||
THeaderProtocolCompact THeaderProtocolID = 0x02
|
||||
THeaderProtocolDefault = THeaderProtocolBinary
|
||||
)
|
||||
|
||||
// Declared globally to avoid repetitive allocations, not really used.
|
||||
var globalMemoryBuffer = NewTMemoryBuffer()
|
||||
|
||||
// Validate checks whether the THeaderProtocolID is a valid/supported one.
|
||||
func (id THeaderProtocolID) Validate() error {
|
||||
_, err := id.GetProtocol(globalMemoryBuffer)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetProtocol gets the corresponding TProtocol from the wrapped protocol id.
|
||||
func (id THeaderProtocolID) GetProtocol(trans TTransport) (TProtocol, error) {
|
||||
switch id {
|
||||
default:
|
||||
return nil, NewTApplicationException(
|
||||
INVALID_PROTOCOL,
|
||||
fmt.Sprintf("THeader protocol id %d not supported", id),
|
||||
)
|
||||
case THeaderProtocolBinary:
|
||||
return NewTBinaryProtocolTransport(trans), nil
|
||||
case THeaderProtocolCompact:
|
||||
return NewTCompactProtocol(trans), nil
|
||||
}
|
||||
}
|
||||
|
||||
// THeaderTransformID defines the numeric id of the transform used.
|
||||
type THeaderTransformID int32
|
||||
|
||||
// THeaderTransformID values.
|
||||
//
|
||||
// Values not defined here are not currently supported, namely HMAC and Snappy.
|
||||
const (
|
||||
TransformNone THeaderTransformID = iota // 0, no special handling
|
||||
TransformZlib // 1, zlib
|
||||
)
|
||||
|
||||
var supportedTransformIDs = map[THeaderTransformID]bool{
|
||||
TransformNone: true,
|
||||
TransformZlib: true,
|
||||
}
|
||||
|
||||
// TransformReader is an io.ReadCloser that handles transforms reading.
|
||||
type TransformReader struct {
|
||||
io.Reader
|
||||
|
||||
closers []io.Closer
|
||||
}
|
||||
|
||||
var _ io.ReadCloser = (*TransformReader)(nil)
|
||||
|
||||
// NewTransformReaderWithCapacity initializes a TransformReader with expected
|
||||
// closers capacity.
|
||||
//
|
||||
// If you don't know the closers capacity beforehand, just use
|
||||
//
|
||||
// &TransformReader{Reader: baseReader}
|
||||
//
|
||||
// instead would be sufficient.
|
||||
func NewTransformReaderWithCapacity(baseReader io.Reader, capacity int) *TransformReader {
|
||||
return &TransformReader{
|
||||
Reader: baseReader,
|
||||
closers: make([]io.Closer, 0, capacity),
|
||||
}
|
||||
}
|
||||
|
||||
// Close calls the underlying closers in appropriate order,
|
||||
// stops at and returns the first error encountered.
|
||||
func (tr *TransformReader) Close() error {
|
||||
// Call closers in reversed order
|
||||
for i := len(tr.closers) - 1; i >= 0; i-- {
|
||||
if err := tr.closers[i].Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddTransform adds a transform.
|
||||
func (tr *TransformReader) AddTransform(id THeaderTransformID) error {
|
||||
switch id {
|
||||
default:
|
||||
return NewTApplicationException(
|
||||
INVALID_TRANSFORM,
|
||||
fmt.Sprintf("THeaderTransformID %d not supported", id),
|
||||
)
|
||||
case TransformNone:
|
||||
// no-op
|
||||
case TransformZlib:
|
||||
readCloser, err := zlib.NewReader(tr.Reader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tr.Reader = readCloser
|
||||
tr.closers = append(tr.closers, readCloser)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TransformWriter is an io.WriteCloser that handles transforms writing.
|
||||
type TransformWriter struct {
|
||||
io.Writer
|
||||
|
||||
closers []io.Closer
|
||||
}
|
||||
|
||||
var _ io.WriteCloser = (*TransformWriter)(nil)
|
||||
|
||||
// NewTransformWriter creates a new TransformWriter with base writer and transforms.
|
||||
func NewTransformWriter(baseWriter io.Writer, transforms []THeaderTransformID) (io.WriteCloser, error) {
|
||||
writer := &TransformWriter{
|
||||
Writer: baseWriter,
|
||||
closers: make([]io.Closer, 0, len(transforms)),
|
||||
}
|
||||
for _, id := range transforms {
|
||||
if err := writer.AddTransform(id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return writer, nil
|
||||
}
|
||||
|
||||
// Close calls the underlying closers in appropriate order,
|
||||
// stops at and returns the first error encountered.
|
||||
func (tw *TransformWriter) Close() error {
|
||||
// Call closers in reversed order
|
||||
for i := len(tw.closers) - 1; i >= 0; i-- {
|
||||
if err := tw.closers[i].Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddTransform adds a transform.
|
||||
func (tw *TransformWriter) AddTransform(id THeaderTransformID) error {
|
||||
switch id {
|
||||
default:
|
||||
return NewTApplicationException(
|
||||
INVALID_TRANSFORM,
|
||||
fmt.Sprintf("THeaderTransformID %d not supported", id),
|
||||
)
|
||||
case TransformNone:
|
||||
// no-op
|
||||
case TransformZlib:
|
||||
writeCloser := zlib.NewWriter(tw.Writer)
|
||||
tw.Writer = writeCloser
|
||||
tw.closers = append(tw.closers, writeCloser)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// THeaderInfoType is the type id of the info headers.
|
||||
type THeaderInfoType int32
|
||||
|
||||
// Supported THeaderInfoType values.
|
||||
const (
|
||||
_ THeaderInfoType = iota // Skip 0
|
||||
InfoKeyValue // 1
|
||||
// Rest of the info types are not supported.
|
||||
)
|
||||
|
||||
// THeaderTransport is a Transport mode that implements THeader.
|
||||
//
|
||||
// Note that THeaderTransport handles frame and zlib by itself,
|
||||
// so the underlying transport should be a raw socket transports (TSocket or TSSLSocket),
|
||||
// instead of rich transports like TZlibTransport or TFramedTransport.
|
||||
type THeaderTransport struct {
|
||||
SequenceID int32
|
||||
Flags uint32
|
||||
|
||||
transport TTransport
|
||||
|
||||
// THeaderMap for read and write
|
||||
readHeaders THeaderMap
|
||||
writeHeaders THeaderMap
|
||||
|
||||
// Reading related variables.
|
||||
reader *bufio.Reader
|
||||
// When frame is detected, we read the frame fully into frameBuffer.
|
||||
frameBuffer bytes.Buffer
|
||||
// When it's non-nil, Read should read from frameReader instead of
|
||||
// reader, and EOF error indicates end of frame instead of end of all
|
||||
// transport.
|
||||
frameReader io.ReadCloser
|
||||
|
||||
// Writing related variables
|
||||
writeBuffer bytes.Buffer
|
||||
writeTransforms []THeaderTransformID
|
||||
|
||||
clientType clientType
|
||||
protocolID THeaderProtocolID
|
||||
cfg *TConfiguration
|
||||
|
||||
// buffer is used in the following scenarios to avoid repetitive
|
||||
// allocations, while 4 is big enough for all those scenarios:
|
||||
//
|
||||
// * header padding (max size 4)
|
||||
// * write the frame size (size 4)
|
||||
buffer [4]byte
|
||||
}
|
||||
|
||||
var _ TTransport = (*THeaderTransport)(nil)
|
||||
|
||||
// Deprecated: Use NewTHeaderTransportConf instead.
|
||||
func NewTHeaderTransport(trans TTransport) *THeaderTransport {
|
||||
return NewTHeaderTransportConf(trans, &TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// NewTHeaderTransportConf creates THeaderTransport from the
|
||||
// underlying transport, with given TConfiguration attached.
|
||||
//
|
||||
// If trans is already a *THeaderTransport, it will be returned as is,
|
||||
// but with TConfiguration overridden by the value passed in.
|
||||
//
|
||||
// The protocol ID in TConfiguration is only useful for client transports.
|
||||
// For servers,
|
||||
// the protocol ID will be overridden again to the one set by the client,
|
||||
// to ensure that servers always speak the same dialect as the client.
|
||||
func NewTHeaderTransportConf(trans TTransport, conf *TConfiguration) *THeaderTransport {
|
||||
if ht, ok := trans.(*THeaderTransport); ok {
|
||||
ht.SetTConfiguration(conf)
|
||||
return ht
|
||||
}
|
||||
PropagateTConfiguration(trans, conf)
|
||||
return &THeaderTransport{
|
||||
transport: trans,
|
||||
reader: bufio.NewReader(trans),
|
||||
writeHeaders: make(THeaderMap),
|
||||
protocolID: conf.GetTHeaderProtocolID(),
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
// Open calls the underlying transport's Open function.
|
||||
func (t *THeaderTransport) Open() error {
|
||||
return t.transport.Open()
|
||||
}
|
||||
|
||||
// IsOpen calls the underlying transport's IsOpen function.
|
||||
func (t *THeaderTransport) IsOpen() bool {
|
||||
return t.transport.IsOpen()
|
||||
}
|
||||
|
||||
// ReadFrame tries to read the frame header, guess the client type, and handle
|
||||
// unframed clients.
|
||||
func (t *THeaderTransport) ReadFrame(ctx context.Context) error {
|
||||
if !t.needReadFrame() {
|
||||
// No need to read frame, skipping.
|
||||
return nil
|
||||
}
|
||||
|
||||
// Peek and handle the first 32 bits.
|
||||
// They could either be the length field of a framed message,
|
||||
// or the first bytes of an unframed message.
|
||||
var buf []byte
|
||||
var err error
|
||||
// This is also usually the first read from a connection,
|
||||
// so handle retries around socket timeouts.
|
||||
_, deadlineSet := ctx.Deadline()
|
||||
for {
|
||||
buf, err = t.reader.Peek(size32)
|
||||
if deadlineSet && isTimeoutError(err) && ctx.Err() == nil {
|
||||
// This is I/O timeout and we still have time,
|
||||
// continue trying
|
||||
continue
|
||||
}
|
||||
// For anything else, do not retry
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
frameSize := binary.BigEndian.Uint32(buf)
|
||||
if frameSize&VERSION_MASK == VERSION_1 {
|
||||
t.clientType = clientUnframedBinary
|
||||
return nil
|
||||
}
|
||||
if buf[0] == COMPACT_PROTOCOL_ID && buf[1]&COMPACT_VERSION_MASK == COMPACT_VERSION {
|
||||
t.clientType = clientUnframedCompact
|
||||
return nil
|
||||
}
|
||||
|
||||
// At this point it should be a framed message,
|
||||
// sanity check on frameSize then discard the peeked part.
|
||||
if frameSize > THeaderMaxFrameSize || frameSize > uint32(t.cfg.GetMaxFrameSize()) {
|
||||
return NewTProtocolExceptionWithType(
|
||||
SIZE_LIMIT,
|
||||
errors.New("frame too large"),
|
||||
)
|
||||
}
|
||||
t.reader.Discard(size32)
|
||||
|
||||
// Read the frame fully into frameBuffer.
|
||||
_, err = io.CopyN(&t.frameBuffer, t.reader, int64(frameSize))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
t.frameReader = ioutil.NopCloser(&t.frameBuffer)
|
||||
|
||||
// Peek and handle the next 32 bits.
|
||||
buf = t.frameBuffer.Bytes()[:size32]
|
||||
version := binary.BigEndian.Uint32(buf)
|
||||
if version&THeaderHeaderMask == THeaderHeaderMagic {
|
||||
t.clientType = clientHeaders
|
||||
return t.parseHeaders(ctx, frameSize)
|
||||
}
|
||||
if version&VERSION_MASK == VERSION_1 {
|
||||
t.clientType = clientFramedBinary
|
||||
return nil
|
||||
}
|
||||
if buf[0] == COMPACT_PROTOCOL_ID && buf[1]&COMPACT_VERSION_MASK == COMPACT_VERSION {
|
||||
t.clientType = clientFramedCompact
|
||||
return nil
|
||||
}
|
||||
if err := t.endOfFrame(); err != nil {
|
||||
return err
|
||||
}
|
||||
return NewTProtocolExceptionWithType(
|
||||
NOT_IMPLEMENTED,
|
||||
errors.New("unsupported client transport type"),
|
||||
)
|
||||
}
|
||||
|
||||
// endOfFrame does end of frame handling.
|
||||
//
|
||||
// It closes frameReader, and also resets frame related states.
|
||||
func (t *THeaderTransport) endOfFrame() error {
|
||||
defer func() {
|
||||
t.frameBuffer.Reset()
|
||||
t.frameReader = nil
|
||||
}()
|
||||
return t.frameReader.Close()
|
||||
}
|
||||
|
||||
func (t *THeaderTransport) parseHeaders(ctx context.Context, frameSize uint32) error {
|
||||
if t.clientType != clientHeaders {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
var meta headerMeta
|
||||
if err = binary.Read(&t.frameBuffer, binary.BigEndian, &meta); err != nil {
|
||||
return err
|
||||
}
|
||||
frameSize -= headerMetaSize
|
||||
t.Flags = meta.MagicFlags & THeaderFlagsMask
|
||||
t.SequenceID = meta.SequenceID
|
||||
headerLength := int64(meta.HeaderLength) * 4
|
||||
if int64(frameSize) < headerLength {
|
||||
return NewTProtocolExceptionWithType(
|
||||
SIZE_LIMIT,
|
||||
errors.New("header size is larger than the whole frame"),
|
||||
)
|
||||
}
|
||||
headerBuf := NewTMemoryBuffer()
|
||||
_, err = io.CopyN(headerBuf, &t.frameBuffer, headerLength)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hp := NewTCompactProtocol(headerBuf)
|
||||
hp.SetTConfiguration(t.cfg)
|
||||
|
||||
// At this point the header is already read into headerBuf,
|
||||
// and t.frameBuffer starts from the actual payload.
|
||||
protoID, err := hp.readVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
t.protocolID = THeaderProtocolID(protoID)
|
||||
|
||||
var transformCount int32
|
||||
transformCount, err = hp.readVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if transformCount > 0 {
|
||||
reader := NewTransformReaderWithCapacity(
|
||||
&t.frameBuffer,
|
||||
int(transformCount),
|
||||
)
|
||||
t.frameReader = reader
|
||||
transformIDs := make([]THeaderTransformID, transformCount)
|
||||
for i := 0; i < int(transformCount); i++ {
|
||||
id, err := hp.readVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
transformIDs[i] = THeaderTransformID(id)
|
||||
}
|
||||
// The transform IDs on the wire was added based on the order of
|
||||
// writing, so on the reading side we need to reverse the order.
|
||||
for i := transformCount - 1; i >= 0; i-- {
|
||||
id := transformIDs[i]
|
||||
if err := reader.AddTransform(id); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The info part does not use the transforms yet, so it's
|
||||
// important to continue using headerBuf.
|
||||
headers := make(THeaderMap)
|
||||
for {
|
||||
infoType, err := hp.readVarint32()
|
||||
if errors.Is(err, io.EOF) {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if THeaderInfoType(infoType) == InfoKeyValue {
|
||||
count, err := hp.readVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := 0; i < int(count); i++ {
|
||||
key, err := hp.ReadString(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
value, err := hp.ReadString(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
headers[key] = value
|
||||
}
|
||||
} else {
|
||||
// Skip reading info section on the first
|
||||
// unsupported info type.
|
||||
break
|
||||
}
|
||||
}
|
||||
t.readHeaders = headers
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *THeaderTransport) needReadFrame() bool {
|
||||
if t.clientType == clientUnknown {
|
||||
// This is a new connection that's never read before.
|
||||
return true
|
||||
}
|
||||
if t.isFramed() && t.frameReader == nil {
|
||||
// We just finished the last frame.
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *THeaderTransport) Read(p []byte) (read int, err error) {
|
||||
// Here using context.Background instead of a context passed in is safe.
|
||||
// First is that there's no way to pass context into this function.
|
||||
// Then, 99% of the case when calling this Read frame is already read
|
||||
// into frameReader. ReadFrame here is more of preventing bugs that
|
||||
// didn't call ReadFrame before calling Read.
|
||||
err = t.ReadFrame(context.Background())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if t.frameReader != nil {
|
||||
read, err = t.frameReader.Read(p)
|
||||
if err == nil && t.frameBuffer.Len() <= 0 {
|
||||
// the last Read finished the frame, do endOfFrame
|
||||
// handling here.
|
||||
err = t.endOfFrame()
|
||||
} else if err == io.EOF {
|
||||
err = t.endOfFrame()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if read == 0 {
|
||||
// Try to read the next frame when we hit EOF
|
||||
// (end of frame) immediately.
|
||||
// When we got here, it means the last read
|
||||
// finished the previous frame, but didn't
|
||||
// do endOfFrame handling yet.
|
||||
// We have to read the next frame here,
|
||||
// as otherwise we would return 0 and nil,
|
||||
// which is a case not handled well by most
|
||||
// protocol implementations.
|
||||
return t.Read(p)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
return t.reader.Read(p)
|
||||
}
|
||||
|
||||
// Write writes data to the write buffer.
|
||||
//
|
||||
// You need to call Flush to actually write them to the transport.
|
||||
func (t *THeaderTransport) Write(p []byte) (int, error) {
|
||||
return t.writeBuffer.Write(p)
|
||||
}
|
||||
|
||||
// Flush writes the appropriate header and the write buffer to the underlying transport.
|
||||
func (t *THeaderTransport) Flush(ctx context.Context) error {
|
||||
if t.writeBuffer.Len() == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
defer t.writeBuffer.Reset()
|
||||
|
||||
switch t.clientType {
|
||||
default:
|
||||
fallthrough
|
||||
case clientUnknown:
|
||||
t.clientType = clientHeaders
|
||||
fallthrough
|
||||
case clientHeaders:
|
||||
headers := NewTMemoryBuffer()
|
||||
hp := NewTCompactProtocol(headers)
|
||||
hp.SetTConfiguration(t.cfg)
|
||||
if _, err := hp.writeVarint32(int32(t.protocolID)); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if _, err := hp.writeVarint32(int32(len(t.writeTransforms))); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
for _, transform := range t.writeTransforms {
|
||||
if _, err := hp.writeVarint32(int32(transform)); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
}
|
||||
if len(t.writeHeaders) > 0 {
|
||||
if _, err := hp.writeVarint32(int32(InfoKeyValue)); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if _, err := hp.writeVarint32(int32(len(t.writeHeaders))); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
for key, value := range t.writeHeaders {
|
||||
if err := hp.WriteString(ctx, key); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if err := hp.WriteString(ctx, value); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
padding := 4 - headers.Len()%4
|
||||
if padding < 4 {
|
||||
buf := t.buffer[:padding]
|
||||
for i := range buf {
|
||||
buf[i] = 0
|
||||
}
|
||||
if _, err := headers.Write(buf); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
}
|
||||
|
||||
var payload bytes.Buffer
|
||||
meta := headerMeta{
|
||||
MagicFlags: THeaderHeaderMagic + t.Flags&THeaderFlagsMask,
|
||||
SequenceID: t.SequenceID,
|
||||
HeaderLength: uint16(headers.Len() / 4),
|
||||
}
|
||||
if err := binary.Write(&payload, binary.BigEndian, meta); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if _, err := io.Copy(&payload, headers); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
|
||||
writer, err := NewTransformWriter(&payload, t.writeTransforms)
|
||||
if err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if _, err := io.Copy(writer, &t.writeBuffer); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
if err := writer.Close(); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
|
||||
// First write frame length
|
||||
buf := t.buffer[:size32]
|
||||
binary.BigEndian.PutUint32(buf, uint32(payload.Len()))
|
||||
if _, err := t.transport.Write(buf); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
// Then write the payload
|
||||
if _, err := io.Copy(t.transport, &payload); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
|
||||
case clientFramedBinary, clientFramedCompact:
|
||||
buf := t.buffer[:size32]
|
||||
binary.BigEndian.PutUint32(buf, uint32(t.writeBuffer.Len()))
|
||||
if _, err := t.transport.Write(buf); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
fallthrough
|
||||
case clientUnframedBinary, clientUnframedCompact:
|
||||
if _, err := io.Copy(t.transport, &t.writeBuffer); err != nil {
|
||||
return NewTTransportExceptionFromError(err)
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
default:
|
||||
case <-ctx.Done():
|
||||
return NewTTransportExceptionFromError(ctx.Err())
|
||||
}
|
||||
|
||||
return t.transport.Flush(ctx)
|
||||
}
|
||||
|
||||
// Close closes the transport, along with its underlying transport.
|
||||
func (t *THeaderTransport) Close() error {
|
||||
if err := t.Flush(context.Background()); err != nil {
|
||||
return err
|
||||
}
|
||||
return t.transport.Close()
|
||||
}
|
||||
|
||||
// RemainingBytes calls underlying transport's RemainingBytes.
|
||||
//
|
||||
// Even in framed cases, because of all the possible compression transforms
|
||||
// involved, the remaining frame size is likely to be different from the actual
|
||||
// remaining readable bytes, so we don't bother to keep tracking the remaining
|
||||
// frame size by ourselves and just use the underlying transport's
|
||||
// RemainingBytes directly.
|
||||
func (t *THeaderTransport) RemainingBytes() uint64 {
|
||||
return t.transport.RemainingBytes()
|
||||
}
|
||||
|
||||
// GetReadHeaders returns the THeaderMap read from transport.
|
||||
func (t *THeaderTransport) GetReadHeaders() THeaderMap {
|
||||
return t.readHeaders
|
||||
}
|
||||
|
||||
// SetWriteHeader sets a header for write.
|
||||
func (t *THeaderTransport) SetWriteHeader(key, value string) {
|
||||
t.writeHeaders[key] = value
|
||||
}
|
||||
|
||||
// ClearWriteHeaders clears all write headers previously set.
|
||||
func (t *THeaderTransport) ClearWriteHeaders() {
|
||||
t.writeHeaders = make(THeaderMap)
|
||||
}
|
||||
|
||||
// AddTransform add a transform for writing.
|
||||
func (t *THeaderTransport) AddTransform(transform THeaderTransformID) error {
|
||||
if !supportedTransformIDs[transform] {
|
||||
return NewTProtocolExceptionWithType(
|
||||
NOT_IMPLEMENTED,
|
||||
fmt.Errorf("THeaderTransformID %d not supported", transform),
|
||||
)
|
||||
}
|
||||
t.writeTransforms = append(t.writeTransforms, transform)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Protocol returns the wrapped protocol id used in this THeaderTransport.
|
||||
func (t *THeaderTransport) Protocol() THeaderProtocolID {
|
||||
switch t.clientType {
|
||||
default:
|
||||
return t.protocolID
|
||||
case clientFramedBinary, clientUnframedBinary:
|
||||
return THeaderProtocolBinary
|
||||
case clientFramedCompact, clientUnframedCompact:
|
||||
return THeaderProtocolCompact
|
||||
}
|
||||
}
|
||||
|
||||
func (t *THeaderTransport) isFramed() bool {
|
||||
switch t.clientType {
|
||||
default:
|
||||
return false
|
||||
case clientHeaders, clientFramedBinary, clientFramedCompact:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// SetTConfiguration implements TConfigurationSetter.
|
||||
func (t *THeaderTransport) SetTConfiguration(cfg *TConfiguration) {
|
||||
PropagateTConfiguration(t.transport, cfg)
|
||||
t.cfg = cfg
|
||||
}
|
||||
|
||||
// THeaderTransportFactory is a TTransportFactory implementation to create
|
||||
// THeaderTransport.
|
||||
//
|
||||
// It also implements TConfigurationSetter.
|
||||
type THeaderTransportFactory struct {
|
||||
// The underlying factory, could be nil.
|
||||
Factory TTransportFactory
|
||||
|
||||
cfg *TConfiguration
|
||||
}
|
||||
|
||||
// Deprecated: Use NewTHeaderTransportFactoryConf instead.
|
||||
func NewTHeaderTransportFactory(factory TTransportFactory) TTransportFactory {
|
||||
return NewTHeaderTransportFactoryConf(factory, &TConfiguration{
|
||||
noPropagation: true,
|
||||
})
|
||||
}
|
||||
|
||||
// NewTHeaderTransportFactoryConf creates a new *THeaderTransportFactory with
|
||||
// the given *TConfiguration.
|
||||
func NewTHeaderTransportFactoryConf(factory TTransportFactory, conf *TConfiguration) TTransportFactory {
|
||||
return &THeaderTransportFactory{
|
||||
Factory: factory,
|
||||
|
||||
cfg: conf,
|
||||
}
|
||||
}
|
||||
|
||||
// GetTransport implements TTransportFactory.
|
||||
func (f *THeaderTransportFactory) GetTransport(trans TTransport) (TTransport, error) {
|
||||
if f.Factory != nil {
|
||||
t, err := f.Factory.GetTransport(trans)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewTHeaderTransportConf(t, f.cfg), nil
|
||||
}
|
||||
return NewTHeaderTransportConf(trans, f.cfg), nil
|
||||
}
|
||||
|
||||
// SetTConfiguration implements TConfigurationSetter.
|
||||
func (f *THeaderTransportFactory) SetTConfiguration(cfg *TConfiguration) {
|
||||
PropagateTConfiguration(f.Factory, f.cfg)
|
||||
f.cfg = cfg
|
||||
}
|
||||
|
||||
var (
|
||||
_ TConfigurationSetter = (*THeaderTransportFactory)(nil)
|
||||
_ TConfigurationSetter = (*THeaderTransport)(nil)
|
||||
)
|
59
vendor/github.com/uber/jaeger-client-go/thrift/logger.go
generated
vendored
Normal file
59
vendor/github.com/uber/jaeger-client-go/thrift/logger.go
generated
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
// Logger is a simple wrapper of a logging function.
|
||||
//
|
||||
// In reality the users might actually use different logging libraries, and they
|
||||
// are not always compatible with each other.
|
||||
//
|
||||
// Logger is meant to be a simple common ground that it's easy to wrap whatever
|
||||
// logging library they use into.
|
||||
//
|
||||
// See https://issues.apache.org/jira/browse/THRIFT-4985 for the design
|
||||
// discussion behind it.
|
||||
type Logger func(msg string)
|
||||
|
||||
// NopLogger is a Logger implementation that does nothing.
|
||||
func NopLogger(msg string) {}
|
||||
|
||||
// StdLogger wraps stdlib log package into a Logger.
|
||||
//
|
||||
// If logger passed in is nil, it will fallback to use stderr and default flags.
|
||||
func StdLogger(logger *log.Logger) Logger {
|
||||
if logger == nil {
|
||||
logger = log.New(os.Stderr, "", log.LstdFlags)
|
||||
}
|
||||
return func(msg string) {
|
||||
logger.Print(msg)
|
||||
}
|
||||
}
|
||||
|
||||
func fallbackLogger(logger Logger) Logger {
|
||||
if logger == nil {
|
||||
return StdLogger(nil)
|
||||
}
|
||||
return logger
|
||||
}
|
80
vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go
generated
vendored
Normal file
80
vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
)
|
||||
|
||||
// Memory buffer-based implementation of the TTransport interface.
|
||||
type TMemoryBuffer struct {
|
||||
*bytes.Buffer
|
||||
size int
|
||||
}
|
||||
|
||||
type TMemoryBufferTransportFactory struct {
|
||||
size int
|
||||
}
|
||||
|
||||
func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) (TTransport, error) {
|
||||
if trans != nil {
|
||||
t, ok := trans.(*TMemoryBuffer)
|
||||
if ok && t.size > 0 {
|
||||
return NewTMemoryBufferLen(t.size), nil
|
||||
}
|
||||
}
|
||||
return NewTMemoryBufferLen(p.size), nil
|
||||
}
|
||||
|
||||
func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory {
|
||||
return &TMemoryBufferTransportFactory{size: size}
|
||||
}
|
||||
|
||||
func NewTMemoryBuffer() *TMemoryBuffer {
|
||||
return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0}
|
||||
}
|
||||
|
||||
func NewTMemoryBufferLen(size int) *TMemoryBuffer {
|
||||
buf := make([]byte, 0, size)
|
||||
return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size}
|
||||
}
|
||||
|
||||
func (p *TMemoryBuffer) IsOpen() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *TMemoryBuffer) Open() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TMemoryBuffer) Close() error {
|
||||
p.Buffer.Reset()
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flushing a memory buffer is a no-op
|
||||
func (p *TMemoryBuffer) Flush(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) {
|
||||
return uint64(p.Buffer.Len())
|
||||
}
|
31
vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go
generated
vendored
Normal file
31
vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
// Message type constants in the Thrift protocol.
|
||||
type TMessageType int32
|
||||
|
||||
const (
|
||||
INVALID_TMESSAGE_TYPE TMessageType = 0
|
||||
CALL TMessageType = 1
|
||||
REPLY TMessageType = 2
|
||||
EXCEPTION TMessageType = 3
|
||||
ONEWAY TMessageType = 4
|
||||
)
|
164
vendor/github.com/uber/jaeger-client-go/thrift/numeric.go
generated
vendored
Normal file
164
vendor/github.com/uber/jaeger-client-go/thrift/numeric.go
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Numeric interface {
|
||||
Int64() int64
|
||||
Int32() int32
|
||||
Int16() int16
|
||||
Byte() byte
|
||||
Int() int
|
||||
Float64() float64
|
||||
Float32() float32
|
||||
String() string
|
||||
isNull() bool
|
||||
}
|
||||
|
||||
type numeric struct {
|
||||
iValue int64
|
||||
dValue float64
|
||||
sValue string
|
||||
isNil bool
|
||||
}
|
||||
|
||||
var (
|
||||
INFINITY Numeric
|
||||
NEGATIVE_INFINITY Numeric
|
||||
NAN Numeric
|
||||
ZERO Numeric
|
||||
NUMERIC_NULL Numeric
|
||||
)
|
||||
|
||||
func NewNumericFromDouble(dValue float64) Numeric {
|
||||
if math.IsInf(dValue, 1) {
|
||||
return INFINITY
|
||||
}
|
||||
if math.IsInf(dValue, -1) {
|
||||
return NEGATIVE_INFINITY
|
||||
}
|
||||
if math.IsNaN(dValue) {
|
||||
return NAN
|
||||
}
|
||||
iValue := int64(dValue)
|
||||
sValue := strconv.FormatFloat(dValue, 'g', 10, 64)
|
||||
isNil := false
|
||||
return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}
|
||||
}
|
||||
|
||||
func NewNumericFromI64(iValue int64) Numeric {
|
||||
dValue := float64(iValue)
|
||||
sValue := strconv.FormatInt(iValue, 10)
|
||||
isNil := false
|
||||
return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}
|
||||
}
|
||||
|
||||
func NewNumericFromI32(iValue int32) Numeric {
|
||||
dValue := float64(iValue)
|
||||
sValue := strconv.FormatInt(int64(iValue), 10)
|
||||
isNil := false
|
||||
return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil}
|
||||
}
|
||||
|
||||
func NewNumericFromString(sValue string) Numeric {
|
||||
if sValue == INFINITY.String() {
|
||||
return INFINITY
|
||||
}
|
||||
if sValue == NEGATIVE_INFINITY.String() {
|
||||
return NEGATIVE_INFINITY
|
||||
}
|
||||
if sValue == NAN.String() {
|
||||
return NAN
|
||||
}
|
||||
iValue, _ := strconv.ParseInt(sValue, 10, 64)
|
||||
dValue, _ := strconv.ParseFloat(sValue, 64)
|
||||
isNil := len(sValue) == 0
|
||||
return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}
|
||||
}
|
||||
|
||||
func NewNumericFromJSONString(sValue string, isNull bool) Numeric {
|
||||
if isNull {
|
||||
return NewNullNumeric()
|
||||
}
|
||||
if sValue == JSON_INFINITY {
|
||||
return INFINITY
|
||||
}
|
||||
if sValue == JSON_NEGATIVE_INFINITY {
|
||||
return NEGATIVE_INFINITY
|
||||
}
|
||||
if sValue == JSON_NAN {
|
||||
return NAN
|
||||
}
|
||||
iValue, _ := strconv.ParseInt(sValue, 10, 64)
|
||||
dValue, _ := strconv.ParseFloat(sValue, 64)
|
||||
return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull}
|
||||
}
|
||||
|
||||
func NewNullNumeric() Numeric {
|
||||
return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true}
|
||||
}
|
||||
|
||||
func (p *numeric) Int64() int64 {
|
||||
return p.iValue
|
||||
}
|
||||
|
||||
func (p *numeric) Int32() int32 {
|
||||
return int32(p.iValue)
|
||||
}
|
||||
|
||||
func (p *numeric) Int16() int16 {
|
||||
return int16(p.iValue)
|
||||
}
|
||||
|
||||
func (p *numeric) Byte() byte {
|
||||
return byte(p.iValue)
|
||||
}
|
||||
|
||||
func (p *numeric) Int() int {
|
||||
return int(p.iValue)
|
||||
}
|
||||
|
||||
func (p *numeric) Float64() float64 {
|
||||
return p.dValue
|
||||
}
|
||||
|
||||
func (p *numeric) Float32() float32 {
|
||||
return float32(p.dValue)
|
||||
}
|
||||
|
||||
func (p *numeric) String() string {
|
||||
return p.sValue
|
||||
}
|
||||
|
||||
func (p *numeric) isNull() bool {
|
||||
return p.isNil
|
||||
}
|
||||
|
||||
func init() {
|
||||
INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false}
|
||||
NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false}
|
||||
NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false}
|
||||
ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false}
|
||||
NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true}
|
||||
}
|
80
vendor/github.com/uber/jaeger-client-go/thrift/processor_factory.go
generated
vendored
Normal file
80
vendor/github.com/uber/jaeger-client-go/thrift/processor_factory.go
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import "context"
|
||||
|
||||
// A processor is a generic object which operates upon an input stream and
|
||||
// writes to some output stream.
|
||||
type TProcessor interface {
|
||||
Process(ctx context.Context, in, out TProtocol) (bool, TException)
|
||||
|
||||
// ProcessorMap returns a map of thrift method names to TProcessorFunctions.
|
||||
ProcessorMap() map[string]TProcessorFunction
|
||||
|
||||
// AddToProcessorMap adds the given TProcessorFunction to the internal
|
||||
// processor map at the given key.
|
||||
//
|
||||
// If one is already set at the given key, it will be replaced with the new
|
||||
// TProcessorFunction.
|
||||
AddToProcessorMap(string, TProcessorFunction)
|
||||
}
|
||||
|
||||
type TProcessorFunction interface {
|
||||
Process(ctx context.Context, seqId int32, in, out TProtocol) (bool, TException)
|
||||
}
|
||||
|
||||
// The default processor factory just returns a singleton
|
||||
// instance.
|
||||
type TProcessorFactory interface {
|
||||
GetProcessor(trans TTransport) TProcessor
|
||||
}
|
||||
|
||||
type tProcessorFactory struct {
|
||||
processor TProcessor
|
||||
}
|
||||
|
||||
func NewTProcessorFactory(p TProcessor) TProcessorFactory {
|
||||
return &tProcessorFactory{processor: p}
|
||||
}
|
||||
|
||||
func (p *tProcessorFactory) GetProcessor(trans TTransport) TProcessor {
|
||||
return p.processor
|
||||
}
|
||||
|
||||
/**
|
||||
* The default processor factory just returns a singleton
|
||||
* instance.
|
||||
*/
|
||||
type TProcessorFunctionFactory interface {
|
||||
GetProcessorFunction(trans TTransport) TProcessorFunction
|
||||
}
|
||||
|
||||
type tProcessorFunctionFactory struct {
|
||||
processor TProcessorFunction
|
||||
}
|
||||
|
||||
func NewTProcessorFunctionFactory(p TProcessorFunction) TProcessorFunctionFactory {
|
||||
return &tProcessorFunctionFactory{processor: p}
|
||||
}
|
||||
|
||||
func (p *tProcessorFunctionFactory) GetProcessorFunction(trans TTransport) TProcessorFunction {
|
||||
return p.processor
|
||||
}
|
177
vendor/github.com/uber/jaeger-client-go/thrift/protocol.go
generated
vendored
Normal file
177
vendor/github.com/uber/jaeger-client-go/thrift/protocol.go
generated
vendored
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
const (
|
||||
VERSION_MASK = 0xffff0000
|
||||
VERSION_1 = 0x80010000
|
||||
)
|
||||
|
||||
type TProtocol interface {
|
||||
WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqid int32) error
|
||||
WriteMessageEnd(ctx context.Context) error
|
||||
WriteStructBegin(ctx context.Context, name string) error
|
||||
WriteStructEnd(ctx context.Context) error
|
||||
WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error
|
||||
WriteFieldEnd(ctx context.Context) error
|
||||
WriteFieldStop(ctx context.Context) error
|
||||
WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error
|
||||
WriteMapEnd(ctx context.Context) error
|
||||
WriteListBegin(ctx context.Context, elemType TType, size int) error
|
||||
WriteListEnd(ctx context.Context) error
|
||||
WriteSetBegin(ctx context.Context, elemType TType, size int) error
|
||||
WriteSetEnd(ctx context.Context) error
|
||||
WriteBool(ctx context.Context, value bool) error
|
||||
WriteByte(ctx context.Context, value int8) error
|
||||
WriteI16(ctx context.Context, value int16) error
|
||||
WriteI32(ctx context.Context, value int32) error
|
||||
WriteI64(ctx context.Context, value int64) error
|
||||
WriteDouble(ctx context.Context, value float64) error
|
||||
WriteString(ctx context.Context, value string) error
|
||||
WriteBinary(ctx context.Context, value []byte) error
|
||||
|
||||
ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqid int32, err error)
|
||||
ReadMessageEnd(ctx context.Context) error
|
||||
ReadStructBegin(ctx context.Context) (name string, err error)
|
||||
ReadStructEnd(ctx context.Context) error
|
||||
ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error)
|
||||
ReadFieldEnd(ctx context.Context) error
|
||||
ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error)
|
||||
ReadMapEnd(ctx context.Context) error
|
||||
ReadListBegin(ctx context.Context) (elemType TType, size int, err error)
|
||||
ReadListEnd(ctx context.Context) error
|
||||
ReadSetBegin(ctx context.Context) (elemType TType, size int, err error)
|
||||
ReadSetEnd(ctx context.Context) error
|
||||
ReadBool(ctx context.Context) (value bool, err error)
|
||||
ReadByte(ctx context.Context) (value int8, err error)
|
||||
ReadI16(ctx context.Context) (value int16, err error)
|
||||
ReadI32(ctx context.Context) (value int32, err error)
|
||||
ReadI64(ctx context.Context) (value int64, err error)
|
||||
ReadDouble(ctx context.Context) (value float64, err error)
|
||||
ReadString(ctx context.Context) (value string, err error)
|
||||
ReadBinary(ctx context.Context) (value []byte, err error)
|
||||
|
||||
Skip(ctx context.Context, fieldType TType) (err error)
|
||||
Flush(ctx context.Context) (err error)
|
||||
|
||||
Transport() TTransport
|
||||
}
|
||||
|
||||
// The maximum recursive depth the skip() function will traverse
|
||||
const DEFAULT_RECURSION_DEPTH = 64
|
||||
|
||||
// Skips over the next data element from the provided input TProtocol object.
|
||||
func SkipDefaultDepth(ctx context.Context, prot TProtocol, typeId TType) (err error) {
|
||||
return Skip(ctx, prot, typeId, DEFAULT_RECURSION_DEPTH)
|
||||
}
|
||||
|
||||
// Skips over the next data element from the provided input TProtocol object.
|
||||
func Skip(ctx context.Context, self TProtocol, fieldType TType, maxDepth int) (err error) {
|
||||
|
||||
if maxDepth <= 0 {
|
||||
return NewTProtocolExceptionWithType(DEPTH_LIMIT, errors.New("Depth limit exceeded"))
|
||||
}
|
||||
|
||||
switch fieldType {
|
||||
case BOOL:
|
||||
_, err = self.ReadBool(ctx)
|
||||
return
|
||||
case BYTE:
|
||||
_, err = self.ReadByte(ctx)
|
||||
return
|
||||
case I16:
|
||||
_, err = self.ReadI16(ctx)
|
||||
return
|
||||
case I32:
|
||||
_, err = self.ReadI32(ctx)
|
||||
return
|
||||
case I64:
|
||||
_, err = self.ReadI64(ctx)
|
||||
return
|
||||
case DOUBLE:
|
||||
_, err = self.ReadDouble(ctx)
|
||||
return
|
||||
case STRING:
|
||||
_, err = self.ReadString(ctx)
|
||||
return
|
||||
case STRUCT:
|
||||
if _, err = self.ReadStructBegin(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
for {
|
||||
_, typeId, _, _ := self.ReadFieldBegin(ctx)
|
||||
if typeId == STOP {
|
||||
break
|
||||
}
|
||||
err := Skip(ctx, self, typeId, maxDepth-1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
self.ReadFieldEnd(ctx)
|
||||
}
|
||||
return self.ReadStructEnd(ctx)
|
||||
case MAP:
|
||||
keyType, valueType, size, err := self.ReadMapBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := 0; i < size; i++ {
|
||||
err := Skip(ctx, self, keyType, maxDepth-1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
self.Skip(ctx, valueType)
|
||||
}
|
||||
return self.ReadMapEnd(ctx)
|
||||
case SET:
|
||||
elemType, size, err := self.ReadSetBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := 0; i < size; i++ {
|
||||
err := Skip(ctx, self, elemType, maxDepth-1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return self.ReadSetEnd(ctx)
|
||||
case LIST:
|
||||
elemType, size, err := self.ReadListBegin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := 0; i < size; i++ {
|
||||
err := Skip(ctx, self, elemType, maxDepth-1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return self.ReadListEnd(ctx)
|
||||
default:
|
||||
return NewTProtocolExceptionWithType(INVALID_DATA, errors.New(fmt.Sprintf("Unknown data type %d", fieldType)))
|
||||
}
|
||||
return nil
|
||||
}
|
104
vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go
generated
vendored
Normal file
104
vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go
generated
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// Thrift Protocol exception
|
||||
type TProtocolException interface {
|
||||
TException
|
||||
TypeId() int
|
||||
}
|
||||
|
||||
const (
|
||||
UNKNOWN_PROTOCOL_EXCEPTION = 0
|
||||
INVALID_DATA = 1
|
||||
NEGATIVE_SIZE = 2
|
||||
SIZE_LIMIT = 3
|
||||
BAD_VERSION = 4
|
||||
NOT_IMPLEMENTED = 5
|
||||
DEPTH_LIMIT = 6
|
||||
)
|
||||
|
||||
type tProtocolException struct {
|
||||
typeId int
|
||||
err error
|
||||
msg string
|
||||
}
|
||||
|
||||
var _ TProtocolException = (*tProtocolException)(nil)
|
||||
|
||||
func (tProtocolException) TExceptionType() TExceptionType {
|
||||
return TExceptionTypeProtocol
|
||||
}
|
||||
|
||||
func (p *tProtocolException) TypeId() int {
|
||||
return p.typeId
|
||||
}
|
||||
|
||||
func (p *tProtocolException) String() string {
|
||||
return p.msg
|
||||
}
|
||||
|
||||
func (p *tProtocolException) Error() string {
|
||||
return p.msg
|
||||
}
|
||||
|
||||
func (p *tProtocolException) Unwrap() error {
|
||||
return p.err
|
||||
}
|
||||
|
||||
func NewTProtocolException(err error) TProtocolException {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if e, ok := err.(TProtocolException); ok {
|
||||
return e
|
||||
}
|
||||
|
||||
if errors.As(err, new(base64.CorruptInputError)) {
|
||||
return NewTProtocolExceptionWithType(INVALID_DATA, err)
|
||||
}
|
||||
|
||||
return NewTProtocolExceptionWithType(UNKNOWN_PROTOCOL_EXCEPTION, err)
|
||||
}
|
||||
|
||||
func NewTProtocolExceptionWithType(errType int, err error) TProtocolException {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
return &tProtocolException{
|
||||
typeId: errType,
|
||||
err: err,
|
||||
msg: err.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
func prependTProtocolException(prepend string, err TProtocolException) TProtocolException {
|
||||
return &tProtocolException{
|
||||
typeId: err.TypeId(),
|
||||
err: err,
|
||||
msg: prepend + err.Error(),
|
||||
}
|
||||
}
|
25
vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go
generated
vendored
Normal file
25
vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
// Factory interface for constructing protocol instances.
|
||||
type TProtocolFactory interface {
|
||||
GetProtocol(trans TTransport) TProtocol
|
||||
}
|
94
vendor/github.com/uber/jaeger-client-go/thrift/response_helper.go
generated
vendored
Normal file
94
vendor/github.com/uber/jaeger-client-go/thrift/response_helper.go
generated
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
// See https://pkg.go.dev/context#WithValue on why do we need the unexported typedefs.
|
||||
type responseHelperKey struct{}
|
||||
|
||||
// TResponseHelper defines a object with a set of helper functions that can be
|
||||
// retrieved from the context object passed into server handler functions.
|
||||
//
|
||||
// Use GetResponseHelper to retrieve the injected TResponseHelper implementation
|
||||
// from the context object.
|
||||
//
|
||||
// The zero value of TResponseHelper is valid with all helper functions being
|
||||
// no-op.
|
||||
type TResponseHelper struct {
|
||||
// THeader related functions
|
||||
*THeaderResponseHelper
|
||||
}
|
||||
|
||||
// THeaderResponseHelper defines THeader related TResponseHelper functions.
|
||||
//
|
||||
// The zero value of *THeaderResponseHelper is valid with all helper functions
|
||||
// being no-op.
|
||||
type THeaderResponseHelper struct {
|
||||
proto *THeaderProtocol
|
||||
}
|
||||
|
||||
// NewTHeaderResponseHelper creates a new THeaderResponseHelper from the
|
||||
// underlying TProtocol.
|
||||
func NewTHeaderResponseHelper(proto TProtocol) *THeaderResponseHelper {
|
||||
if hp, ok := proto.(*THeaderProtocol); ok {
|
||||
return &THeaderResponseHelper{
|
||||
proto: hp,
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetHeader sets a response header.
|
||||
//
|
||||
// It's no-op if the underlying protocol/transport does not support THeader.
|
||||
func (h *THeaderResponseHelper) SetHeader(key, value string) {
|
||||
if h != nil && h.proto != nil {
|
||||
h.proto.SetWriteHeader(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
// ClearHeaders clears all the response headers previously set.
|
||||
//
|
||||
// It's no-op if the underlying protocol/transport does not support THeader.
|
||||
func (h *THeaderResponseHelper) ClearHeaders() {
|
||||
if h != nil && h.proto != nil {
|
||||
h.proto.ClearWriteHeaders()
|
||||
}
|
||||
}
|
||||
|
||||
// GetResponseHelper retrieves the TResponseHelper implementation injected into
|
||||
// the context object.
|
||||
//
|
||||
// If no helper was found in the context object, a nop helper with ok == false
|
||||
// will be returned.
|
||||
func GetResponseHelper(ctx context.Context) (helper TResponseHelper, ok bool) {
|
||||
if v := ctx.Value(responseHelperKey{}); v != nil {
|
||||
helper, ok = v.(TResponseHelper)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// SetResponseHelper injects TResponseHelper into the context object.
|
||||
func SetResponseHelper(ctx context.Context, helper TResponseHelper) context.Context {
|
||||
return context.WithValue(ctx, responseHelperKey{}, helper)
|
||||
}
|
71
vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go
generated
vendored
Normal file
71
vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
)
|
||||
|
||||
type RichTransport struct {
|
||||
TTransport
|
||||
}
|
||||
|
||||
// Wraps Transport to provide TRichTransport interface
|
||||
func NewTRichTransport(trans TTransport) *RichTransport {
|
||||
return &RichTransport{trans}
|
||||
}
|
||||
|
||||
func (r *RichTransport) ReadByte() (c byte, err error) {
|
||||
return readByte(r.TTransport)
|
||||
}
|
||||
|
||||
func (r *RichTransport) WriteByte(c byte) error {
|
||||
return writeByte(r.TTransport, c)
|
||||
}
|
||||
|
||||
func (r *RichTransport) WriteString(s string) (n int, err error) {
|
||||
return r.Write([]byte(s))
|
||||
}
|
||||
|
||||
func (r *RichTransport) RemainingBytes() (num_bytes uint64) {
|
||||
return r.TTransport.RemainingBytes()
|
||||
}
|
||||
|
||||
func readByte(r io.Reader) (c byte, err error) {
|
||||
v := [1]byte{0}
|
||||
n, err := r.Read(v[0:1])
|
||||
if n > 0 && (err == nil || errors.Is(err, io.EOF)) {
|
||||
return v[0], nil
|
||||
}
|
||||
if n > 0 && err != nil {
|
||||
return v[0], err
|
||||
}
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return v[0], nil
|
||||
}
|
||||
|
||||
func writeByte(w io.Writer, c byte) error {
|
||||
v := [1]byte{c}
|
||||
_, err := w.Write(v[0:1])
|
||||
return err
|
||||
}
|
136
vendor/github.com/uber/jaeger-client-go/thrift/serializer.go
generated
vendored
Normal file
136
vendor/github.com/uber/jaeger-client-go/thrift/serializer.go
generated
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type TSerializer struct {
|
||||
Transport *TMemoryBuffer
|
||||
Protocol TProtocol
|
||||
}
|
||||
|
||||
type TStruct interface {
|
||||
Write(ctx context.Context, p TProtocol) error
|
||||
Read(ctx context.Context, p TProtocol) error
|
||||
}
|
||||
|
||||
func NewTSerializer() *TSerializer {
|
||||
transport := NewTMemoryBufferLen(1024)
|
||||
protocol := NewTBinaryProtocolTransport(transport)
|
||||
|
||||
return &TSerializer{
|
||||
Transport: transport,
|
||||
Protocol: protocol,
|
||||
}
|
||||
}
|
||||
|
||||
func (t *TSerializer) WriteString(ctx context.Context, msg TStruct) (s string, err error) {
|
||||
t.Transport.Reset()
|
||||
|
||||
if err = msg.Write(ctx, t.Protocol); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err = t.Protocol.Flush(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
if err = t.Transport.Flush(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return t.Transport.String(), nil
|
||||
}
|
||||
|
||||
func (t *TSerializer) Write(ctx context.Context, msg TStruct) (b []byte, err error) {
|
||||
t.Transport.Reset()
|
||||
|
||||
if err = msg.Write(ctx, t.Protocol); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err = t.Protocol.Flush(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err = t.Transport.Flush(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
b = append(b, t.Transport.Bytes()...)
|
||||
return
|
||||
}
|
||||
|
||||
// TSerializerPool is the thread-safe version of TSerializer, it uses resource
|
||||
// pool of TSerializer under the hood.
|
||||
//
|
||||
// It must be initialized with either NewTSerializerPool or
|
||||
// NewTSerializerPoolSizeFactory.
|
||||
type TSerializerPool struct {
|
||||
pool sync.Pool
|
||||
}
|
||||
|
||||
// NewTSerializerPool creates a new TSerializerPool.
|
||||
//
|
||||
// NewTSerializer can be used as the arg here.
|
||||
func NewTSerializerPool(f func() *TSerializer) *TSerializerPool {
|
||||
return &TSerializerPool{
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return f()
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewTSerializerPoolSizeFactory creates a new TSerializerPool with the given
|
||||
// size and protocol factory.
|
||||
//
|
||||
// Note that the size is not the limit. The TMemoryBuffer underneath can grow
|
||||
// larger than that. It just dictates the initial size.
|
||||
func NewTSerializerPoolSizeFactory(size int, factory TProtocolFactory) *TSerializerPool {
|
||||
return &TSerializerPool{
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
transport := NewTMemoryBufferLen(size)
|
||||
protocol := factory.GetProtocol(transport)
|
||||
|
||||
return &TSerializer{
|
||||
Transport: transport,
|
||||
Protocol: protocol,
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (t *TSerializerPool) WriteString(ctx context.Context, msg TStruct) (string, error) {
|
||||
s := t.pool.Get().(*TSerializer)
|
||||
defer t.pool.Put(s)
|
||||
return s.WriteString(ctx, msg)
|
||||
}
|
||||
|
||||
func (t *TSerializerPool) Write(ctx context.Context, msg TStruct) ([]byte, error) {
|
||||
s := t.pool.Get().(*TSerializer)
|
||||
defer t.pool.Put(s)
|
||||
return s.Write(ctx, msg)
|
||||
}
|
34
vendor/github.com/uber/jaeger-client-go/thrift/server_transport.go
generated
vendored
Normal file
34
vendor/github.com/uber/jaeger-client-go/thrift/server_transport.go
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
// Server transport. Object which provides client transports.
|
||||
type TServerTransport interface {
|
||||
Listen() error
|
||||
Accept() (TTransport, error)
|
||||
Close() error
|
||||
|
||||
// Optional method implementation. This signals to the server transport
|
||||
// that it should break out of any accept() or listen() that it is currently
|
||||
// blocked on. This method, if implemented, MUST be thread safe, as it may
|
||||
// be called from a different thread context than the other TServerTransport
|
||||
// methods.
|
||||
Interrupt() error
|
||||
}
|
1373
vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go
generated
vendored
Normal file
1373
vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
332
vendor/github.com/uber/jaeger-client-go/thrift/simple_server.go
generated
vendored
Normal file
332
vendor/github.com/uber/jaeger-client-go/thrift/simple_server.go
generated
vendored
Normal file
@@ -0,0 +1,332 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ErrAbandonRequest is a special error server handler implementations can
|
||||
// return to indicate that the request has been abandoned.
|
||||
//
|
||||
// TSimpleServer will check for this error, and close the client connection
|
||||
// instead of writing the response/error back to the client.
|
||||
//
|
||||
// It shall only be used when the server handler implementation know that the
|
||||
// client already abandoned the request (by checking that the passed in context
|
||||
// is already canceled, for example).
|
||||
var ErrAbandonRequest = errors.New("request abandoned")
|
||||
|
||||
// ServerConnectivityCheckInterval defines the ticker interval used by
|
||||
// connectivity check in thrift compiled TProcessorFunc implementations.
|
||||
//
|
||||
// It's defined as a variable instead of constant, so that thrift server
|
||||
// implementations can change its value to control the behavior.
|
||||
//
|
||||
// If it's changed to <=0, the feature will be disabled.
|
||||
var ServerConnectivityCheckInterval = time.Millisecond * 5
|
||||
|
||||
/*
|
||||
* This is not a typical TSimpleServer as it is not blocked after accept a socket.
|
||||
* It is more like a TThreadedServer that can handle different connections in different goroutines.
|
||||
* This will work if golang user implements a conn-pool like thing in client side.
|
||||
*/
|
||||
type TSimpleServer struct {
|
||||
closed int32
|
||||
wg sync.WaitGroup
|
||||
mu sync.Mutex
|
||||
|
||||
processorFactory TProcessorFactory
|
||||
serverTransport TServerTransport
|
||||
inputTransportFactory TTransportFactory
|
||||
outputTransportFactory TTransportFactory
|
||||
inputProtocolFactory TProtocolFactory
|
||||
outputProtocolFactory TProtocolFactory
|
||||
|
||||
// Headers to auto forward in THeaderProtocol
|
||||
forwardHeaders []string
|
||||
|
||||
logger Logger
|
||||
}
|
||||
|
||||
func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer {
|
||||
return NewTSimpleServerFactory2(NewTProcessorFactory(processor), serverTransport)
|
||||
}
|
||||
|
||||
func NewTSimpleServer4(processor TProcessor, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer {
|
||||
return NewTSimpleServerFactory4(NewTProcessorFactory(processor),
|
||||
serverTransport,
|
||||
transportFactory,
|
||||
protocolFactory,
|
||||
)
|
||||
}
|
||||
|
||||
func NewTSimpleServer6(processor TProcessor, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer {
|
||||
return NewTSimpleServerFactory6(NewTProcessorFactory(processor),
|
||||
serverTransport,
|
||||
inputTransportFactory,
|
||||
outputTransportFactory,
|
||||
inputProtocolFactory,
|
||||
outputProtocolFactory,
|
||||
)
|
||||
}
|
||||
|
||||
func NewTSimpleServerFactory2(processorFactory TProcessorFactory, serverTransport TServerTransport) *TSimpleServer {
|
||||
return NewTSimpleServerFactory6(processorFactory,
|
||||
serverTransport,
|
||||
NewTTransportFactory(),
|
||||
NewTTransportFactory(),
|
||||
NewTBinaryProtocolFactoryDefault(),
|
||||
NewTBinaryProtocolFactoryDefault(),
|
||||
)
|
||||
}
|
||||
|
||||
func NewTSimpleServerFactory4(processorFactory TProcessorFactory, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer {
|
||||
return NewTSimpleServerFactory6(processorFactory,
|
||||
serverTransport,
|
||||
transportFactory,
|
||||
transportFactory,
|
||||
protocolFactory,
|
||||
protocolFactory,
|
||||
)
|
||||
}
|
||||
|
||||
func NewTSimpleServerFactory6(processorFactory TProcessorFactory, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer {
|
||||
return &TSimpleServer{
|
||||
processorFactory: processorFactory,
|
||||
serverTransport: serverTransport,
|
||||
inputTransportFactory: inputTransportFactory,
|
||||
outputTransportFactory: outputTransportFactory,
|
||||
inputProtocolFactory: inputProtocolFactory,
|
||||
outputProtocolFactory: outputProtocolFactory,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) ProcessorFactory() TProcessorFactory {
|
||||
return p.processorFactory
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) ServerTransport() TServerTransport {
|
||||
return p.serverTransport
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) InputTransportFactory() TTransportFactory {
|
||||
return p.inputTransportFactory
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) OutputTransportFactory() TTransportFactory {
|
||||
return p.outputTransportFactory
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) InputProtocolFactory() TProtocolFactory {
|
||||
return p.inputProtocolFactory
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) OutputProtocolFactory() TProtocolFactory {
|
||||
return p.outputProtocolFactory
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) Listen() error {
|
||||
return p.serverTransport.Listen()
|
||||
}
|
||||
|
||||
// SetForwardHeaders sets the list of header keys that will be auto forwarded
|
||||
// while using THeaderProtocol.
|
||||
//
|
||||
// "forward" means that when the server is also a client to other upstream
|
||||
// thrift servers, the context object user gets in the processor functions will
|
||||
// have both read and write headers set, with write headers being forwarded.
|
||||
// Users can always override the write headers by calling SetWriteHeaderList
|
||||
// before calling thrift client functions.
|
||||
func (p *TSimpleServer) SetForwardHeaders(headers []string) {
|
||||
size := len(headers)
|
||||
if size == 0 {
|
||||
p.forwardHeaders = nil
|
||||
return
|
||||
}
|
||||
|
||||
keys := make([]string, size)
|
||||
copy(keys, headers)
|
||||
p.forwardHeaders = keys
|
||||
}
|
||||
|
||||
// SetLogger sets the logger used by this TSimpleServer.
|
||||
//
|
||||
// If no logger was set before Serve is called, a default logger using standard
|
||||
// log library will be used.
|
||||
func (p *TSimpleServer) SetLogger(logger Logger) {
|
||||
p.logger = logger
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) innerAccept() (int32, error) {
|
||||
client, err := p.serverTransport.Accept()
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
closed := atomic.LoadInt32(&p.closed)
|
||||
if closed != 0 {
|
||||
return closed, nil
|
||||
}
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if client != nil {
|
||||
p.wg.Add(1)
|
||||
go func() {
|
||||
defer p.wg.Done()
|
||||
if err := p.processRequests(client); err != nil {
|
||||
p.logger(fmt.Sprintf("error processing request: %v", err))
|
||||
}
|
||||
}()
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) AcceptLoop() error {
|
||||
for {
|
||||
closed, err := p.innerAccept()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if closed != 0 {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) Serve() error {
|
||||
p.logger = fallbackLogger(p.logger)
|
||||
|
||||
err := p.Listen()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p.AcceptLoop()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) Stop() error {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
if atomic.LoadInt32(&p.closed) != 0 {
|
||||
return nil
|
||||
}
|
||||
atomic.StoreInt32(&p.closed, 1)
|
||||
p.serverTransport.Interrupt()
|
||||
p.wg.Wait()
|
||||
return nil
|
||||
}
|
||||
|
||||
// If err is actually EOF, return nil, otherwise return err as-is.
|
||||
func treatEOFErrorsAsNil(err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
if errors.Is(err, io.EOF) {
|
||||
return nil
|
||||
}
|
||||
var te TTransportException
|
||||
if errors.As(err, &te) && te.TypeId() == END_OF_FILE {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *TSimpleServer) processRequests(client TTransport) (err error) {
|
||||
defer func() {
|
||||
err = treatEOFErrorsAsNil(err)
|
||||
}()
|
||||
|
||||
processor := p.processorFactory.GetProcessor(client)
|
||||
inputTransport, err := p.inputTransportFactory.GetTransport(client)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
inputProtocol := p.inputProtocolFactory.GetProtocol(inputTransport)
|
||||
var outputTransport TTransport
|
||||
var outputProtocol TProtocol
|
||||
|
||||
// for THeaderProtocol, we must use the same protocol instance for
|
||||
// input and output so that the response is in the same dialect that
|
||||
// the server detected the request was in.
|
||||
headerProtocol, ok := inputProtocol.(*THeaderProtocol)
|
||||
if ok {
|
||||
outputProtocol = inputProtocol
|
||||
} else {
|
||||
oTrans, err := p.outputTransportFactory.GetTransport(client)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
outputTransport = oTrans
|
||||
outputProtocol = p.outputProtocolFactory.GetProtocol(outputTransport)
|
||||
}
|
||||
|
||||
if inputTransport != nil {
|
||||
defer inputTransport.Close()
|
||||
}
|
||||
if outputTransport != nil {
|
||||
defer outputTransport.Close()
|
||||
}
|
||||
for {
|
||||
if atomic.LoadInt32(&p.closed) != 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
ctx := SetResponseHelper(
|
||||
defaultCtx,
|
||||
TResponseHelper{
|
||||
THeaderResponseHelper: NewTHeaderResponseHelper(outputProtocol),
|
||||
},
|
||||
)
|
||||
if headerProtocol != nil {
|
||||
// We need to call ReadFrame here, otherwise we won't
|
||||
// get any headers on the AddReadTHeaderToContext call.
|
||||
//
|
||||
// ReadFrame is safe to be called multiple times so it
|
||||
// won't break when it's called again later when we
|
||||
// actually start to read the message.
|
||||
if err := headerProtocol.ReadFrame(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
ctx = AddReadTHeaderToContext(ctx, headerProtocol.GetReadHeaders())
|
||||
ctx = SetWriteHeaderList(ctx, p.forwardHeaders)
|
||||
}
|
||||
|
||||
ok, err := processor.Process(ctx, inputProtocol, outputProtocol)
|
||||
if errors.Is(err, ErrAbandonRequest) {
|
||||
return client.Close()
|
||||
}
|
||||
if errors.As(err, new(TTransportException)) && err != nil {
|
||||
return err
|
||||
}
|
||||
var tae TApplicationException
|
||||
if errors.As(err, &tae) && tae.TypeId() == UNKNOWN_METHOD {
|
||||
continue
|
||||
}
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
70
vendor/github.com/uber/jaeger-client-go/thrift/transport.go
generated
vendored
Normal file
70
vendor/github.com/uber/jaeger-client-go/thrift/transport.go
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
)
|
||||
|
||||
var errTransportInterrupted = errors.New("Transport Interrupted")
|
||||
|
||||
type Flusher interface {
|
||||
Flush() (err error)
|
||||
}
|
||||
|
||||
type ContextFlusher interface {
|
||||
Flush(ctx context.Context) (err error)
|
||||
}
|
||||
|
||||
type ReadSizeProvider interface {
|
||||
RemainingBytes() (num_bytes uint64)
|
||||
}
|
||||
|
||||
// Encapsulates the I/O layer
|
||||
type TTransport interface {
|
||||
io.ReadWriteCloser
|
||||
ContextFlusher
|
||||
ReadSizeProvider
|
||||
|
||||
// Opens the transport for communication
|
||||
Open() error
|
||||
|
||||
// Returns true if the transport is open
|
||||
IsOpen() bool
|
||||
}
|
||||
|
||||
type stringWriter interface {
|
||||
WriteString(s string) (n int, err error)
|
||||
}
|
||||
|
||||
// This is "enchanced" transport with extra capabilities. You need to use one of these
|
||||
// to construct protocol.
|
||||
// Notably, TSocket does not implement this interface, and it is always a mistake to use
|
||||
// TSocket directly in protocol.
|
||||
type TRichTransport interface {
|
||||
io.ReadWriter
|
||||
io.ByteReader
|
||||
io.ByteWriter
|
||||
stringWriter
|
||||
ContextFlusher
|
||||
ReadSizeProvider
|
||||
}
|
131
vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go
generated
vendored
Normal file
131
vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
)
|
||||
|
||||
type timeoutable interface {
|
||||
Timeout() bool
|
||||
}
|
||||
|
||||
// Thrift Transport exception
|
||||
type TTransportException interface {
|
||||
TException
|
||||
TypeId() int
|
||||
Err() error
|
||||
}
|
||||
|
||||
const (
|
||||
UNKNOWN_TRANSPORT_EXCEPTION = 0
|
||||
NOT_OPEN = 1
|
||||
ALREADY_OPEN = 2
|
||||
TIMED_OUT = 3
|
||||
END_OF_FILE = 4
|
||||
)
|
||||
|
||||
type tTransportException struct {
|
||||
typeId int
|
||||
err error
|
||||
msg string
|
||||
}
|
||||
|
||||
var _ TTransportException = (*tTransportException)(nil)
|
||||
|
||||
func (tTransportException) TExceptionType() TExceptionType {
|
||||
return TExceptionTypeTransport
|
||||
}
|
||||
|
||||
func (p *tTransportException) TypeId() int {
|
||||
return p.typeId
|
||||
}
|
||||
|
||||
func (p *tTransportException) Error() string {
|
||||
return p.msg
|
||||
}
|
||||
|
||||
func (p *tTransportException) Err() error {
|
||||
return p.err
|
||||
}
|
||||
|
||||
func (p *tTransportException) Unwrap() error {
|
||||
return p.err
|
||||
}
|
||||
|
||||
func (p *tTransportException) Timeout() bool {
|
||||
return p.typeId == TIMED_OUT
|
||||
}
|
||||
|
||||
func NewTTransportException(t int, e string) TTransportException {
|
||||
return &tTransportException{
|
||||
typeId: t,
|
||||
err: errors.New(e),
|
||||
msg: e,
|
||||
}
|
||||
}
|
||||
|
||||
func NewTTransportExceptionFromError(e error) TTransportException {
|
||||
if e == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if t, ok := e.(TTransportException); ok {
|
||||
return t
|
||||
}
|
||||
|
||||
te := &tTransportException{
|
||||
typeId: UNKNOWN_TRANSPORT_EXCEPTION,
|
||||
err: e,
|
||||
msg: e.Error(),
|
||||
}
|
||||
|
||||
if isTimeoutError(e) {
|
||||
te.typeId = TIMED_OUT
|
||||
return te
|
||||
}
|
||||
|
||||
if errors.Is(e, io.EOF) {
|
||||
te.typeId = END_OF_FILE
|
||||
return te
|
||||
}
|
||||
|
||||
return te
|
||||
}
|
||||
|
||||
func prependTTransportException(prepend string, e TTransportException) TTransportException {
|
||||
return &tTransportException{
|
||||
typeId: e.TypeId(),
|
||||
err: e,
|
||||
msg: prepend + e.Error(),
|
||||
}
|
||||
}
|
||||
|
||||
// isTimeoutError returns true when err is an error caused by timeout.
|
||||
//
|
||||
// Note that this also includes TTransportException wrapped timeout errors.
|
||||
func isTimeoutError(err error) bool {
|
||||
var t timeoutable
|
||||
if errors.As(err, &t) {
|
||||
return t.Timeout()
|
||||
}
|
||||
return false
|
||||
}
|
39
vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go
generated
vendored
Normal file
39
vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
// Factory class used to create wrapped instance of Transports.
|
||||
// This is used primarily in servers, which get Transports from
|
||||
// a ServerTransport and then may want to mutate them (i.e. create
|
||||
// a BufferedTransport from the underlying base transport)
|
||||
type TTransportFactory interface {
|
||||
GetTransport(trans TTransport) (TTransport, error)
|
||||
}
|
||||
|
||||
type tTransportFactory struct{}
|
||||
|
||||
// Return a wrapped instance of the base Transport.
|
||||
func (p *tTransportFactory) GetTransport(trans TTransport) (TTransport, error) {
|
||||
return trans, nil
|
||||
}
|
||||
|
||||
func NewTTransportFactory() TTransportFactory {
|
||||
return &tTransportFactory{}
|
||||
}
|
69
vendor/github.com/uber/jaeger-client-go/thrift/type.go
generated
vendored
Normal file
69
vendor/github.com/uber/jaeger-client-go/thrift/type.go
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package thrift
|
||||
|
||||
// Type constants in the Thrift protocol
|
||||
type TType byte
|
||||
|
||||
const (
|
||||
STOP = 0
|
||||
VOID = 1
|
||||
BOOL = 2
|
||||
BYTE = 3
|
||||
I08 = 3
|
||||
DOUBLE = 4
|
||||
I16 = 6
|
||||
I32 = 8
|
||||
I64 = 10
|
||||
STRING = 11
|
||||
UTF7 = 11
|
||||
STRUCT = 12
|
||||
MAP = 13
|
||||
SET = 14
|
||||
LIST = 15
|
||||
UTF8 = 16
|
||||
UTF16 = 17
|
||||
//BINARY = 18 wrong and unusued
|
||||
)
|
||||
|
||||
var typeNames = map[int]string{
|
||||
STOP: "STOP",
|
||||
VOID: "VOID",
|
||||
BOOL: "BOOL",
|
||||
BYTE: "BYTE",
|
||||
DOUBLE: "DOUBLE",
|
||||
I16: "I16",
|
||||
I32: "I32",
|
||||
I64: "I64",
|
||||
STRING: "STRING",
|
||||
STRUCT: "STRUCT",
|
||||
MAP: "MAP",
|
||||
SET: "SET",
|
||||
LIST: "LIST",
|
||||
UTF8: "UTF8",
|
||||
UTF16: "UTF16",
|
||||
}
|
||||
|
||||
func (p TType) String() string {
|
||||
if s, ok := typeNames[int(p)]; ok {
|
||||
return s
|
||||
}
|
||||
return "Unknown"
|
||||
}
|
Reference in New Issue
Block a user