github.com/theQRL/go-zond@v0.1.1/rpc/errors.go (about) 1 // Copyright 2015 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package rpc 18 19 import "fmt" 20 21 // HTTPError is returned by client operations when the HTTP status code of the 22 // response is not a 2xx status. 23 type HTTPError struct { 24 StatusCode int 25 Status string 26 Body []byte 27 } 28 29 func (err HTTPError) Error() string { 30 if len(err.Body) == 0 { 31 return err.Status 32 } 33 return fmt.Sprintf("%v: %s", err.Status, err.Body) 34 } 35 36 // Error wraps RPC errors, which contain an error code in addition to the message. 37 type Error interface { 38 Error() string // returns the message 39 ErrorCode() int // returns the code 40 } 41 42 // A DataError contains some data in addition to the error message. 43 type DataError interface { 44 Error() string // returns the message 45 ErrorData() interface{} // returns the error data 46 } 47 48 // Error types defined below are the built-in JSON-RPC errors. 49 50 var ( 51 _ Error = new(methodNotFoundError) 52 _ Error = new(subscriptionNotFoundError) 53 _ Error = new(parseError) 54 _ Error = new(invalidRequestError) 55 _ Error = new(invalidMessageError) 56 _ Error = new(invalidParamsError) 57 _ Error = new(internalServerError) 58 ) 59 60 const ( 61 errcodeDefault = -32000 62 errcodeTimeout = -32002 63 errcodeResponseTooLarge = -32003 64 errcodePanic = -32603 65 errcodeMarshalError = -32603 66 67 legacyErrcodeNotificationsUnsupported = -32001 68 ) 69 70 const ( 71 errMsgTimeout = "request timed out" 72 errMsgResponseTooLarge = "response too large" 73 errMsgBatchTooLarge = "batch too large" 74 ) 75 76 type methodNotFoundError struct{ method string } 77 78 func (e *methodNotFoundError) ErrorCode() int { return -32601 } 79 80 func (e *methodNotFoundError) Error() string { 81 return fmt.Sprintf("the method %s does not exist/is not available", e.method) 82 } 83 84 type notificationsUnsupportedError struct{} 85 86 func (e notificationsUnsupportedError) Error() string { 87 return "notifications not supported" 88 } 89 90 func (e notificationsUnsupportedError) ErrorCode() int { return -32601 } 91 92 // Is checks for equivalence to another error. Here we define that all errors with code 93 // -32601 (method not found) are equivalent to notificationsUnsupportedError. This is 94 // done to enable the following pattern: 95 // 96 // sub, err := client.Subscribe(...) 97 // if errors.Is(err, rpc.ErrNotificationsUnsupported) { 98 // // server doesn't support subscriptions 99 // } 100 func (e notificationsUnsupportedError) Is(other error) bool { 101 if other == (notificationsUnsupportedError{}) { 102 return true 103 } 104 rpcErr, ok := other.(Error) 105 if ok { 106 code := rpcErr.ErrorCode() 107 return code == -32601 || code == legacyErrcodeNotificationsUnsupported 108 } 109 return false 110 } 111 112 type subscriptionNotFoundError struct{ namespace, subscription string } 113 114 func (e *subscriptionNotFoundError) ErrorCode() int { return -32601 } 115 116 func (e *subscriptionNotFoundError) Error() string { 117 return fmt.Sprintf("no %q subscription in %s namespace", e.subscription, e.namespace) 118 } 119 120 // Invalid JSON was received by the server. 121 type parseError struct{ message string } 122 123 func (e *parseError) ErrorCode() int { return -32700 } 124 125 func (e *parseError) Error() string { return e.message } 126 127 // received message isn't a valid request 128 type invalidRequestError struct{ message string } 129 130 func (e *invalidRequestError) ErrorCode() int { return -32600 } 131 132 func (e *invalidRequestError) Error() string { return e.message } 133 134 // received message is invalid 135 type invalidMessageError struct{ message string } 136 137 func (e *invalidMessageError) ErrorCode() int { return -32700 } 138 139 func (e *invalidMessageError) Error() string { return e.message } 140 141 // unable to decode supplied params, or an invalid number of parameters 142 type invalidParamsError struct{ message string } 143 144 func (e *invalidParamsError) ErrorCode() int { return -32602 } 145 146 func (e *invalidParamsError) Error() string { return e.message } 147 148 // internalServerError is used for server errors during request processing. 149 type internalServerError struct { 150 code int 151 message string 152 } 153 154 func (e *internalServerError) ErrorCode() int { return e.code } 155 156 func (e *internalServerError) Error() string { return e.message }