diff --git a/pkg/liberrors/server.go b/pkg/liberrors/server.go index b870209a..0996c9a7 100644 --- a/pkg/liberrors/server.go +++ b/pkg/liberrors/server.go @@ -238,3 +238,14 @@ type ErrServerInvalidSession struct{} func (e ErrServerInvalidSession) Error() string { return "invalid session" } + +// ErrServerPathHasChanged is an error that can be returned by a server. +type ErrServerPathHasChanged struct { + Prev string + Cur string +} + +// Error implements the error interface. +func (e ErrServerPathHasChanged) Error() string { + return fmt.Sprintf("path has changed, was '%s', now is '%s'", e.Prev, e.Cur) +} diff --git a/serversession.go b/serversession.go index e8eae2ec..c86865a3 100644 --- a/serversession.go +++ b/serversession.go @@ -769,6 +769,13 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base path, query := base.PathSplitQuery(pathAndQuery) + if ss.State() == ServerSessionStatePrePlay && + path != *ss.setuppedPath { + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path} + } + res, err := sc.s.Handler.(ServerHandlerOnPlay).OnPlay(&ServerHandlerOnPlayCtx{ Session: ss, Conn: sc, @@ -884,6 +891,12 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base ss.tcpConn = sc } + if path != *ss.setuppedPath { + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path} + } + res, err := ss.s.Handler.(ServerHandlerOnRecord).OnRecord(&ServerHandlerOnRecordCtx{ Session: ss, Conn: sc,