visedriver-africastalking/africastalking/server.go

112 lines
2.3 KiB
Go
Raw Normal View History

2025-01-05 08:19:45 +01:00
package at
import (
"io"
"net/http"
2025-01-11 16:02:03 +01:00
"strconv"
2025-01-05 08:19:45 +01:00
"git.defalsify.org/vise.git/logging"
2025-01-11 09:49:41 +01:00
"git.grassecon.net/grassrootseconomics/visedriver/errors"
2025-01-21 16:31:15 +01:00
"git.grassecon.net/grassrootseconomics/visedriver/request"
2025-01-05 08:19:45 +01:00
)
var (
2025-01-14 16:21:34 +01:00
logg = logging.NewVanilla().WithDomain("atserver").WithContextKey("at-session-id").WithContextKey("SessionId")
2025-01-05 08:19:45 +01:00
)
type ATRequestHandler struct {
//*httpsession.RequestHandler
2025-01-11 16:02:03 +01:00
request.RequestHandler
2025-01-05 08:19:45 +01:00
}
func NewATRequestHandler(h request.RequestHandler) *ATRequestHandler {
return &ATRequestHandler{
2025-01-11 16:02:03 +01:00
RequestHandler: h,
2025-01-05 08:19:45 +01:00
}
}
func (ash *ATRequestHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
2025-01-05 08:19:45 +01:00
var code int
var err error
rqs := request.RequestSession{
Ctx: req.Context(),
Writer: w,
}
rp := ash.GetRequestParser()
cfg := ash.GetConfig()
2025-01-09 15:05:56 +01:00
cfg.SessionId, err = rp.GetSessionId(req.Context(), req)
2025-01-05 08:19:45 +01:00
if err != nil {
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
ash.WriteError(w, 400, err)
return
}
rqs.Config = cfg
rqs.Input, err = rp.GetInput(req)
if err != nil {
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
ash.WriteError(w, 400, err)
return
}
2025-01-21 16:31:15 +01:00
rqs, err = ash.Process(rqs)
2025-01-05 08:19:45 +01:00
switch err {
case nil: // set code to 200 if no err
code = 200
case errors.ErrStorage, errors.ErrEngineInit, errors.ErrEngineExec, errors.ErrEngineType:
code = 500
default:
code = 500
}
if code != 200 {
ash.WriteError(w, 500, err)
return
}
w.WriteHeader(200)
w.Header().Set("Content-Type", "text/plain")
rqs, err = ash.Output(rqs)
if err != nil {
ash.WriteError(w, 500, err)
return
}
2025-01-19 10:42:41 +01:00
rqs, err = ash.Reset(rqs.Ctx, rqs)
2025-01-05 08:19:45 +01:00
if err != nil {
ash.WriteError(w, 500, err)
return
}
}
func (ash *ATRequestHandler) Output(rqs request.RequestSession) (request.RequestSession, error) {
2025-01-05 08:19:45 +01:00
var err error
var prefix string
if rqs.Continue {
prefix = "CON "
} else {
prefix = "END "
}
_, err = io.WriteString(rqs.Writer, prefix)
if err != nil {
return rqs, err
}
_, err = rqs.Engine.Flush(rqs.Ctx, rqs.Writer)
return rqs, err
}
2025-01-11 16:02:03 +01:00
func (ash *ATRequestHandler) WriteError(w http.ResponseWriter, code int, err error) {
2025-01-11 16:02:03 +01:00
s := err.Error()
w.Header().Set("Content-Length", strconv.Itoa(len(s)))
w.WriteHeader(code)
_, err = w.Write([]byte(s))
if err != nil {
logg.Errorf("error writing error!!", "err", err, "olderr", s)
w.WriteHeader(500)
}
}