mirror of
https://github.com/safing/portbase
synced 2025-09-01 01:59:48 +00:00
66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"sync"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/safing/portbase/log"
|
|
)
|
|
|
|
var (
|
|
// gorilla mux
|
|
mainMux = mux.NewRouter()
|
|
|
|
// middlewares
|
|
middlewareHandler = &mwHandler{
|
|
final: mainMux,
|
|
handlers: []Middleware{
|
|
RequestLogger,
|
|
authMiddleware,
|
|
},
|
|
}
|
|
|
|
// main server and lock
|
|
server = &http.Server{}
|
|
handlerLock sync.RWMutex
|
|
)
|
|
|
|
// RegisterHandler registers a handler with the API endoint.
|
|
func RegisterHandler(path string, handler http.Handler) *mux.Route {
|
|
handlerLock.Lock()
|
|
defer handlerLock.Unlock()
|
|
return mainMux.Handle(path, handler)
|
|
}
|
|
|
|
// RegisterHandleFunc registers a handle function with the API endoint.
|
|
func RegisterHandleFunc(path string, handleFunc func(http.ResponseWriter, *http.Request)) *mux.Route {
|
|
handlerLock.Lock()
|
|
defer handlerLock.Unlock()
|
|
return mainMux.HandleFunc(path, handleFunc)
|
|
}
|
|
|
|
// RegisterMiddleware registers a middle function with the API endoint.
|
|
func RegisterMiddleware(middleware Middleware) {
|
|
handlerLock.Lock()
|
|
defer handlerLock.Unlock()
|
|
middlewareHandler.handlers = append(middlewareHandler.handlers, middleware)
|
|
}
|
|
|
|
// Serve starts serving the API endpoint.
|
|
func Serve() {
|
|
// configure server
|
|
server.Addr = GetAPIAddress()
|
|
server.Handler = middlewareHandler
|
|
|
|
// start serving
|
|
log.Infof("api: starting to listen on %s", server.Addr)
|
|
// TODO: retry if failed
|
|
log.Errorf("api: failed to listen on %s: %s", server.Addr, server.ListenAndServe())
|
|
}
|
|
|
|
// GetMuxVars wraps github.com/gorilla/mux.Vars in order to mitigate context key issues in multi-repo projects.
|
|
func GetMuxVars(r *http.Request) map[string]string {
|
|
return mux.Vars(r)
|
|
}
|