Properly isolate http session handler
This commit is contained in:
		
							parent
							
								
									fd6e5caf53
								
							
						
					
					
						commit
						977d14c529
					
				@ -3,8 +3,6 @@ package request
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"git.defalsify.org/vise.git/resource"
 | 
			
		||||
	"git.defalsify.org/vise.git/persist"
 | 
			
		||||
@ -27,7 +25,6 @@ type RequestSession struct {
 | 
			
		||||
	Continue bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// TODO: seems like can remove this.
 | 
			
		||||
type RequestParser interface {
 | 
			
		||||
	GetSessionId(ctx context.Context, rq any) (string, error)
 | 
			
		||||
@ -43,24 +40,3 @@ type RequestHandler interface {
 | 
			
		||||
	Reset(rs RequestSession) (RequestSession, error)
 | 
			
		||||
	Shutdown()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SessionHandler struct {
 | 
			
		||||
	RequestHandler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *SessionHandler) WriteError(w http.ResponseWriter, code int, err error) {
 | 
			
		||||
	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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ToSessionHandler(h RequestHandler) *SessionHandler {
 | 
			
		||||
	return &SessionHandler{
 | 
			
		||||
		RequestHandler: h,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,19 +5,21 @@ import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"git.defalsify.org/vise.git/logging"
 | 
			
		||||
 | 
			
		||||
	"git.grassecon.net/grassrootseconomics/visedriver/internal/handlers"
 | 
			
		||||
	"git.grassecon.net/grassrootseconomics/visedriver/request"
 | 
			
		||||
	"git.grassecon.net/grassrootseconomics/visedriver/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	logg = logging.NewVanilla().WithDomain("httpserver")
 | 
			
		||||
	logg = logging.NewVanilla().WithDomain("visedriver.http.session")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SessionHandler request.SessionHandler
 | 
			
		||||
 | 
			
		||||
// TODO: duplicated
 | 
			
		||||
func (f *SessionHandler) WriteError(w http.ResponseWriter, code int, err error) {
 | 
			
		||||
// HTTPSessionHandler implements the session handler for HTTP
 | 
			
		||||
type HTTPSessionHandler struct {
 | 
			
		||||
	request.RequestHandler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *HTTPSessionHandler) WriteError(w http.ResponseWriter, code int, err error) {
 | 
			
		||||
	s := err.Error()
 | 
			
		||||
	w.Header().Set("Content-Length", strconv.Itoa(len(s)))
 | 
			
		||||
	w.WriteHeader(code)
 | 
			
		||||
@ -28,7 +30,13 @@ func (f *SessionHandler) WriteError(w http.ResponseWriter, code int, err error)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
func NewHTTPSessionHandler(h request.RequestHandler) *HTTPSessionHandler {
 | 
			
		||||
	return &HTTPSessionHandler{
 | 
			
		||||
		RequestHandler: h,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (hh *HTTPSessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
	var code int
 | 
			
		||||
	var err error
 | 
			
		||||
	var perr error
 | 
			
		||||
@ -38,48 +46,48 @@ func (f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
		Writer: w,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rp := f.GetRequestParser()
 | 
			
		||||
	cfg := f.GetConfig()
 | 
			
		||||
	rp := hh.GetRequestParser()
 | 
			
		||||
	cfg := hh.GetConfig()
 | 
			
		||||
	cfg.SessionId, err = rp.GetSessionId(req.Context(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
 | 
			
		||||
		f.WriteError(w, 400, err)
 | 
			
		||||
		hh.WriteError(w, 400, err)
 | 
			
		||||
	}
 | 
			
		||||
	rqs.Config = cfg
 | 
			
		||||
	rqs.Input, err = rp.GetInput(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
 | 
			
		||||
		f.WriteError(w, 400, err)
 | 
			
		||||
		hh.WriteError(w, 400, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rqs, err = f.Process(rqs)
 | 
			
		||||
	rqs, err = hh.Process(rqs)
 | 
			
		||||
	switch err {
 | 
			
		||||
	case handlers.ErrStorage:
 | 
			
		||||
	case errors.ErrStorage:
 | 
			
		||||
		code = 500
 | 
			
		||||
	case handlers.ErrEngineInit:
 | 
			
		||||
	case errors.ErrEngineInit:
 | 
			
		||||
		code = 500
 | 
			
		||||
	case handlers.ErrEngineExec:
 | 
			
		||||
	case errors.ErrEngineExec:
 | 
			
		||||
		code = 500
 | 
			
		||||
	default:
 | 
			
		||||
		code = 200
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if code != 200 {
 | 
			
		||||
		f.WriteError(w, 500, err)
 | 
			
		||||
		hh.WriteError(w, 500, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	w.WriteHeader(200)
 | 
			
		||||
	w.Header().Set("Content-Type", "text/plain")
 | 
			
		||||
	rqs, err = f.Output(rqs)
 | 
			
		||||
	rqs, perr = f.Reset(rqs)
 | 
			
		||||
	rqs, err = hh.Output(rqs)
 | 
			
		||||
	rqs, perr = hh.Reset(rqs)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		f.WriteError(w, 500, err)
 | 
			
		||||
		hh.WriteError(w, 500, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if perr != nil {
 | 
			
		||||
		f.WriteError(w, 500, perr)
 | 
			
		||||
		hh.WriteError(w, 500, perr)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user