From efb24a4d2133edba19d8acda4a4a6cca41cadafc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 4 Dec 2016 09:10:47 +0100 Subject: [PATCH] rewrite error lib --- app/dispatcher/impl/default.go | 2 +- app/dns/server.go | 2 +- app/proxy/proxy.go | 2 +- app/router/config.go | 2 +- app/router/router.go | 3 +- app/space.go | 5 +- app/web/config.proto | 29 +++++++ app/web/file_server.go | 1 + app/web/web.go | 15 ++++ common/common.go | 2 +- common/errors/errors.go | 80 +++++++++++++++++++ common/io/buffered_writer.go | 3 +- common/io/transport.go | 3 +- common/loader/type.go | 2 +- common/log/internal/log_entry.go | 29 +------ common/log/log.go | 4 +- common/net/port.go | 2 +- common/protocol/errors.go | 2 +- common/protocol/id.go | 2 +- common/protocol/user.go | 4 +- common/retry/retry.go | 2 +- common/retry/retry_test.go | 2 +- common/serial/string.go | 35 ++++++++ common/uuid/uuid.go | 2 +- proxy/dokodemo/dokodemo.go | 2 +- proxy/errors.go | 2 +- proxy/freedom/freedom.go | 2 +- proxy/http/server.go | 3 +- proxy/registry/handler_cache.go | 3 +- proxy/shadowsocks/client.go | 2 +- proxy/shadowsocks/config.go | 5 +- proxy/shadowsocks/ota.go | 2 +- proxy/shadowsocks/protocol.go | 31 ++++--- proxy/shadowsocks/server.go | 3 +- proxy/socks/protocol/socks.go | 2 +- proxy/socks/protocol/socks4.go | 3 +- proxy/socks/protocol/udp.go | 2 +- proxy/socks/server.go | 6 +- proxy/vmess/encoding/commands.go | 2 +- proxy/vmess/encoding/server.go | 2 +- proxy/vmess/inbound/inbound.go | 3 +- proxy/vmess/io/io_test.go | 3 +- proxy/vmess/io/reader.go | 2 +- tools/conf/blackhole.go | 3 +- tools/conf/common.go | 3 +- tools/conf/loader.go | 3 +- tools/conf/router.go | 2 +- tools/conf/shadowsocks.go | 3 +- tools/conf/socks.go | 3 +- tools/conf/transport.go | 3 +- tools/conf/transport_authenticators.go | 3 +- tools/conf/transport_internet.go | 3 +- tools/conf/v2ray.go | 5 +- tools/conf/vmess.go | 3 +- transport/internet/config.go | 3 +- transport/internet/dialer.go | 3 +- transport/internet/internal/sysfd.go | 2 +- transport/internet/kcp/connection.go | 3 +- transport/internet/tcp/dialer.go | 5 +- transport/internet/tcp/hub.go | 3 +- transport/internet/tcp_hub.go | 3 +- transport/internet/ws/connection.go | 2 +- transport/internet/ws/hub.go | 5 +- transport/internet/ws/stopablehttplistener.go | 2 +- transport/internet/ws/wsconn.go | 3 +- 65 files changed, 251 insertions(+), 132 deletions(-) create mode 100644 app/web/config.proto create mode 100644 app/web/file_server.go create mode 100644 app/web/web.go create mode 100644 common/errors/errors.go create mode 100644 common/serial/string.go diff --git a/app/dispatcher/impl/default.go b/app/dispatcher/impl/default.go index d4404b2da..1529c0aa7 100644 --- a/app/dispatcher/impl/default.go +++ b/app/dispatcher/impl/default.go @@ -1,11 +1,11 @@ package impl import ( - "errors" "v2ray.com/core/app" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/router" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/proxy" diff --git a/app/dns/server.go b/app/dns/server.go index 877080299..2a42f4512 100644 --- a/app/dns/server.go +++ b/app/dns/server.go @@ -1,13 +1,13 @@ package dns import ( - "errors" "net" "sync" "time" "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" diff --git a/app/proxy/proxy.go b/app/proxy/proxy.go index 04708ce00..e1e323627 100644 --- a/app/proxy/proxy.go +++ b/app/proxy/proxy.go @@ -1,13 +1,13 @@ package proxy import ( - "errors" "io" "net" "time" "v2ray.com/core/app" "v2ray.com/core/app/proxyman" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" diff --git a/app/router/config.go b/app/router/config.go index 2491e0dce..5f520a441 100644 --- a/app/router/config.go +++ b/app/router/config.go @@ -1,9 +1,9 @@ package router import ( - "errors" "net" + "v2ray.com/core/common/errors" v2net "v2ray.com/core/common/net" "v2ray.com/core/proxy" ) diff --git a/app/router/router.go b/app/router/router.go index 1d4fe5aef..6bae8df6b 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -1,10 +1,9 @@ package router import ( - "errors" - "v2ray.com/core/app" "v2ray.com/core/app/dns" + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" diff --git a/app/space.go b/app/space.go index 87977e470..9cd7846e6 100644 --- a/app/space.go +++ b/app/space.go @@ -1,9 +1,8 @@ package app import ( - "errors" - "v2ray.com/core/common" + "v2ray.com/core/common/errors" ) type ID int @@ -94,7 +93,7 @@ func (v *spaceImpl) BindApp(id ID, application Application) { func (v *spaceImpl) BindFromConfig(name string, config interface{}) error { factory, found := applicationFactoryCache[name] if !found { - return errors.New("Space: app not registered: " + name) + return errors.New("Space: app not registered: ", name) } app, err := factory.Create(v, config) if err != nil { diff --git a/app/web/config.proto b/app/web/config.proto new file mode 100644 index 000000000..0cc9209b5 --- /dev/null +++ b/app/web/config.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package v2ray.core.app.web; +option go_package = "web"; +option java_package = "com.v2ray.core.app.web"; +option java_outer_classname = "ConfigProto"; + +import "v2ray.com/core/common/loader/type.proto"; + +message FileServer { + message Entry { + oneof FileOrDir { + string File = 1; + string Directory = 2; + } + string path = 3; + } + + repeated Entry entry = 1; +} + +message Server { + repeated string domain = 1; + v2ray.core.common.loader.TypedSettings settings = 2; +} + +message Config { + repeated Server server = 1; +} \ No newline at end of file diff --git a/app/web/file_server.go b/app/web/file_server.go new file mode 100644 index 000000000..efb389526 --- /dev/null +++ b/app/web/file_server.go @@ -0,0 +1 @@ +package web diff --git a/app/web/web.go b/app/web/web.go new file mode 100644 index 000000000..d48ca9dce --- /dev/null +++ b/app/web/web.go @@ -0,0 +1,15 @@ +package web + +import ( + "v2ray.com/core/app" + "v2ray.com/core/common" +) + +const ( + APP_ID = app.ID(8) +) + +type Server interface { + common.Releasable + Handle() +} diff --git a/common/common.go b/common/common.go index d0b70ead8..dba9e8022 100644 --- a/common/common.go +++ b/common/common.go @@ -3,7 +3,7 @@ package common import ( - "errors" + "v2ray.com/core/common/errors" ) var ( diff --git a/common/errors/errors.go b/common/errors/errors.go new file mode 100644 index 000000000..890bd88a2 --- /dev/null +++ b/common/errors/errors.go @@ -0,0 +1,80 @@ +package errors + +import ( + "fmt" + "v2ray.com/core/common/serial" +) + +type HasInnerError interface { + Inner() error +} + +type Error struct { + message string + inner error +} + +func (v *Error) Error() string { + return v.message +} + +func (v *Error) Inner() error { + if v.inner == nil { + return nil + } + return v.inner +} + +func New(msg ...interface{}) error { + return &Error{ + message: serial.ToString(msg), + } +} + +func Base(err error) ErrorBuilder { + return ErrorBuilder{ + error: err, + } +} + +func Cause(err error) error { + if err == nil { + return nil + } + for { + inner, ok := err.(HasInnerError) + if !ok { + break + } + if inner.Inner() == nil { + break + } + err = inner.Inner() + } + return err +} + +type ErrorBuilder struct { + error +} + +func (v ErrorBuilder) Message(msg ...interface{}) error { + if v.error == nil { + return nil + } + + return &Error{ + message: serial.ToString(msg) + " > " + v.error.Error(), + inner: v.error, + } +} + +func (v ErrorBuilder) Format(format string, values ...interface{}) error { + if v.error == nil { + return nil + } + return &Error{ + message: fmt.Sprintf(format, values...) + " > " + v.error.Error(), + inner: v.error, + } +} diff --git a/common/io/buffered_writer.go b/common/io/buffered_writer.go index 892f0278c..d63912f06 100644 --- a/common/io/buffered_writer.go +++ b/common/io/buffered_writer.go @@ -4,6 +4,7 @@ import ( "io" "sync" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" ) type BufferedWriter struct { @@ -34,7 +35,7 @@ func (v *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { nBytes, err := v.buffer.FillFrom(reader) totalBytes += int64(nBytes) if err != nil { - if err == io.EOF { + if errors.Cause(err) == io.EOF { return totalBytes, nil } return totalBytes, err diff --git a/common/io/transport.go b/common/io/transport.go index e4a7f04f3..9bee868be 100644 --- a/common/io/transport.go +++ b/common/io/transport.go @@ -2,6 +2,7 @@ package io import ( "io" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" ) @@ -29,7 +30,7 @@ func Pipe(reader Reader, writer Writer) error { func PipeUntilEOF(reader Reader, writer Writer) error { err := Pipe(reader, writer) - if err != nil && err != io.EOF { + if err != nil && errors.Cause(err) != io.EOF { return err } return nil diff --git a/common/loader/type.go b/common/loader/type.go index 84349a5d5..8862f9099 100644 --- a/common/loader/type.go +++ b/common/loader/type.go @@ -1,10 +1,10 @@ package loader import ( - "errors" "reflect" "github.com/golang/protobuf/proto" + "v2ray.com/core/common/errors" ) func NewTypedSettings(message proto.Message) *TypedSettings { diff --git a/common/log/internal/log_entry.go b/common/log/internal/log_entry.go index c66849ed7..c9db04088 100644 --- a/common/log/internal/log_entry.go +++ b/common/log/internal/log_entry.go @@ -8,26 +8,6 @@ import ( "v2ray.com/core/common/serial" ) -func InterfaceToString(value interface{}) string { - if value == nil { - return " " - } - switch value := value.(type) { - case string: - return value - case *string: - return *value - case fmt.Stringer: - return value.String() - case error: - return value.Error() - case []byte: - return serial.BytesToHexString(value) - default: - return fmt.Sprintf("%+v", value) - } -} - type LogEntry interface { common.Releasable fmt.Stringer @@ -46,12 +26,7 @@ func (v *ErrorLog) Release() { } func (v *ErrorLog) String() string { - values := make([]string, len(v.Values)+1) - values[0] = v.Prefix - for i, value := range v.Values { - values[i+1] = InterfaceToString(value) - } - return strings.Join(values, "") + return v.Prefix + serial.Concat(v.Values...) } type AccessLog struct { @@ -68,5 +43,5 @@ func (v *AccessLog) Release() { } func (v *AccessLog) String() string { - return strings.Join([]string{InterfaceToString(v.From), v.Status, InterfaceToString(v.To), InterfaceToString(v.Reason)}, " ") + return strings.Join([]string{serial.ToString(v.From), v.Status, serial.ToString(v.To), serial.ToString(v.Reason)}, " ") } diff --git a/common/log/log.go b/common/log/log.go index c736996ff..a6d698a07 100644 --- a/common/log/log.go +++ b/common/log/log.go @@ -1,7 +1,7 @@ package log import ( - "errors" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log/internal" ) @@ -39,7 +39,7 @@ func SetLogLevel(level LogLevel) { func InitErrorLogger(file string) error { logger, err := internal.NewFileLogWriter(file) if err != nil { - return errors.New("Log:Failed to create error logger on file (" + file + "): " + err.Error()) + return errors.Base(err).Message("Log: Failed to create error logger on file (", file, ")") } streamLoggerInstance = logger return nil diff --git a/common/net/port.go b/common/net/port.go index 185442cc1..fcb1f4484 100644 --- a/common/net/port.go +++ b/common/net/port.go @@ -1,9 +1,9 @@ package net import ( - "errors" "strconv" + "v2ray.com/core/common/errors" "v2ray.com/core/common/serial" ) diff --git a/common/protocol/errors.go b/common/protocol/errors.go index 292114f01..a0ff515b6 100644 --- a/common/protocol/errors.go +++ b/common/protocol/errors.go @@ -1,7 +1,7 @@ package protocol import ( - "errors" + "v2ray.com/core/common/errors" ) var ( diff --git a/common/protocol/id.go b/common/protocol/id.go index 9c74ce445..c50c631e4 100644 --- a/common/protocol/id.go +++ b/common/protocol/id.go @@ -3,9 +3,9 @@ package protocol import ( "crypto/hmac" "crypto/md5" - "errors" "hash" + "v2ray.com/core/common/errors" "v2ray.com/core/common/uuid" ) diff --git a/common/protocol/user.go b/common/protocol/user.go index abc204468..f2e09659c 100644 --- a/common/protocol/user.go +++ b/common/protocol/user.go @@ -1,7 +1,7 @@ package protocol import ( - "errors" + "v2ray.com/core/common/errors" ) var ( @@ -26,7 +26,7 @@ func (v *User) GetTypedAccount() (Account, error) { if account, ok := rawAccount.(Account); ok { return account, nil } - return nil, errors.New("Unknown account type: " + v.Account.Type) + return nil, errors.New("Unknown account type: ", v.Account.Type) } func (v *User) GetSettings() UserSettings { diff --git a/common/retry/retry.go b/common/retry/retry.go index e8dae5837..55288a421 100644 --- a/common/retry/retry.go +++ b/common/retry/retry.go @@ -1,8 +1,8 @@ package retry import ( - "errors" "time" + "v2ray.com/core/common/errors" ) var ( diff --git a/common/retry/retry_test.go b/common/retry/retry_test.go index 399a2da5a..8448e35f3 100644 --- a/common/retry/retry_test.go +++ b/common/retry/retry_test.go @@ -1,10 +1,10 @@ package retry_test import ( - "errors" "testing" "time" + "v2ray.com/core/common/errors" . "v2ray.com/core/common/retry" "v2ray.com/core/testing/assert" ) diff --git a/common/serial/string.go b/common/serial/string.go new file mode 100644 index 000000000..ef9ae61ba --- /dev/null +++ b/common/serial/string.go @@ -0,0 +1,35 @@ +package serial + +import ( + "fmt" + "strings" +) + +func ToString(v interface{}) string { + if v == nil { + return " " + } + + switch value := v.(type) { + case string: + return value + case *string: + return *value + case fmt.Stringer: + return value.String() + case error: + return value.Error() + case []byte: + return BytesToHexString(value) + default: + return fmt.Sprintf("%+v", value) + } +} + +func Concat(v ...interface{}) string { + values := make([]string, len(v)) + for i, value := range v { + values[i] = ToString(value) + } + return strings.Join(values, "") +} diff --git a/common/uuid/uuid.go b/common/uuid/uuid.go index 77170d90b..102cf12b0 100644 --- a/common/uuid/uuid.go +++ b/common/uuid/uuid.go @@ -5,7 +5,7 @@ import ( "crypto/md5" "crypto/rand" "encoding/hex" - "errors" + "v2ray.com/core/common/errors" ) var ( diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 8a99e5714..dad683225 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -3,10 +3,10 @@ package dokodemo import ( "sync" - "errors" "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" diff --git a/proxy/errors.go b/proxy/errors.go index 4bee33a0a..e4dca0069 100644 --- a/proxy/errors.go +++ b/proxy/errors.go @@ -1,7 +1,7 @@ package proxy import ( - "errors" + "v2ray.com/core/common/errors" ) var ( diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 6f147df25..6fdbe7919 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -1,12 +1,12 @@ package freedom import ( - "errors" "io" "v2ray.com/core/app" "v2ray.com/core/app/dns" "v2ray.com/core/common/alloc" "v2ray.com/core/common/dice" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" diff --git a/proxy/http/server.go b/proxy/http/server.go index 4a5d19c0e..4558f586f 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -12,6 +12,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/common" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" @@ -101,7 +102,7 @@ func (v *Server) handleConnection(conn internet.Connection) { request, err := http.ReadRequest(reader) if err != nil { - if err != io.EOF { + if errors.Cause(err) != io.EOF { log.Warning("HTTP: Failed to read http request: ", err) } return diff --git a/proxy/registry/handler_cache.go b/proxy/registry/handler_cache.go index 14421ecb0..ca2a0b142 100644 --- a/proxy/registry/handler_cache.go +++ b/proxy/registry/handler_cache.go @@ -1,10 +1,9 @@ package registry import ( - "errors" - "v2ray.com/core/app" "v2ray.com/core/common" + "v2ray.com/core/common/errors" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" ) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 096f8ae0e..39f917ed0 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -111,7 +111,7 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer, responseReader, err := ReadTCPResponse(user, conn) if err != nil { - log.Warning("Shadowsocks|Client: Failed to read response: " + err.Error()) + log.Warning("Shadowsocks|Client: Failed to read response: ", err) return } diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 468ce89ec..48df6b1c0 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -4,9 +4,8 @@ import ( "bytes" "crypto/cipher" "crypto/md5" - "errors" - "v2ray.com/core/common/crypto" + "v2ray.com/core/common/errors" "v2ray.com/core/common/protocol" ) @@ -41,7 +40,7 @@ func (v *Account) GetCipher() (Cipher, error) { func (v *Account) AsAccount() (protocol.Account, error) { cipher, err := v.GetCipher() if err != nil { - return nil, err + return nil, errors.Base(err).Message("Shadowsocks|Account: Failed to get cipher.") } return &ShadowsocksAccount{ Cipher: cipher, diff --git a/proxy/shadowsocks/ota.go b/proxy/shadowsocks/ota.go index 65090d419..6729800d9 100644 --- a/proxy/shadowsocks/ota.go +++ b/proxy/shadowsocks/ota.go @@ -4,9 +4,9 @@ import ( "bytes" "crypto/hmac" "crypto/sha1" - "errors" "io" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" "v2ray.com/core/common/serial" ) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 4c8d11419..1b41dc56f 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -3,11 +3,10 @@ package shadowsocks import ( "bytes" "crypto/rand" - "errors" "io" - "v2ray.com/core/common/alloc" "v2ray.com/core/common/crypto" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" @@ -25,7 +24,7 @@ const ( func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHeader, v2io.Reader, error) { rawAccount, err := user.GetTypedAccount() if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to parse account: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to parse account.") } account := rawAccount.(*ShadowsocksAccount) @@ -35,14 +34,14 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea ivLen := account.Cipher.IVSize() _, err = io.ReadFull(reader, buffer.Value[:ivLen]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read IV: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IV.") } iv := append([]byte(nil), buffer.Value[:ivLen]...) stream, err := account.Cipher.NewDecodingStream(account.Key, iv) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to initialize decoding stream: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to initialize decoding stream.") } reader = crypto.NewCryptionReader(stream, reader) @@ -56,7 +55,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea lenBuffer := 1 _, err = io.ReadFull(reader, buffer.Value[:1]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read address type: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read address type.") } addrType := (buffer.Value[0] & 0x0F) @@ -76,32 +75,32 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea case AddrTypeIPv4: _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+4]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read IPv4 address: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv4 address.") } request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+4]) lenBuffer += 4 case AddrTypeIPv6: _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+16]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read IPv6 address: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv6 address.") } request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+16]) lenBuffer += 16 case AddrTypeDomain: _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+1]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read domain lenth: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain lenth.") } domainLength := int(buffer.Value[lenBuffer]) lenBuffer++ _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+domainLength]) if err != nil { - return nil, nil, errors.New("Shadowsocks|TCP: Failed to read domain: " + err.Error()) + return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain.") } request.Address = v2net.DomainAddress(string(buffer.Value[lenBuffer : lenBuffer+domainLength])) lenBuffer += domainLength default: - return nil, nil, errors.New("Shadowsocks|TCP: Unknown address type.") + return nil, nil, errors.New("Shadowsocks|TCP: Unknown address type: ", addrType) } _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+2]) @@ -139,7 +138,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr user := request.User rawAccount, err := user.GetTypedAccount() if err != nil { - return nil, errors.New("Shadowsocks|TCP: Failed to parse account: " + err.Error()) + return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to parse account.") } account := rawAccount.(*ShadowsocksAccount) @@ -147,12 +146,12 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr rand.Read(iv) _, err = writer.Write(iv) if err != nil { - return nil, errors.New("Shadowsocks|TCP: Failed to write IV: " + err.Error()) + return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to write IV.") } stream, err := account.Cipher.NewEncodingStream(account.Key, iv) if err != nil { - return nil, errors.New("Shadowsocks|TCP: Failed to create encoding stream: " + err.Error()) + return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to create encoding stream.") } writer = crypto.NewCryptionWriter(stream, writer) @@ -170,7 +169,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr header.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) header.Append([]byte(request.Address.Domain())) default: - return nil, errors.New("Shadowsocks|TCP: Unsupported address type. ") + return nil, errors.New("Shadowsocks|TCP: Unsupported address type: ", request.Address.Family()) } header.AppendUint16(uint16(request.Port)) @@ -184,7 +183,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr _, err = writer.Write(header.Value) if err != nil { - return nil, errors.New("Shadowsocks|TCP: Failed to write header: " + err.Error()) + return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to write header.") } var chunkWriter v2io.Writer diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index 92dd2f998..55da3d1b0 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -3,12 +3,11 @@ package shadowsocks import ( "sync" - - "errors" "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/common" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" diff --git a/proxy/socks/protocol/socks.go b/proxy/socks/protocol/socks.go index ee81684aa..ecd6fc6ce 100644 --- a/proxy/socks/protocol/socks.go +++ b/proxy/socks/protocol/socks.go @@ -1,10 +1,10 @@ package protocol import ( - "errors" "fmt" "io" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/proxy" diff --git a/proxy/socks/protocol/socks4.go b/proxy/socks/protocol/socks4.go index f9ebbbd1e..7bb0ed4eb 100644 --- a/proxy/socks/protocol/socks4.go +++ b/proxy/socks/protocol/socks4.go @@ -1,9 +1,8 @@ package protocol import ( - "errors" "io" - + "v2ray.com/core/common/errors" v2net "v2ray.com/core/common/net" ) diff --git a/proxy/socks/protocol/udp.go b/proxy/socks/protocol/udp.go index 9fd053397..51d9fdd61 100644 --- a/proxy/socks/protocol/udp.go +++ b/proxy/socks/protocol/udp.go @@ -1,9 +1,9 @@ package protocol import ( - "errors" "fmt" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2net "v2ray.com/core/common/net" ) diff --git a/proxy/socks/server.go b/proxy/socks/server.go index ed960d986..3152aee44 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -1,13 +1,13 @@ package socks import ( - "errors" "io" "sync" "time" "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" @@ -112,8 +112,8 @@ func (v *Server) handleConnection(connection internet.Connection) { defer writer.Release() auth, auth4, err := protocol.ReadAuthentication(reader) - if err != nil && err != protocol.Socks4Downgrade { - if err != io.EOF { + if err != nil && errors.Cause(err) != protocol.Socks4Downgrade { + if errors.Cause(err) != io.EOF { log.Warning("Socks: failed to read authentication: ", err) } return diff --git a/proxy/vmess/encoding/commands.go b/proxy/vmess/encoding/commands.go index e0c0b9121..1a888fa00 100644 --- a/proxy/vmess/encoding/commands.go +++ b/proxy/vmess/encoding/commands.go @@ -1,10 +1,10 @@ package encoding import ( - "errors" "io" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" diff --git a/proxy/vmess/encoding/server.go b/proxy/vmess/encoding/server.go index e51e4d72e..261932db9 100644 --- a/proxy/vmess/encoding/server.go +++ b/proxy/vmess/encoding/server.go @@ -2,10 +2,10 @@ package encoding import ( "crypto/md5" - "errors" "hash/fnv" "io" "v2ray.com/core/common/crypto" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 155be1134..88da6601b 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -9,6 +9,7 @@ import ( "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" @@ -154,7 +155,7 @@ func (v *VMessInboundHandler) HandleConnection(connection internet.Connection) { v.RUnlock() if err != nil { - if err != io.EOF { + if errors.Cause(err) != io.EOF { log.Access(connection.RemoteAddr(), "", log.AccessRejected, err) log.Info("VMessIn: Invalid request from ", connection.RemoteAddr(), ": ", err) } diff --git a/proxy/vmess/io/io_test.go b/proxy/vmess/io/io_test.go index ae3e83ee5..4bb8363bb 100644 --- a/proxy/vmess/io/io_test.go +++ b/proxy/vmess/io/io_test.go @@ -7,6 +7,7 @@ import ( "testing" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" v2io "v2ray.com/core/common/io" . "v2ray.com/core/proxy/vmess/io" "v2ray.com/core/testing/assert" @@ -68,7 +69,7 @@ func TestLargeIO(t *testing.T) { reader := NewAuthChunkReader(chunckContent) for { buffer, err := reader.Read() - if err == io.EOF { + if errors.Cause(err) == io.EOF { break } assert.Error(err).IsNil() diff --git a/proxy/vmess/io/reader.go b/proxy/vmess/io/reader.go index 01943d1b1..92ad184b7 100644 --- a/proxy/vmess/io/reader.go +++ b/proxy/vmess/io/reader.go @@ -1,11 +1,11 @@ package io import ( - "errors" "hash" "hash/fnv" "io" "v2ray.com/core/common/alloc" + "v2ray.com/core/common/errors" "v2ray.com/core/common/serial" ) diff --git a/tools/conf/blackhole.go b/tools/conf/blackhole.go index 9178671ba..34f06c8cd 100644 --- a/tools/conf/blackhole.go +++ b/tools/conf/blackhole.go @@ -2,8 +2,7 @@ package conf import ( "encoding/json" - "errors" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/proxy/blackhole" ) diff --git a/tools/conf/common.go b/tools/conf/common.go index 2f309902e..28fa293b9 100644 --- a/tools/conf/common.go +++ b/tools/conf/common.go @@ -2,9 +2,8 @@ package conf import ( "encoding/json" - "errors" - "strings" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" diff --git a/tools/conf/loader.go b/tools/conf/loader.go index 1ff5e461f..5dd312876 100644 --- a/tools/conf/loader.go +++ b/tools/conf/loader.go @@ -2,9 +2,8 @@ package conf import ( "encoding/json" - "errors" - "v2ray.com/core/common" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" ) diff --git a/tools/conf/router.go b/tools/conf/router.go index 1a89f8937..7395c8850 100644 --- a/tools/conf/router.go +++ b/tools/conf/router.go @@ -2,11 +2,11 @@ package conf import ( "encoding/json" - "errors" "strconv" "strings" "v2ray.com/core/app/router" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/tools/geoip" diff --git a/tools/conf/shadowsocks.go b/tools/conf/shadowsocks.go index d3360800f..f48452aa0 100644 --- a/tools/conf/shadowsocks.go +++ b/tools/conf/shadowsocks.go @@ -1,9 +1,8 @@ package conf import ( - "errors" "strings" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy/shadowsocks" diff --git a/tools/conf/socks.go b/tools/conf/socks.go index a46b20e96..1bbf06322 100644 --- a/tools/conf/socks.go +++ b/tools/conf/socks.go @@ -2,8 +2,7 @@ package conf import ( "encoding/json" - "errors" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy/socks" diff --git a/tools/conf/transport.go b/tools/conf/transport.go index ea33bef79..863459f31 100644 --- a/tools/conf/transport.go +++ b/tools/conf/transport.go @@ -1,8 +1,7 @@ package conf import ( - "errors" - + "v2ray.com/core/common/errors" v2net "v2ray.com/core/common/net" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" diff --git a/tools/conf/transport_authenticators.go b/tools/conf/transport_authenticators.go index 48d67b614..109ebda17 100644 --- a/tools/conf/transport_authenticators.go +++ b/tools/conf/transport_authenticators.go @@ -1,8 +1,7 @@ package conf import ( - "errors" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/transport/internet/authenticators/http" "v2ray.com/core/transport/internet/authenticators/noop" diff --git a/tools/conf/transport_internet.go b/tools/conf/transport_internet.go index acc39a7d6..41488a2e3 100644 --- a/tools/conf/transport_internet.go +++ b/tools/conf/transport_internet.go @@ -2,11 +2,10 @@ package conf import ( "encoding/json" - "errors" "fmt" "io/ioutil" - "strings" + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" v2net "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" diff --git a/tools/conf/v2ray.go b/tools/conf/v2ray.go index 0929531a5..f1e0b4a79 100644 --- a/tools/conf/v2ray.go +++ b/tools/conf/v2ray.go @@ -2,11 +2,10 @@ package conf import ( "encoding/json" - "errors" - "strings" - "io" + "strings" "v2ray.com/core" + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" v2net "v2ray.com/core/common/net" ) diff --git a/tools/conf/vmess.go b/tools/conf/vmess.go index 15f99aadd..cfd3e7df5 100644 --- a/tools/conf/vmess.go +++ b/tools/conf/vmess.go @@ -2,8 +2,7 @@ package conf import ( "encoding/json" - "errors" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" diff --git a/transport/internet/config.go b/transport/internet/config.go index 228c2d2af..e97b9c103 100644 --- a/transport/internet/config.go +++ b/transport/internet/config.go @@ -1,8 +1,7 @@ package internet import ( - "errors" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/loader" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" diff --git a/transport/internet/dialer.go b/transport/internet/dialer.go index 14cb8a5f5..20b5c5283 100644 --- a/transport/internet/dialer.go +++ b/transport/internet/dialer.go @@ -1,9 +1,8 @@ package internet import ( - "errors" "net" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" ) diff --git a/transport/internet/internal/sysfd.go b/transport/internet/internal/sysfd.go index d104f6661..bf0f6493b 100644 --- a/transport/internet/internal/sysfd.go +++ b/transport/internet/internal/sysfd.go @@ -1,9 +1,9 @@ package internal import ( - "errors" "net" "reflect" + "v2ray.com/core/common/errors" ) var ( diff --git a/transport/internet/kcp/connection.go b/transport/internet/kcp/connection.go index ae8bbf642..1162ddb35 100644 --- a/transport/internet/kcp/connection.go +++ b/transport/internet/kcp/connection.go @@ -1,13 +1,12 @@ package kcp import ( - "errors" "io" "net" "sync" "sync/atomic" "time" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/predicate" "v2ray.com/core/transport/internet" diff --git a/transport/internet/tcp/dialer.go b/transport/internet/tcp/dialer.go index bfe7e51dc..0a82aee06 100644 --- a/transport/internet/tcp/dialer.go +++ b/transport/internet/tcp/dialer.go @@ -1,10 +1,9 @@ package tcp import ( - "errors" - "net" - "crypto/tls" + "net" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" diff --git a/transport/internet/tcp/hub.go b/transport/internet/tcp/hub.go index f61d5212a..811978c19 100644 --- a/transport/internet/tcp/hub.go +++ b/transport/internet/tcp/hub.go @@ -2,11 +2,10 @@ package tcp import ( "crypto/tls" - "errors" "net" "sync" "time" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" diff --git a/transport/internet/tcp_hub.go b/transport/internet/tcp_hub.go index 6dbff3bf0..5ad802ca7 100644 --- a/transport/internet/tcp_hub.go +++ b/transport/internet/tcp_hub.go @@ -1,10 +1,9 @@ package internet import ( - "errors" "net" "sync" - + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/retry" diff --git a/transport/internet/ws/connection.go b/transport/internet/ws/connection.go index 069596e24..be52c2831 100644 --- a/transport/internet/ws/connection.go +++ b/transport/internet/ws/connection.go @@ -1,10 +1,10 @@ package ws import ( - "errors" "io" "net" "time" + "v2ray.com/core/common/errors" ) var ( diff --git a/transport/internet/ws/hub.go b/transport/internet/ws/hub.go index e8eda5ac1..2b8e63d5e 100644 --- a/transport/internet/ws/hub.go +++ b/transport/internet/ws/hub.go @@ -2,18 +2,19 @@ package ws import ( "crypto/tls" - "errors" "net" "net/http" "strconv" "sync" "time" - "github.com/gorilla/websocket" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" v2net "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" v2tls "v2ray.com/core/transport/internet/tls" + + "github.com/gorilla/websocket" ) var ( diff --git a/transport/internet/ws/stopablehttplistener.go b/transport/internet/ws/stopablehttplistener.go index 99ff3a24b..b8571d955 100644 --- a/transport/internet/ws/stopablehttplistener.go +++ b/transport/internet/ws/stopablehttplistener.go @@ -1,8 +1,8 @@ package ws import ( - "errors" "net" + "v2ray.com/core/common/errors" ) type StoppableListener struct { diff --git a/transport/internet/ws/wsconn.go b/transport/internet/ws/wsconn.go index 2e310002c..b63dd93ee 100644 --- a/transport/internet/ws/wsconn.go +++ b/transport/internet/ws/wsconn.go @@ -8,6 +8,7 @@ import ( "time" "github.com/gorilla/websocket" + "v2ray.com/core/common/errors" "v2ray.com/core/common/log" ) @@ -64,7 +65,7 @@ func (ws *wsconn) readNext(b []byte) (n int, err error) { return n, err } - if err == io.EOF { + if errors.Cause(err) == io.EOF { ws.readBuffer = nil if n == 0 { return ws.readNext(b)