LINT + Server.extractParameters is now private + add management for errors : 'UncallableController' and 'UncallableMethod'
This commit is contained in:
parent
0ccee7c950
commit
6ebdd61325
|
@ -3,6 +3,7 @@ package request
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"git.xdrm.io/go/aicra/err"
|
||||||
"git.xdrm.io/go/aicra/response"
|
"git.xdrm.io/go/aicra/response"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -93,7 +94,7 @@ func FetchFormData(req *http.Request) map[string]interface{} {
|
||||||
|
|
||||||
// LoadController tries to load a controller from its uri
|
// LoadController tries to load a controller from its uri
|
||||||
// checks for its given method ('Get', 'Post', 'Put', or 'Delete')
|
// checks for its given method ('Get', 'Post', 'Put', or 'Delete')
|
||||||
func (i *Request) LoadController(method string) (func(response.Arguments, *response.Response) response.Response, error) {
|
func (i *Request) LoadController(method string) (func(response.Arguments, *response.Response) response.Response, err.Error) {
|
||||||
|
|
||||||
/* (1) Build controller path */
|
/* (1) Build controller path */
|
||||||
path := strings.Join(i.Path, "-")
|
path := strings.Join(i.Path, "-")
|
||||||
|
@ -111,21 +112,21 @@ func (i *Request) LoadController(method string) (func(response.Arguments, *respo
|
||||||
/* (2) Try to load plugin */
|
/* (2) Try to load plugin */
|
||||||
p, err2 := plugin.Open(path)
|
p, err2 := plugin.Open(path)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return nil, err2
|
return nil, err.UncallableController
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (3) Try to extract method */
|
/* (3) Try to extract method */
|
||||||
m, err2 := p.Lookup(method)
|
m, err2 := p.Lookup(method)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return nil, err2
|
return nil, err.UncallableMethod
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (4) Check signature */
|
/* (4) Check signature */
|
||||||
callable, validSignature := m.(func(response.Arguments, *response.Response) response.Response)
|
callable, validSignature := m.(func(response.Arguments, *response.Response) response.Response)
|
||||||
if !validSignature {
|
if !validSignature {
|
||||||
return nil, fmt.Errorf("Invalid signature for method %s", method)
|
return nil, err.UncallableMethod
|
||||||
}
|
}
|
||||||
|
|
||||||
return callable, nil
|
return callable, err.Success
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
15
server.go
15
server.go
|
@ -38,7 +38,7 @@ func New(path string) (*Server, error) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listens and binds the server to the given port
|
// Listen binds the server to the given port
|
||||||
func (s *Server) Listen(port uint16) error {
|
func (s *Server) Listen(port uint16) error {
|
||||||
|
|
||||||
/* (1) Bind router */
|
/* (1) Bind router */
|
||||||
|
@ -83,7 +83,7 @@ func (s *Server) routeRequest(res http.ResponseWriter, httpReq *http.Request) {
|
||||||
|
|
||||||
/* (4) Check parameters
|
/* (4) Check parameters
|
||||||
---------------------------------------------------------*/
|
---------------------------------------------------------*/
|
||||||
parameters, paramError := s.ExtractParameters(req, method.Parameters)
|
parameters, paramError := s.extractParameters(req, method.Parameters)
|
||||||
|
|
||||||
// Fail if argument check failed
|
// Fail if argument check failed
|
||||||
if paramError.Code != e.Success.Code {
|
if paramError.Code != e.Success.Code {
|
||||||
|
@ -93,8 +93,9 @@ func (s *Server) routeRequest(res http.ResponseWriter, httpReq *http.Request) {
|
||||||
|
|
||||||
/* (5) Load controller
|
/* (5) Load controller
|
||||||
---------------------------------------------------------*/
|
---------------------------------------------------------*/
|
||||||
callable, err := req.LoadController(httpReq.Method)
|
callable, callErr := req.LoadController(httpReq.Method)
|
||||||
if err != nil {
|
if callErr.Code != e.Success.Code {
|
||||||
|
httpError(res, callErr)
|
||||||
log.Printf("[err] %s\n", err)
|
log.Printf("[err] %s\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -129,12 +130,12 @@ func (s *Server) routeRequest(res http.ResponseWriter, httpReq *http.Request) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExtractParameters extracts parameters for the request and checks
|
// extractParameters extracts parameters for the request and checks
|
||||||
// every single one according to configuration options
|
// every single one according to configuration options
|
||||||
func (s *Server) ExtractParameters(req *request.Request, methodParam map[string]*config.Parameter) (map[string]interface{}, e.Error) {
|
func (s *Server) extractParameters(req *request.Request, methodParam map[string]*config.Parameter) (map[string]interface{}, e.Error) {
|
||||||
|
|
||||||
// init vars
|
// init vars
|
||||||
var err e.Error = e.Success
|
err := e.Success
|
||||||
parameters := make(map[string]interface{})
|
parameters := make(map[string]interface{})
|
||||||
|
|
||||||
// for each param of the config
|
// for each param of the config
|
||||||
|
|
4
types.go
4
types.go
|
@ -6,6 +6,10 @@ import (
|
||||||
"git.xdrm.io/go/aicra/middleware"
|
"git.xdrm.io/go/aicra/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Server represents an AICRA instance featuring:
|
||||||
|
// * its type checkers
|
||||||
|
// * its middlewares
|
||||||
|
// * its configuration (controllers)
|
||||||
type Server struct {
|
type Server struct {
|
||||||
config *config.Controller
|
config *config.Controller
|
||||||
Params map[string]interface{}
|
Params map[string]interface{}
|
||||||
|
|
4
util.go
4
util.go
|
@ -55,8 +55,8 @@ func httpPrint(r http.ResponseWriter, res response.Response) {
|
||||||
|
|
||||||
// Prints an error as HTTP response
|
// Prints an error as HTTP response
|
||||||
func httpError(r http.ResponseWriter, e err.Error) {
|
func httpError(r http.ResponseWriter, e err.Error) {
|
||||||
Json, _ := e.MarshalJSON()
|
JSON, _ := e.MarshalJSON()
|
||||||
r.Header().Add("Content-Type", "application/json")
|
r.Header().Add("Content-Type", "application/json")
|
||||||
r.Write(Json)
|
r.Write(JSON)
|
||||||
log.Printf("[http.fail] %s\n", e.Reason)
|
log.Printf("[http.fail] %s\n", e.Reason)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue