48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
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)
|
|
}
|