AnP/Go/Drivers/HTTPDriver.go

111 lines
2.6 KiB
Go

package Drivers
import (
"AnP/Models"
"AnP/Utils"
"context"
"fmt"
"mime"
"net/http"
"strconv"
)
type HTTPDriver struct {
anp Models.AnPModel
host string
port int
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: int(Utils.Get(anp.Settings.Get([]string{
"http_driver_port", "http_port", "port",
}, inputs, Utils.GetPointer[any](28080)), Utils.GetPointer[float64](38080))),
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)),
}
Models.DebugPrint(server.host, ":", server.port)
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(Models.NewRequestModel(request))
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))
if options, exists := response["options"]; exists {
switch headers := options.(type) {
case map[string]any:
for key, value := range headers {
writer.Header().Set(key, Utils.ToString(value))
}
}
}
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")
}
}