2017-11-26 10:15:51 +00:00
|
|
|
package rpc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"git.loafle.net/commons_go/rpc/protocol"
|
2017-11-27 16:22:02 +00:00
|
|
|
cuc "git.loafle.net/commons_go/util/context"
|
2017-11-26 10:15:51 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type ServletHandlers struct {
|
|
|
|
// The maximum number of pending messages in the queue.
|
|
|
|
//
|
|
|
|
// The number of pending requsts should exceed the expected number
|
|
|
|
// of concurrent goroutines calling client's methods.
|
|
|
|
// Otherwise a lot of ClientError.Overflow errors may appear.
|
|
|
|
//
|
|
|
|
// Default is DefaultPendingMessages.
|
|
|
|
PendingMessages int
|
|
|
|
|
|
|
|
codecs map[string]protocol.ServerCodec
|
|
|
|
}
|
|
|
|
|
2017-11-27 16:22:02 +00:00
|
|
|
func (sh *ServletHandlers) ServletContext(parent cuc.Context) ServletContext {
|
|
|
|
return newServletContext(parent)
|
|
|
|
}
|
|
|
|
|
2017-11-27 12:04:25 +00:00
|
|
|
func (sh *ServletHandlers) Init(servletCTX ServletContext) error {
|
2017-11-26 10:15:51 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-11-28 09:33:52 +00:00
|
|
|
func (sh *ServletHandlers) GetRequest(servletCTX ServletContext, codec protocol.ServerCodec, conn interface{}) (protocol.ServerRequestCodec, error) {
|
2017-11-26 10:15:51 +00:00
|
|
|
return nil, fmt.Errorf("Servlet Handler: GetRequest is not implemented")
|
|
|
|
}
|
|
|
|
|
2017-11-27 12:04:25 +00:00
|
|
|
func (sh *ServletHandlers) Invoke(servletCTX ServletContext, requestCodec protocol.RegistryCodec) (result interface{}, err error) {
|
2017-11-26 10:15:51 +00:00
|
|
|
return nil, fmt.Errorf("Servlet Handler: Invoke is not implemented")
|
|
|
|
}
|
|
|
|
|
2017-11-28 09:33:52 +00:00
|
|
|
func (sh *ServletHandlers) SendResponse(servletCTX ServletContext, conn interface{}, requestCodec protocol.ServerRequestCodec, result interface{}, err error) error {
|
2017-11-26 10:15:51 +00:00
|
|
|
return fmt.Errorf("Servlet Handler: SendResponse is not implemented")
|
|
|
|
}
|
|
|
|
|
2017-11-28 09:33:52 +00:00
|
|
|
func (sh *ServletHandlers) SendNotification(servletCTX ServletContext, conn interface{}, codec protocol.ServerCodec, method string, args ...interface{}) error {
|
2017-11-26 10:15:51 +00:00
|
|
|
return fmt.Errorf("Servlet Handler: SendNotification is not implemented")
|
|
|
|
}
|
|
|
|
|
2017-11-27 12:04:25 +00:00
|
|
|
func (sh *ServletHandlers) Destroy(servletCTX ServletContext) {
|
2017-11-26 10:15:51 +00:00
|
|
|
// no op
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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 *ServletHandlers) RegisterCodec(contentType string, codec protocol.ServerCodec) {
|
|
|
|
if nil == sh.codecs {
|
|
|
|
sh.codecs = make(map[string]protocol.ServerCodec)
|
|
|
|
}
|
|
|
|
sh.codecs[strings.ToLower(contentType)] = codec
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sh *ServletHandlers) 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
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sh *ServletHandlers) GetPendingMessages() int {
|
|
|
|
return sh.PendingMessages
|
|
|
|
}
|
|
|
|
|
|
|
|
func (sh *ServletHandlers) Validate() {
|
|
|
|
if 0 >= sh.PendingMessages {
|
|
|
|
sh.PendingMessages = DefaultPendingMessages
|
|
|
|
}
|
|
|
|
}
|