github.com/cloudwego/kitex@v0.9.0/pkg/remote/trans/invoke/message.go (about) 1 /* 2 * Copyright 2021 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 invoke 18 19 import ( 20 "errors" 21 "net" 22 "time" 23 24 "github.com/cloudwego/netpoll" 25 26 "github.com/cloudwego/kitex/pkg/remote" 27 internal_netpoll "github.com/cloudwego/kitex/pkg/remote/trans/netpoll" 28 ) 29 30 var _ Message = &message{} 31 32 // PayloadHandler is used to operate the payload. 33 type PayloadHandler interface { 34 SetRequestBytes(buf []byte) error 35 GetResponseBytes() ([]byte, error) 36 GetRequestReaderByteBuffer() remote.ByteBuffer 37 GetResponseWriterByteBuffer() remote.ByteBuffer 38 Release() error 39 } 40 41 // Message is the core abstraction. 42 type Message interface { 43 net.Conn 44 PayloadHandler 45 } 46 47 type message struct { 48 localAddr net.Addr 49 remoteAddr net.Addr 50 request remote.ByteBuffer 51 response remote.ByteBuffer 52 } 53 54 // NewMessage creates a new Message using the given net.addr. 55 func NewMessage(local, remote net.Addr) Message { 56 return &message{ 57 localAddr: local, 58 remoteAddr: remote, 59 } 60 } 61 62 // Read implements the Message interface. 63 func (f *message) Read(b []byte) (n int, err error) { 64 return 0, nil 65 } 66 67 // Write implements the Message interface. 68 func (f *message) Write(b []byte) (n int, err error) { 69 return 0, nil 70 } 71 72 // Close implements the Message interface. 73 func (f *message) Close() error { 74 return nil 75 } 76 77 // LocalAddr implements the Message interface. 78 func (f *message) LocalAddr() net.Addr { 79 return f.localAddr 80 } 81 82 // RemoteAddr implements the Message interface. 83 func (f *message) RemoteAddr() net.Addr { 84 return f.remoteAddr 85 } 86 87 // SetDeadline implements the Message interface. 88 func (f *message) SetDeadline(t time.Time) error { 89 return nil 90 } 91 92 // SetReadDeadline implements the Message interface. 93 func (f *message) SetReadDeadline(t time.Time) error { 94 return nil 95 } 96 97 // SetWriteDeadline implements the Message interface. 98 func (f *message) SetWriteDeadline(t time.Time) error { 99 return nil 100 } 101 102 // SetRequestBytes implements the Message interface. 103 func (f *message) SetRequestBytes(buf []byte) error { 104 f.request = remote.NewReaderBuffer(buf) 105 return nil 106 } 107 108 // GetResponseBytes implements the Message interface. 109 func (f *message) GetResponseBytes() ([]byte, error) { 110 if f.response == nil { 111 return nil, errors.New("response not init yet") 112 } 113 return f.response.Peek(f.response.ReadableLen()) 114 } 115 116 // GetRequestReaderByteBuffer implements the Message interface. 117 func (f *message) GetRequestReaderByteBuffer() remote.ByteBuffer { 118 return f.request 119 } 120 121 // GetResponseWriterByteBuffer implements the Message interface. 122 func (f *message) GetResponseWriterByteBuffer() remote.ByteBuffer { 123 if f.response == nil { 124 f.response = internal_netpoll.NewReaderWriterByteBuffer(netpoll.NewLinkBuffer(0)) 125 } 126 return f.response 127 } 128 129 // Release implements the Message interface. 130 func (f *message) Release() error { 131 if f.request != nil { 132 f.request.Release(nil) 133 } 134 if f.response != nil { 135 f.response.Release(nil) 136 } 137 return nil 138 }