LINT + Server.extractParameters is now private + add management for errors : 'UncallableController' and 'UncallableMethod'

This commit is contained in:
Adrien Marquès 2018-07-09 01:00:45 +02:00
parent 0ccee7c950
commit 6ebdd61325
4 changed files with 20 additions and 14 deletions

View File

@ -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
} }

View File

@ -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

View File

@ -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{}

View File

@ -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)
} }