github.com/cloudwego/kitex@v0.9.0/pkg/remote/trans/gonet/conn_extension.go (about) 1 /* 2 * Copyright 2022 CloudWeGo Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package gonet 18 19 import ( 20 "context" 21 "errors" 22 "io" 23 "net" 24 "strings" 25 "syscall" 26 27 "github.com/cloudwego/netpoll" 28 29 "github.com/cloudwego/kitex/pkg/remote" 30 "github.com/cloudwego/kitex/pkg/remote/trans" 31 "github.com/cloudwego/kitex/pkg/rpcinfo" 32 ) 33 34 // NewGonetExtension to build new gonetConnExtension which implements trans.Extension 35 func NewGonetExtension() trans.Extension { 36 return &gonetConnExtension{} 37 } 38 39 type gonetConnExtension struct{} 40 41 // SetReadTimeout implements the trans.Extension interface. 42 func (e *gonetConnExtension) SetReadTimeout(ctx context.Context, conn net.Conn, cfg rpcinfo.RPCConfig, role remote.RPCRole) { 43 // Do nothing. 44 } 45 46 // NewWriteByteBuffer implements the trans.Extension interface. 47 func (e *gonetConnExtension) NewWriteByteBuffer(ctx context.Context, conn net.Conn, msg remote.Message) remote.ByteBuffer { 48 return NewBufferWriter(conn) 49 } 50 51 // NewReadByteBuffer implements the trans.Extension interface. 52 func (e *gonetConnExtension) NewReadByteBuffer(ctx context.Context, conn net.Conn, msg remote.Message) remote.ByteBuffer { 53 return NewBufferReader(conn) 54 } 55 56 // ReleaseBuffer implements the trans.Extension interface. 57 func (e *gonetConnExtension) ReleaseBuffer(buffer remote.ByteBuffer, err error) error { 58 if buffer != nil { 59 return buffer.Release(err) 60 } 61 return nil 62 } 63 64 // IsTimeoutErr implements the trans.Extension interface. 65 func (e *gonetConnExtension) IsTimeoutErr(err error) bool { 66 if err != nil { 67 if nerr, ok := err.(net.Error); ok { 68 return nerr.Timeout() 69 } 70 } 71 return false 72 } 73 74 // IsRemoteClosedErr implements the trans.Extension interface. 75 func (e *gonetConnExtension) IsRemoteClosedErr(err error) bool { 76 if err == nil { 77 return false 78 } 79 // strings.Contains(err.Error(), "closed network connection") change to errors.Is(err, net.ErrClosed) 80 // when support go version >= 1.16 81 return errors.Is(err, netpoll.ErrConnClosed) || 82 errors.Is(err, io.EOF) || 83 errors.Is(err, syscall.EPIPE) || 84 strings.Contains(err.Error(), "closed network connection") 85 }