blob: 9dcf4bfd94cac9a6695fbcf4024069ac7c41838d [file] [log] [blame]
Rohan Agrawalc32d9932020-06-15 11:01:47 +00001/*
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"
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000024 "errors"
Rohan Agrawalc32d9932020-06-15 11:01:47 +000025)
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 {
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000044 typeId int
45 err error
46 msg string
47}
48
49var _ TProtocolException = (*tProtocolException)(nil)
50
51func (tProtocolException) TExceptionType() TExceptionType {
52 return TExceptionTypeProtocol
Rohan Agrawalc32d9932020-06-15 11:01:47 +000053}
54
55func (p *tProtocolException) TypeId() int {
56 return p.typeId
57}
58
59func (p *tProtocolException) String() string {
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000060 return p.msg
Rohan Agrawalc32d9932020-06-15 11:01:47 +000061}
62
63func (p *tProtocolException) Error() string {
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000064 return p.msg
65}
66
67func (p *tProtocolException) Unwrap() error {
68 return p.err
Rohan Agrawalc32d9932020-06-15 11:01:47 +000069}
70
71func NewTProtocolException(err error) TProtocolException {
72 if err == nil {
73 return nil
74 }
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000075
76 if e, ok := err.(TProtocolException); ok {
Rohan Agrawalc32d9932020-06-15 11:01:47 +000077 return e
78 }
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000079
80 if errors.As(err, new(base64.CorruptInputError)) {
81 return NewTProtocolExceptionWithType(INVALID_DATA, err)
Rohan Agrawalc32d9932020-06-15 11:01:47 +000082 }
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000083
84 return NewTProtocolExceptionWithType(UNKNOWN_PROTOCOL_EXCEPTION, err)
Rohan Agrawalc32d9932020-06-15 11:01:47 +000085}
86
87func NewTProtocolExceptionWithType(errType int, err error) TProtocolException {
88 if err == nil {
89 return nil
90 }
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000091 return &tProtocolException{
92 typeId: errType,
93 err: err,
94 msg: err.Error(),
95 }
Rohan Agrawalc32d9932020-06-15 11:01:47 +000096}
97
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000098func prependTProtocolException(prepend string, err TProtocolException) TProtocolException {
99 return &tProtocolException{
100 typeId: err.TypeId(),
101 err: err,
102 msg: prepend + err.Error(),
103 }
104}