Compare commits
2 Commits
b53658e038
...
1e9c9cf6ad
Author | SHA1 | Date | |
---|---|---|---|
1e9c9cf6ad | |||
3cb0b099e4 |
@ -232,7 +232,7 @@ func main() {
|
|||||||
|
|
||||||
rp := &atRequestParser{}
|
rp := &atRequestParser{}
|
||||||
bsh := handlers.NewBaseSessionHandler(cfg, rs, stateStore, userdataStore, rp, hl)
|
bsh := handlers.NewBaseSessionHandler(cfg, rs, stateStore, userdataStore, rp, hl)
|
||||||
sh := httpserver.ToSessionHandler(bsh, httpserver.WithAtOutput())
|
sh := httpserver.NewATSessionHandler(bsh)
|
||||||
s := &http.Server{
|
s := &http.Server{
|
||||||
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
|
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
|
||||||
Handler: sh,
|
Handler: sh,
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/db"
|
"git.defalsify.org/vise.git/db"
|
||||||
"git.defalsify.org/vise.git/engine"
|
"git.defalsify.org/vise.git/engine"
|
||||||
"git.defalsify.org/vise.git/persist"
|
"git.defalsify.org/vise.git/persist"
|
||||||
@ -90,25 +88,6 @@ func(f *BaseSessionHandler) Output(rqs RequestSession) (RequestSession, error)
|
|||||||
return rqs, err
|
return rqs, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *BaseSessionHandler) AtOutput(rqs RequestSession) (RequestSession, error) {
|
|
||||||
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.WriteResult(rqs.Ctx, rqs.Writer)
|
|
||||||
return rqs, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func(f *BaseSessionHandler) Reset(rqs RequestSession) (RequestSession, error) {
|
func(f *BaseSessionHandler) Reset(rqs RequestSession) (RequestSession, error) {
|
||||||
defer f.provider.Put(rqs.Config.SessionId, rqs.Storage)
|
defer f.provider.Put(rqs.Config.SessionId, rqs.Storage)
|
||||||
return rqs, rqs.Engine.Finish()
|
return rqs, rqs.Engine.Finish()
|
||||||
|
@ -51,7 +51,6 @@ type RequestHandler interface {
|
|||||||
GetEngine(cfg engine.Config, rs resource.Resource, pe *persist.Persister) engine.Engine
|
GetEngine(cfg engine.Config, rs resource.Resource, pe *persist.Persister) engine.Engine
|
||||||
Process(rs RequestSession) (RequestSession, error)
|
Process(rs RequestSession) (RequestSession, error)
|
||||||
Output(rs RequestSession) (RequestSession, error)
|
Output(rs RequestSession) (RequestSession, error)
|
||||||
AtOutput(rs RequestSession) (RequestSession, error)
|
|
||||||
Reset(rs RequestSession) (RequestSession, error)
|
Reset(rs RequestSession) (RequestSession, error)
|
||||||
Shutdown()
|
Shutdown()
|
||||||
}
|
}
|
||||||
|
93
internal/http/at_session_handler.go
Normal file
93
internal/http/at_session_handler.go
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package http
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"git.grassecon.net/urdt/ussd/internal/handlers"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ATSessionHandler struct {
|
||||||
|
*SessionHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewATSessionHandler(h handlers.RequestHandler) *ATSessionHandler {
|
||||||
|
return &ATSessionHandler{
|
||||||
|
SessionHandler: ToSessionHandler(h),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ash *ATSessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
var code int
|
||||||
|
var err error
|
||||||
|
|
||||||
|
rqs := handlers.RequestSession{
|
||||||
|
Ctx: req.Context(),
|
||||||
|
Writer: w,
|
||||||
|
}
|
||||||
|
|
||||||
|
rp := ash.GetRequestParser()
|
||||||
|
cfg := ash.GetConfig()
|
||||||
|
cfg.SessionId, err = rp.GetSessionId(req)
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
|
||||||
|
ash.writeError(w, 400, err)
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
rqs, err = ash.Process(rqs)
|
||||||
|
switch err {
|
||||||
|
case handlers.ErrStorage:
|
||||||
|
code = 500
|
||||||
|
case handlers.ErrEngineInit:
|
||||||
|
code = 500
|
||||||
|
case handlers.ErrEngineExec:
|
||||||
|
code = 500
|
||||||
|
default:
|
||||||
|
code = 200
|
||||||
|
}
|
||||||
|
|
||||||
|
if code != 200 {
|
||||||
|
ash.writeError(w, 500, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(200)
|
||||||
|
w.Header().Set("Content-Type", "text/plain")
|
||||||
|
rqs, err = ash.ATOutput(rqs)
|
||||||
|
if err != nil {
|
||||||
|
ash.writeError(w, 500, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rqs, err = ash.Reset(rqs)
|
||||||
|
if err != nil {
|
||||||
|
ash.writeError(w, 500, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ash *ATSessionHandler) ATOutput(rqs handlers.RequestSession) (handlers.RequestSession, error) {
|
||||||
|
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.WriteResult(rqs.Ctx, rqs.Writer)
|
||||||
|
return rqs, err
|
||||||
|
}
|
@ -43,30 +43,14 @@ func(rp *DefaultRequestParser) GetInput(rq any) ([]byte, error) {
|
|||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type SessionHandlerOption func(*SessionHandler)
|
|
||||||
|
|
||||||
func WithAtOutput() SessionHandlerOption {
|
|
||||||
return func(sh *SessionHandler) {
|
|
||||||
sh.useAtOutput = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type SessionHandler struct {
|
type SessionHandler struct {
|
||||||
handlers.RequestHandler
|
handlers.RequestHandler
|
||||||
useAtOutput bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ToSessionHandler(h handlers.RequestHandler, opts ...SessionHandlerOption) *SessionHandler {
|
func ToSessionHandler(h handlers.RequestHandler) *SessionHandler {
|
||||||
sh := &SessionHandler{
|
return &SessionHandler{
|
||||||
RequestHandler: h,
|
RequestHandler: h,
|
||||||
useAtOutput: false,
|
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
|
||||||
opt(sh)
|
|
||||||
}
|
|
||||||
return sh
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func(f *SessionHandler) writeError(w http.ResponseWriter, code int, err error) {
|
func(f *SessionHandler) writeError(w http.ResponseWriter, code int, err error) {
|
||||||
@ -84,6 +68,7 @@ func(f *SessionHandler) writeError(w http.ResponseWriter, code int, err error) {
|
|||||||
func(f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
func(f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
var code int
|
var code int
|
||||||
var err error
|
var err error
|
||||||
|
var perr error
|
||||||
|
|
||||||
rqs := handlers.RequestSession{
|
rqs := handlers.RequestSession{
|
||||||
Ctx: req.Context(),
|
Ctx: req.Context(),
|
||||||
@ -124,19 +109,14 @@ func(f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
|
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Header().Set("Content-Type", "text/plain")
|
w.Header().Set("Content-Type", "text/plain")
|
||||||
if f.useAtOutput {
|
|
||||||
rqs, err = f.AtOutput(rqs)
|
|
||||||
} else {
|
|
||||||
rqs, err = f.Output(rqs)
|
rqs, err = f.Output(rqs)
|
||||||
}
|
rqs, perr = f.Reset(rqs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f.writeError(w, 500, err)
|
f.writeError(w, 500, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if perr != nil {
|
||||||
rqs, err = f.Reset(rqs)
|
f.writeError(w, 500, perr)
|
||||||
if err != nil {
|
|
||||||
f.writeError(w, 500, err)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user