feat: implement codec
This commit is contained in:
47
request.go
Normal file
47
request.go
Normal 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)
|
||||
}
|
Reference in New Issue
Block a user