1/* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 20package thrift 21 22import ( 23 "encoding/base64" 24 "errors" 25) 26 27// Thrift Protocol exception 28type TProtocolException interface { 29 TException 30 TypeId() int 31} 32 33const ( 34 UNKNOWN_PROTOCOL_EXCEPTION = 0 35 INVALID_DATA = 1 36 NEGATIVE_SIZE = 2 37 SIZE_LIMIT = 3 38 BAD_VERSION = 4 39 NOT_IMPLEMENTED = 5 40 DEPTH_LIMIT = 6 41) 42 43type tProtocolException struct { 44 typeId int 45 err error 46 msg string 47} 48 49var _ TProtocolException = (*tProtocolException)(nil) 50 51func (tProtocolException) TExceptionType() TExceptionType { 52 return TExceptionTypeProtocol 53} 54 55func (p *tProtocolException) TypeId() int { 56 return p.typeId 57} 58 59func (p *tProtocolException) String() string { 60 return p.msg 61} 62 63func (p *tProtocolException) Error() string { 64 return p.msg 65} 66 67func (p *tProtocolException) Unwrap() error { 68 return p.err 69} 70 71func NewTProtocolException(err error) TProtocolException { 72 if err == nil { 73 return nil 74 } 75 76 if e, ok := err.(TProtocolException); ok { 77 return e 78 } 79 80 if errors.As(err, new(base64.CorruptInputError)) { 81 return NewTProtocolExceptionWithType(INVALID_DATA, err) 82 } 83 84 return NewTProtocolExceptionWithType(UNKNOWN_PROTOCOL_EXCEPTION, err) 85} 86 87func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { 88 if err == nil { 89 return nil 90 } 91 return &tProtocolException{ 92 typeId: errType, 93 err: err, 94 msg: err.Error(), 95 } 96} 97 98func prependTProtocolException(prepend string, err TProtocolException) TProtocolException { 99 return &tProtocolException{ 100 typeId: err.TypeId(), 101 err: err, 102 msg: prepend + err.Error(), 103 } 104} 105