From 9d7f43a299efab3f7f2efb7d60edb275aafe992d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 11 Apr 2018 16:15:29 +0200 Subject: [PATCH] fix lint errors --- common/buf/writer.go | 7 ++- common/common.go | 5 ++ common/crypto/auth.go | 3 +- common/crypto/io.go | 5 +- common/protocol/address.go | 98 +++++++++++++++++++---------------- common/signal/exec.go | 10 ++++ common/signal/task.go | 6 ++- common/uuid/uuid.go | 4 +- proxy/http/server.go | 3 +- proxy/shadowsocks/protocol.go | 9 ++-- proxy/socks/server.go | 3 +- 11 files changed, 87 insertions(+), 66 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 05798cf8b..7d1438bb1 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -3,6 +3,7 @@ package buf import ( "io" + "v2ray.com/core/common" "v2ray.com/core/common/errors" ) @@ -23,8 +24,7 @@ func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error { defer mb.Release() bs := mb.ToNetBuffers() - _, err := bs.WriteTo(w.Writer) - return err + return common.Error2(bs.WriteTo(w.Writer)) } // ReadFrom implements io.ReaderFrom. @@ -52,8 +52,7 @@ func NewBufferedWriter(writer Writer) *BufferedWriter { // WriteByte implements io.ByteWriter. func (w *BufferedWriter) WriteByte(c byte) error { - _, err := w.Write([]byte{c}) - return err + return common.Error2(w.Write([]byte{c})) } // Write implements io.Writer. diff --git a/common/common.go b/common/common.go index 5ab6a7704..2f58ba7f2 100644 --- a/common/common.go +++ b/common/common.go @@ -16,3 +16,8 @@ func Must2(v interface{}, err error) interface{} { Must(err) return v } + +// Error2 returns the err from the 2nd parameter. +func Error2(v interface{}, err error) error { + return err +} diff --git a/common/crypto/auth.go b/common/crypto/auth.go index 1f3a68f17..d70e994fe 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -113,8 +113,7 @@ func (r *AuthenticationReader) readSize() (int32, error) { return s, nil } sizeBytes := make([]byte, r.sizeParser.SizeBytes()) - _, err := io.ReadFull(r.reader, sizeBytes) - if err != nil { + if _, err := io.ReadFull(r.reader, sizeBytes); err != nil { return 0, err } size, err := r.sizeParser.Decode(sizeBytes) diff --git a/common/crypto/io.go b/common/crypto/io.go index 295ba4725..3bd33527b 100644 --- a/common/crypto/io.go +++ b/common/crypto/io.go @@ -4,6 +4,7 @@ import ( "crypto/cipher" "io" + "v2ray.com/core/common" "v2ray.com/core/common/buf" ) @@ -50,6 +51,7 @@ func (w *CryptionWriter) Write(data []byte) (int, error) { return w.writer.Write(data) } +// WriteMultiBuffer implements buf.Writer. func (w *CryptionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { defer mb.Release() @@ -57,6 +59,5 @@ func (w *CryptionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { for _, b := range bs { w.stream.XORKeyStream(b, b) } - _, err := bs.WriteTo(w.writer) - return err + return common.Error2(bs.WriteTo(w.writer)) } diff --git a/common/protocol/address.go b/common/protocol/address.go index 83437e0ca..db5d6ad0b 100644 --- a/common/protocol/address.go +++ b/common/protocol/address.go @@ -3,8 +3,10 @@ package protocol import ( "io" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" + "v2ray.com/core/common/signal" ) type AddressOption func(*AddressParser) @@ -30,6 +32,7 @@ func WithAddressTypeParser(atp AddressTypeParser) AddressOption { } } +// AddressParser is a utility for reading and writer addresses. type AddressParser struct { addrTypeMap map[byte]net.AddressFamily addrByteMap map[net.AddressFamily]byte @@ -37,6 +40,7 @@ type AddressParser struct { typeParser AddressTypeParser } +// NewAddressParser creates a new AddressParser func NewAddressParser(options ...AddressOption) *AddressParser { p := &AddressParser{ addrTypeMap: make(map[byte]net.AddressFamily, 8), @@ -118,30 +122,42 @@ func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Addres } } +// ReadAddressPort reads address and port from the given input. func (p *AddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (net.Address, net.Port, error) { if buffer == nil { buffer = buf.New() defer buffer.Release() } + var addr net.Address + var port net.Port + + pTask := func() error { + lp, err := p.readPort(buffer, input) + if err != nil { + return err + } + port = lp + return nil + } + + aTask := func() error { + a, err := p.readAddress(buffer, input) + if err != nil { + return err + } + addr = a + return nil + } + + var err error + if p.portFirst { - port, err := p.readPort(buffer, input) - if err != nil { - return nil, 0, err - } - addr, err := p.readAddress(buffer, input) - if err != nil { - return nil, 0, err - } - return addr, port, nil + err = signal.Execute(pTask, aTask) + } else { + err = signal.Execute(aTask, pTask) } - addr, err := p.readAddress(buffer, input) - if err != nil { - return nil, 0, err - } - - port, err := p.readPort(buffer, input) if err != nil { return nil, 0, err } @@ -150,8 +166,7 @@ func (p *AddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (ne } func (p *AddressParser) writePort(writer io.Writer, port net.Port) error { - _, err := writer.Write(port.Bytes(nil)) - return err + return common.Error2(writer.Write(port.Bytes(nil))) } func (p *AddressParser) writeAddress(writer io.Writer, address net.Address) error { @@ -162,43 +177,38 @@ func (p *AddressParser) writeAddress(writer io.Writer, address net.Address) erro switch address.Family() { case net.AddressFamilyIPv4, net.AddressFamilyIPv6: - if _, err := writer.Write([]byte{tb}); err != nil { - return err - } - if _, err := writer.Write(address.IP()); err != nil { - return err - } + return signal.Execute(func() error { + return common.Error2(writer.Write([]byte{tb})) + }, func() error { + return common.Error2(writer.Write(address.IP())) + }) case net.AddressFamilyDomain: domain := address.Domain() if isDomainTooLong(domain) { return newError("Super long domain is not supported: ", domain) } - if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil { - return err - } - if _, err := writer.Write([]byte(domain)); err != nil { - return err - } + return signal.Execute(func() error { + return common.Error2(writer.Write([]byte{tb, byte(len(domain))})) + }, func() error { + return common.Error2(writer.Write([]byte(domain))) + }) + default: + panic("Unknown family type.") } - return nil } +// WriteAddressPort writes address and port into the given writer. func (p *AddressParser) WriteAddressPort(writer io.Writer, addr net.Address, port net.Port) error { - if p.portFirst { - if err := p.writePort(writer, port); err != nil { - return err - } - if err := p.writeAddress(writer, addr); err != nil { - return err - } - return nil + pTask := func() error { + return p.writePort(writer, port) + } + aTask := func() error { + return p.writeAddress(writer, addr) } - if err := p.writeAddress(writer, addr); err != nil { - return err + if p.portFirst { + return signal.Execute(pTask, aTask) } - if err := p.writePort(writer, port); err != nil { - return err - } - return nil + + return signal.Execute(aTask, pTask) } diff --git a/common/signal/exec.go b/common/signal/exec.go index 0547a607d..632253cfc 100644 --- a/common/signal/exec.go +++ b/common/signal/exec.go @@ -12,6 +12,16 @@ func executeAndFulfill(f func() error, done chan<- error) { close(done) } +// Execute runs a list of tasks sequentially, returns the first error encountered or nil if all tasks pass. +func Execute(tasks ...func() error) error { + for _, task := range tasks { + if err := task(); err != nil { + return err + } + } + return nil +} + // ExecuteAsync executes a function asynchronously and return its result. func ExecuteAsync(f func() error) <-chan error { done := make(chan error, 1) diff --git a/common/signal/task.go b/common/signal/task.go index 36e0a1f4e..11f98c4af 100644 --- a/common/signal/task.go +++ b/common/signal/task.go @@ -11,6 +11,8 @@ type PeriodicTask struct { Interval time.Duration // Execute is the task function Execute func() error + // OnFailure will be called when Execute returns non-nil error + OnError func(error) access sync.Mutex timer *time.Timer @@ -30,7 +32,9 @@ func (t *PeriodicTask) checkedExecute() error { } t.timer = time.AfterFunc(t.Interval, func() { - t.checkedExecute() + if err := t.checkedExecute(); err != nil && t.OnError != nil { + t.OnError(err) + } }) return nil diff --git a/common/uuid/uuid.go b/common/uuid/uuid.go index 1f3a8342f..788b7346b 100755 --- a/common/uuid/uuid.go +++ b/common/uuid/uuid.go @@ -94,9 +94,7 @@ func ParseString(str string) (UUID, error) { text = text[1:] } - _, err := hex.Decode(b[:byteGroup/2], text[:byteGroup]) - - if err != nil { + if _, err := hex.Decode(b[:byteGroup/2], text[:byteGroup]); err != nil { return uuid, err } diff --git a/proxy/http/server.go b/proxy/http/server.go index ffc7a1bc5..495a0865f 100755 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -116,8 +116,7 @@ Start: if len(s.config.Accounts) > 0 { user, pass, ok := parseBasicAuth(request.Header.Get("Proxy-Authorization")) if !ok || !s.config.HasAccount(user, pass) { - _, err := conn.Write([]byte("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"proxy\"\r\n\r\n")) - return err + return common.Error2(conn.Write([]byte("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"proxy\"\r\n\r\n"))) } } diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 9a86c958f..939cd9cbb 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -138,8 +138,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) common.Must2(rand.Read(iv)) - _, err = writer.Write(iv) - if err != nil { + if _, err = writer.Write(iv); err != nil { return nil, newError("failed to write IV") } } @@ -186,8 +185,7 @@ func ReadTCPResponse(user *protocol.User, reader io.Reader) (buf.Reader, error) var iv []byte if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) - _, err = io.ReadFull(reader, iv) - if err != nil { + if _, err = io.ReadFull(reader, iv); err != nil { return nil, newError("failed to read IV").Base(err) } } @@ -207,8 +205,7 @@ func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Wr if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) common.Must2(rand.Read(iv)) - _, err = writer.Write(iv) - if err != nil { + if _, err = writer.Write(iv); err != nil { return nil, newError("failed to write IV.").Base(err) } } diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 314fd30ef..c89648afd 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -122,8 +122,7 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa func (*Server) handleUDP(c io.Reader) error { // The TCP connection closes after this method returns. We need to wait until // the client closes it. - _, err := io.Copy(buf.DiscardBytes, c) - return err + return common.Error2(io.Copy(buf.DiscardBytes, c)) } func (s *Server) transport(ctx context.Context, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher core.Dispatcher) error {