feat: implement codec

This commit is contained in:
2022-04-22 20:50:58 +08:00
parent 9083504cfc
commit cf8fa335a6
9 changed files with 332 additions and 0 deletions

47
request.go Normal file
View File

@ -0,0 +1,47 @@
package krpc
import (
"fmt"
"io"
"reflect"
"sync"
"krwu.top/krpc.v1/codec"
)
type request struct {
h *codec.Header
argv reflect.Value
replyv reflect.Value
}
func (s *Server) readRequestHeader(cc codec.Codec) (*codec.Header, error) {
var h codec.Header
if err := cc.ReadHeader(&h); err != nil {
if err != io.EOF && err != io.ErrUnexpectedEOF {
fmt.Println("rpc server: read header error:", err)
}
return nil, err
}
return &h, nil
}
func (s *Server) readRequest(cc codec.Codec) (*request, error) {
h, err := s.readRequestHeader(cc)
if err != nil {
fmt.Println("rpc server: read request error: ", err)
return nil, err
}
req := &request{h: h}
req.argv = reflect.New(reflect.TypeOf(""))
if err = cc.ReadBody(req.argv.Interface()); err != nil {
fmt.Println("rpc server: read argv err: ", err)
}
return req, nil
}
func (s *Server) handleRequest(cc codec.Codec, req *request, sending *sync.Mutex, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("rcp server: ", req.h, req.argv.Elem())
req.replyv = reflect.ValueOf(fmt.Sprintf("krpc resp %d", req.h.Seq))
s.sendResponse(cc, req.h, req.replyv.Interface(), sending)
}