package rpc import ( "fmt" "io" "strings" "git.loafle.net/commons_go/rpc/protocol" ) func NewServerHandler() ServerHandler { sh := &ServerHandlers{} return sh } type ServerHandlers struct { codecs map[string]protocol.ServerCodec } func (sh *ServerHandlers) Init() error { return nil } func (sh *ServerHandlers) OnStart() { // no op } func (sh *ServerHandlers) OnPreRead(r io.Reader) { // no op } func (sh *ServerHandlers) OnPostRead(r io.Reader) { // no op } func (sh *ServerHandlers) OnPreWriteResult(w io.Writer, result interface{}) { // no op } func (sh *ServerHandlers) OnPostWriteResult(w io.Writer, result interface{}) { // no op } func (sh *ServerHandlers) OnPreWriteError(w io.Writer, err error) { // no op } func (sh *ServerHandlers) OnPostWriteError(w io.Writer, err error) { // no op } func (sh *ServerHandlers) OnStop() { // no op } func (sh *ServerHandlers) Validate() { } // RegisterCodec adds a new codec to the server. // // Codecs are defined to process a given serialization scheme, e.g., JSON or // XML. A codec is chosen based on the "Content-Type" header from the request, // excluding the charset definition. func (sh *ServerHandlers) RegisterCodec(codec protocol.ServerCodec, contentType string) { if nil == sh.codecs { sh.codecs = make(map[string]protocol.ServerCodec) } sh.codecs[strings.ToLower(contentType)] = codec } func (sh *ServerHandlers) GetCodec(contentType string) (protocol.ServerCodec, error) { var codec protocol.ServerCodec if contentType == "" && len(sh.codecs) == 1 { // If Content-Type is not set and only one codec has been registered, // then default to that codec. for _, c := range sh.codecs { codec = c } } else if codec = sh.codecs[strings.ToLower(contentType)]; codec == nil { return nil, fmt.Errorf("Unrecognized Content-Type: %s", contentType) } return codec, nil }