diff --git a/internal/core/api.go b/internal/core/api.go index 6de2a882..fc9caa4d 100644 --- a/internal/core/api.go +++ b/internal/core/api.go @@ -229,11 +229,11 @@ func newAPI( if !interfaceIsEmpty(a.hlsManager) { group.GET("/v2/hlsmuxers/list", a.onHLSMuxersList) - group.GET("/v2/hlsmuxers/get/:name", a.onHLSMuxersGet) + group.GET("/v2/hlsmuxers/get/*name", a.onHLSMuxersGet) } group.GET("/v2/paths/list", a.onPathsList) - group.GET("/v2/paths/get/:name", a.onPathsGet) + group.GET("/v2/paths/get/*name", a.onPathsGet) if !interfaceIsEmpty(a.rtspServer) { group.GET("/v2/rtspconns/list", a.onRTSPConnsList) @@ -475,7 +475,14 @@ func (a *api) onPathsList(ctx *gin.Context) { } func (a *api) onPathsGet(ctx *gin.Context) { - data, err := a.pathManager.apiPathsGet(ctx.Param("name")) + name := ctx.Param("name") + if len(name) < 2 || name[0] != '/' { + ctx.AbortWithStatus(http.StatusBadRequest) + return + } + name = name[1:] + + data, err := a.pathManager.apiPathsGet(name) if err != nil { abortWithError(ctx, err) return @@ -771,7 +778,14 @@ func (a *api) onHLSMuxersList(ctx *gin.Context) { } func (a *api) onHLSMuxersGet(ctx *gin.Context) { - data, err := a.hlsManager.apiMuxersGet(ctx.Param("name")) + name := ctx.Param("name") + if len(name) < 2 || name[0] != '/' { + ctx.AbortWithStatus(http.StatusBadRequest) + return + } + name = name[1:] + + data, err := a.hlsManager.apiMuxersGet(name) if err != nil { abortWithError(ctx, err) return diff --git a/internal/core/api_test.go b/internal/core/api_test.go index f5957e88..3be1c18d 100644 --- a/internal/core/api_test.go +++ b/internal/core/api_test.go @@ -440,12 +440,7 @@ func TestAPIPathsGet(t *testing.T) { hc := &http.Client{Transport: &http.Transport{}} - source := gortsplib.Client{} - err := source.StartRecording("rtsp://localhost:8554/mypath", media.Medias{testMediaH264}) - require.NoError(t, err) - defer source.Close() - - for _, ca := range []string{"ok", "not found"} { + for _, ca := range []string{"ok", "ok-nested", "not found"} { t.Run(ca, func(t *testing.T) { type pathSource struct { Type string `json:"type"` @@ -460,17 +455,26 @@ func TestAPIPathsGet(t *testing.T) { } var pathName string - if ca == "ok" { + + switch ca { + case "ok": pathName = "mypath" - } else { + case "ok-nested": + pathName = "my/nested/path" + case "not found": pathName = "nonexisting" } - if ca == "ok" { + if ca == "ok" || ca == "ok-nested" { + source := gortsplib.Client{} + err := source.StartRecording("rtsp://localhost:8554/"+pathName, media.Medias{testMediaH264}) + require.NoError(t, err) + defer source.Close() + var out path httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v2/paths/get/"+pathName, nil, &out) require.Equal(t, path{ - Name: "mypath", + Name: pathName, Source: pathSource{ Type: "rtspSession", },