102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
package Drivers
|
|
|
|
import (
|
|
"AnP/Models"
|
|
"AnP/Utils"
|
|
"context"
|
|
"fmt"
|
|
"mime"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type HTTPDriver struct {
|
|
anp Models.AnPModel
|
|
host string
|
|
port int16
|
|
server *http.Server
|
|
listener func(writer http.ResponseWriter, request *http.Request)
|
|
autorun bool
|
|
}
|
|
|
|
func NewHTTPDriver(anp Models.AnPModel, inputs any) *HTTPDriver {
|
|
mime.AddExtensionType(".js", "application/javascript")
|
|
|
|
var server HTTPDriver = HTTPDriver{
|
|
anp: anp,
|
|
host: Utils.Get(anp.Settings.Get([]string{
|
|
"http_driver_host", "http_host", "host",
|
|
}, inputs, Utils.GetPointer[any]("")), Utils.GetPointer("")),
|
|
port: Utils.Get(anp.Settings.Get([]string{
|
|
"http_driver_port", "http_port", "port",
|
|
}, inputs, Utils.GetPointer[any](8080)), Utils.GetPointer[int16](8080)),
|
|
listener: Utils.Get[func(writer http.ResponseWriter, request *http.Request)](anp.Settings.Get([]string{
|
|
"http_driver_listener", "http_listener", "listener",
|
|
}, inputs, nil), nil),
|
|
autorun: Utils.Get(anp.Settings.Get([]string{
|
|
"http_driver_autorun", "http_autorun", "autorun",
|
|
}, inputs, Utils.GetPointer[any](true)), Utils.GetPointer(true)),
|
|
}
|
|
|
|
if server.listener == nil {
|
|
server.listener = server.listen
|
|
}
|
|
|
|
if server.autorun {
|
|
server.Run()
|
|
}
|
|
|
|
return &server
|
|
}
|
|
|
|
func (_self HTTPDriver) listen(writer http.ResponseWriter, request *http.Request) {
|
|
|
|
var response map[string]any = _self.anp.Applications.Go(request.Host, strings.ToLower(request.Method), request.RequestURI)
|
|
var response_bytes []byte = []byte{}
|
|
|
|
if response["response"] != nil {
|
|
switch value := response["response"].(type) {
|
|
case string:
|
|
response_bytes = []byte(value)
|
|
case []byte:
|
|
response_bytes = value
|
|
}
|
|
}
|
|
|
|
writer.Header().Set("Content-Type", Utils.Get[string](response["mime"], nil))
|
|
writer.WriteHeader(Utils.Get[int](response["code"], nil))
|
|
writer.Write(response_bytes)
|
|
|
|
}
|
|
|
|
func (_self HTTPDriver) Run() {
|
|
|
|
_self.server = &http.Server{
|
|
Addr: _self.host + ":" + strconv.FormatInt(int64(_self.port), 10),
|
|
Handler: http.HandlerFunc(_self.listener),
|
|
}
|
|
|
|
_self.anp.WaitGroup.Add(1)
|
|
|
|
go func() {
|
|
if error := _self.server.ListenAndServe(); error != nil {
|
|
fmt.Printf("Error: %v\n", error)
|
|
}
|
|
_self.anp.WaitGroup.Done()
|
|
}()
|
|
|
|
}
|
|
|
|
func (_self HTTPDriver) Stop() {
|
|
|
|
context_timeout, cancel := context.WithTimeout(context.Background(), 2000)
|
|
|
|
defer cancel()
|
|
|
|
if _self.server.Shutdown(context_timeout) != nil {
|
|
Models.DebugPrint("PASA SHUTDOWN")
|
|
}
|
|
|
|
}
|