github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/p2p/peer_error.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package p2p
    26  
    27  import (
    28  	"errors"
    29  	"fmt"
    30  )
    31  
    32  const (
    33  	errInvalidMsgCode = iota
    34  	errInvalidMsg
    35  )
    36  
    37  var errorToString = map[int]string{
    38  	errInvalidMsgCode: "invalid message code",
    39  	errInvalidMsg:     "invalid message",
    40  }
    41  
    42  type peerError struct {
    43  	code    int
    44  	message string
    45  }
    46  
    47  func newPeerError(code int, format string, v ...interface{}) *peerError {
    48  	desc, ok := errorToString[code]
    49  	if !ok {
    50  		panic("invalid error code")
    51  	}
    52  	err := &peerError{code, desc}
    53  	if format != "" {
    54  		err.message += ": " + fmt.Sprintf(format, v...)
    55  	}
    56  	return err
    57  }
    58  
    59  func (pe *peerError) Error() string {
    60  	return pe.message
    61  }
    62  
    63  var errProtocolReturned = errors.New("protocol returned")
    64  
    65  type DiscReason uint
    66  
    67  const (
    68  	DiscRequested DiscReason = iota
    69  	DiscNetworkError
    70  	DiscProtocolError
    71  	DiscUselessPeer
    72  	DiscTooManyPeers
    73  	DiscAlreadyConnected
    74  	DiscIncompatibleVersion
    75  	DiscInvalidIdentity
    76  	DiscQuitting
    77  	DiscUnexpectedIdentity
    78  	DiscSelf
    79  	DiscReadTimeout
    80  	DiscSubprotocolError = 0x10
    81  )
    82  
    83  var discReasonToString = [...]string{
    84  	DiscRequested:           "disconnect requested",
    85  	DiscNetworkError:        "network error",
    86  	DiscProtocolError:       "breach of protocol",
    87  	DiscUselessPeer:         "useless peer",
    88  	DiscTooManyPeers:        "too many peers",
    89  	DiscAlreadyConnected:    "already connected",
    90  	DiscIncompatibleVersion: "incompatible p2p protocol version",
    91  	DiscInvalidIdentity:     "invalid node identity",
    92  	DiscQuitting:            "client quitting",
    93  	DiscUnexpectedIdentity:  "unexpected identity",
    94  	DiscSelf:                "connected to self",
    95  	DiscReadTimeout:         "read timeout",
    96  	DiscSubprotocolError:    "subprotocol error",
    97  }
    98  
    99  func (d DiscReason) String() string {
   100  	if len(discReasonToString) < int(d) {
   101  		return fmt.Sprintf("unknown disconnect reason %d", d)
   102  	}
   103  	return discReasonToString[d]
   104  }
   105  
   106  func (d DiscReason) Error() string {
   107  	return d.String()
   108  }
   109  
   110  func discReasonForError(err error) DiscReason {
   111  	if reason, ok := err.(DiscReason); ok {
   112  		return reason
   113  	}
   114  	if err == errProtocolReturned {
   115  		return DiscQuitting
   116  	}
   117  	peerError, ok := err.(*peerError)
   118  	if ok {
   119  		switch peerError.code {
   120  		case errInvalidMsgCode, errInvalidMsg:
   121  			return DiscProtocolError
   122  		default:
   123  			return DiscSubprotocolError
   124  		}
   125  	}
   126  	return DiscSubprotocolError
   127  }