92 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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)
 | |
| 		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
 | |
| 	}
 | |
| 
 | |
| 	rqs, err = ash.Process(rqs) 
 | |
| 	switch err {
 | |
| 	case nil: // set code to 200 if no err
 | |
| 		code = 200
 | |
| 	case handlers.ErrStorage, handlers.ErrEngineInit, handlers.ErrEngineExec, handlers.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
 | |
| 	}
 | |
| 
 | |
| 	rqs, err = ash.Reset(rqs)
 | |
| 	if err != nil {
 | |
| 		ash.writeError(w, 500, err)
 | |
| 		return
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (ash *ATSessionHandler) Output(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.Flush(rqs.Ctx, rqs.Writer)
 | |
| 	return rqs, err
 | |
| } |