Browse Source

bump API prefix from /v1 to /v2 (#1815)

pull/1821/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
586df289e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 40
      apidocs/openapi.yaml
  3. 38
      internal/core/api.go
  4. 44
      internal/core/api_test.go

2
README.md

@ -492,7 +492,7 @@ api: yes
The API listens on `apiAddress`, that by default is `127.0.0.1:9997`; for instance, to obtain a list of active paths, run: The API listens on `apiAddress`, that by default is `127.0.0.1:9997`; for instance, to obtain a list of active paths, run:
``` ```
curl http://127.0.0.1:9997/v1/paths/list curl http://127.0.0.1:9997/v2/paths/list
``` ```
Full documentation of the API is available on the [dedicated site](https://bluenviron.github.io/mediamtx/). Full documentation of the API is available on the [dedicated site](https://bluenviron.github.io/mediamtx/).

40
apidocs/openapi.yaml

@ -507,7 +507,7 @@ components:
$ref: '#/components/schemas/WebRTCConn' $ref: '#/components/schemas/WebRTCConn'
paths: paths:
/v1/config/get: /v2/config/get:
get: get:
operationId: configGet operationId: configGet
summary: returns the configuration. summary: returns the configuration.
@ -524,11 +524,11 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/config/set: /v2/config/set:
post: post:
operationId: configSet operationId: configSet
summary: changes the configuration. summary: changes the configuration.
description: all fields are optional. paths can't be edited with this request, use /v1/config/paths/{operation}/{name} to edit them. description: all fields are optional. paths can't be edited with this request, use /v2/config/paths/{operation}/{name} to edit them.
requestBody: requestBody:
required: true required: true
content: content:
@ -543,7 +543,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/config/paths/add/{name}: /v2/config/paths/add/{name}:
post: post:
operationId: configPathsAdd operationId: configPathsAdd
summary: adds the configuration of a path. summary: adds the configuration of a path.
@ -569,7 +569,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/config/paths/edit/{name}: /v2/config/paths/edit/{name}:
post: post:
operationId: configPathsEdit operationId: configPathsEdit
summary: changes the configuration of a path. summary: changes the configuration of a path.
@ -595,7 +595,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/config/paths/remove/{name}: /v2/config/paths/remove/{name}:
post: post:
operationId: configPathsRemove operationId: configPathsRemove
summary: removes the configuration of a path. summary: removes the configuration of a path.
@ -615,7 +615,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/hlsmuxers/list: /v2/hlsmuxers/list:
get: get:
operationId: hlsMuxersList operationId: hlsMuxersList
summary: returns all HLS muxers. summary: returns all HLS muxers.
@ -645,7 +645,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/paths/list: /v2/paths/list:
get: get:
operationId: pathsList operationId: pathsList
summary: returns all paths. summary: returns all paths.
@ -675,7 +675,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspconns/list: /v2/rtspconns/list:
get: get:
operationId: rtspConnsList operationId: rtspConnsList
summary: returns all RTSP connections. summary: returns all RTSP connections.
@ -705,7 +705,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspsessions/list: /v2/rtspsessions/list:
get: get:
operationId: rtspSessionsList operationId: rtspSessionsList
summary: returns all RTSP sessions. summary: returns all RTSP sessions.
@ -735,7 +735,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspsessions/kick/{id}: /v2/rtspsessions/kick/{id}:
post: post:
operationId: rtspSessionsKick operationId: rtspSessionsKick
summary: kicks out a RTSP session from the server. summary: kicks out a RTSP session from the server.
@ -755,7 +755,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspsconns/list: /v2/rtspsconns/list:
get: get:
operationId: rtspsConnsList operationId: rtspsConnsList
summary: returns all RTSPS connections. summary: returns all RTSPS connections.
@ -785,7 +785,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspssessions/list: /v2/rtspssessions/list:
get: get:
operationId: rtspsSessionsList operationId: rtspsSessionsList
summary: returns all RTSPS sessions. summary: returns all RTSPS sessions.
@ -815,7 +815,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtspssessions/kick/{id}: /v2/rtspssessions/kick/{id}:
post: post:
operationId: rtspsSessionsKick operationId: rtspsSessionsKick
summary: kicks out a RTSPS session from the server. summary: kicks out a RTSPS session from the server.
@ -835,7 +835,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtmpconns/list: /v2/rtmpconns/list:
get: get:
operationId: rtmpConnsList operationId: rtmpConnsList
summary: returns all RTMP connections. summary: returns all RTMP connections.
@ -865,7 +865,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtmpconns/kick/{id}: /v2/rtmpconns/kick/{id}:
post: post:
operationId: rtmpConnsKick operationId: rtmpConnsKick
summary: kicks out a RTMP connection from the server. summary: kicks out a RTMP connection from the server.
@ -885,7 +885,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtmpsconns/list: /v2/rtmpsconns/list:
get: get:
operationId: rtmpsConnsList operationId: rtmpsConnsList
summary: returns all RTMPS connections. summary: returns all RTMPS connections.
@ -915,7 +915,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/rtmpsconns/kick/{id}: /v2/rtmpsconns/kick/{id}:
post: post:
operationId: rtmpsConnsKick operationId: rtmpsConnsKick
summary: kicks out a RTMPS connection from the server. summary: kicks out a RTMPS connection from the server.
@ -935,7 +935,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/webrtcsessions/list: /v2/webrtcsessions/list:
get: get:
operationId: webrtcSessionsList operationId: webrtcSessionsList
summary: returns all WebRTC connections. summary: returns all WebRTC connections.
@ -965,7 +965,7 @@ paths:
'500': '500':
description: internal server error. description: internal server error.
/v1/webrtcsessions/kick/{id}: /v2/webrtcsessions/kick/{id}:
post: post:
operationId: webrtcSessionsKick operationId: webrtcSessionsKick
summary: kicks out a WebRTC connection from the server. summary: kicks out a WebRTC connection from the server.

38
internal/core/api.go

@ -201,43 +201,43 @@ func newAPI(
router.NoRoute(mwLog, httpServerHeaderMiddleware) router.NoRoute(mwLog, httpServerHeaderMiddleware)
group := router.Group("/", mwLog, httpServerHeaderMiddleware) group := router.Group("/", mwLog, httpServerHeaderMiddleware)
group.GET("/v1/config/get", a.onConfigGet) group.GET("/v2/config/get", a.onConfigGet)
group.POST("/v1/config/set", a.onConfigSet) group.POST("/v2/config/set", a.onConfigSet)
group.POST("/v1/config/paths/add/*name", a.onConfigPathsAdd) group.POST("/v2/config/paths/add/*name", a.onConfigPathsAdd)
group.POST("/v1/config/paths/edit/*name", a.onConfigPathsEdit) group.POST("/v2/config/paths/edit/*name", a.onConfigPathsEdit)
group.POST("/v1/config/paths/remove/*name", a.onConfigPathsDelete) group.POST("/v2/config/paths/remove/*name", a.onConfigPathsDelete)
if !interfaceIsEmpty(a.hlsManager) { if !interfaceIsEmpty(a.hlsManager) {
group.GET("/v1/hlsmuxers/list", a.onHLSMuxersList) group.GET("/v2/hlsmuxers/list", a.onHLSMuxersList)
} }
group.GET("/v1/paths/list", a.onPathsList) group.GET("/v2/paths/list", a.onPathsList)
if !interfaceIsEmpty(a.rtspServer) { if !interfaceIsEmpty(a.rtspServer) {
group.GET("/v1/rtspconns/list", a.onRTSPConnsList) group.GET("/v2/rtspconns/list", a.onRTSPConnsList)
group.GET("/v1/rtspsessions/list", a.onRTSPSessionsList) group.GET("/v2/rtspsessions/list", a.onRTSPSessionsList)
group.POST("/v1/rtspsessions/kick/:id", a.onRTSPSessionsKick) group.POST("/v2/rtspsessions/kick/:id", a.onRTSPSessionsKick)
} }
if !interfaceIsEmpty(a.rtspsServer) { if !interfaceIsEmpty(a.rtspsServer) {
group.GET("/v1/rtspsconns/list", a.onRTSPSConnsList) group.GET("/v2/rtspsconns/list", a.onRTSPSConnsList)
group.GET("/v1/rtspssessions/list", a.onRTSPSSessionsList) group.GET("/v2/rtspssessions/list", a.onRTSPSSessionsList)
group.POST("/v1/rtspssessions/kick/:id", a.onRTSPSSessionsKick) group.POST("/v2/rtspssessions/kick/:id", a.onRTSPSSessionsKick)
} }
if !interfaceIsEmpty(a.rtmpServer) { if !interfaceIsEmpty(a.rtmpServer) {
group.GET("/v1/rtmpconns/list", a.onRTMPConnsList) group.GET("/v2/rtmpconns/list", a.onRTMPConnsList)
group.POST("/v1/rtmpconns/kick/:id", a.onRTMPConnsKick) group.POST("/v2/rtmpconns/kick/:id", a.onRTMPConnsKick)
} }
if !interfaceIsEmpty(a.rtmpsServer) { if !interfaceIsEmpty(a.rtmpsServer) {
group.GET("/v1/rtmpsconns/list", a.onRTMPSConnsList) group.GET("/v2/rtmpsconns/list", a.onRTMPSConnsList)
group.POST("/v1/rtmpsconns/kick/:id", a.onRTMPSConnsKick) group.POST("/v2/rtmpsconns/kick/:id", a.onRTMPSConnsKick)
} }
if !interfaceIsEmpty(a.webRTCManager) { if !interfaceIsEmpty(a.webRTCManager) {
group.GET("/v1/webrtcsessions/list", a.onWebRTCSessionsList) group.GET("/v2/webrtcsessions/list", a.onWebRTCSessionsList)
group.POST("/v1/webrtcsessions/kick/:id", a.onWebRTCSessionsKick) group.POST("/v2/webrtcsessions/kick/:id", a.onWebRTCSessionsKick)
} }
var err error var err error

44
internal/core/api_test.go

@ -88,7 +88,7 @@ func TestAPIConfigGet(t *testing.T) {
defer p.Close() defer p.Close()
var out map[string]interface{} var out map[string]interface{}
err := httpRequest(http.MethodGet, "http://localhost:9997/v1/config/get", nil, &out) err := httpRequest(http.MethodGet, "http://localhost:9997/v2/config/get", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, true, out["api"]) require.Equal(t, true, out["api"])
} }
@ -98,7 +98,7 @@ func TestAPIConfigSet(t *testing.T) {
require.Equal(t, true, ok) require.Equal(t, true, ok)
defer p.Close() defer p.Close()
err := httpRequest(http.MethodPost, "http://localhost:9997/v1/config/set", map[string]interface{}{ err := httpRequest(http.MethodPost, "http://localhost:9997/v2/config/set", map[string]interface{}{
"rtmpDisable": true, "rtmpDisable": true,
"readTimeout": "7s", "readTimeout": "7s",
"protocols": []string{"tcp"}, "protocols": []string{"tcp"},
@ -108,7 +108,7 @@ func TestAPIConfigSet(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
var out map[string]interface{} var out map[string]interface{}
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/config/get", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/config/get", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, true, out["rtmpDisable"]) require.Equal(t, true, out["rtmpDisable"])
require.Equal(t, "7s", out["readTimeout"]) require.Equal(t, "7s", out["readTimeout"])
@ -120,14 +120,14 @@ func TestAPIConfigPathsAdd(t *testing.T) {
require.Equal(t, true, ok) require.Equal(t, true, ok)
defer p.Close() defer p.Close()
err := httpRequest(http.MethodPost, "http://localhost:9997/v1/config/paths/add/my/path", map[string]interface{}{ err := httpRequest(http.MethodPost, "http://localhost:9997/v2/config/paths/add/my/path", map[string]interface{}{
"source": "rtsp://127.0.0.1:9999/mypath", "source": "rtsp://127.0.0.1:9999/mypath",
"sourceOnDemand": true, "sourceOnDemand": true,
}, nil) }, nil)
require.NoError(t, err) require.NoError(t, err)
var out map[string]interface{} var out map[string]interface{}
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/config/get", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/config/get", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "rtsp://127.0.0.1:9999/mypath", require.Equal(t, "rtsp://127.0.0.1:9999/mypath",
out["paths"].(map[string]interface{})["my/path"].(map[string]interface{})["source"]) out["paths"].(map[string]interface{})["my/path"].(map[string]interface{})["source"])
@ -138,13 +138,13 @@ func TestAPIConfigPathsEdit(t *testing.T) {
require.Equal(t, true, ok) require.Equal(t, true, ok)
defer p.Close() defer p.Close()
err := httpRequest(http.MethodPost, "http://localhost:9997/v1/config/paths/add/my/path", map[string]interface{}{ err := httpRequest(http.MethodPost, "http://localhost:9997/v2/config/paths/add/my/path", map[string]interface{}{
"source": "rtsp://127.0.0.1:9999/mypath", "source": "rtsp://127.0.0.1:9999/mypath",
"sourceOnDemand": true, "sourceOnDemand": true,
}, nil) }, nil)
require.NoError(t, err) require.NoError(t, err)
err = httpRequest(http.MethodPost, "http://localhost:9997/v1/config/paths/edit/my/path", map[string]interface{}{ err = httpRequest(http.MethodPost, "http://localhost:9997/v2/config/paths/edit/my/path", map[string]interface{}{
"source": "rtsp://127.0.0.1:9998/mypath", "source": "rtsp://127.0.0.1:9998/mypath",
"sourceOnDemand": true, "sourceOnDemand": true,
}, nil) }, nil)
@ -155,7 +155,7 @@ func TestAPIConfigPathsEdit(t *testing.T) {
Source string `json:"source"` Source string `json:"source"`
} `json:"paths"` } `json:"paths"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/config/get", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/config/get", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "rtsp://127.0.0.1:9998/mypath", out.Paths["my/path"].Source) require.Equal(t, "rtsp://127.0.0.1:9998/mypath", out.Paths["my/path"].Source)
} }
@ -165,19 +165,19 @@ func TestAPIConfigPathsRemove(t *testing.T) {
require.Equal(t, true, ok) require.Equal(t, true, ok)
defer p.Close() defer p.Close()
err := httpRequest(http.MethodPost, "http://localhost:9997/v1/config/paths/add/my/path", map[string]interface{}{ err := httpRequest(http.MethodPost, "http://localhost:9997/v2/config/paths/add/my/path", map[string]interface{}{
"source": "rtsp://127.0.0.1:9999/mypath", "source": "rtsp://127.0.0.1:9999/mypath",
"sourceOnDemand": true, "sourceOnDemand": true,
}, nil) }, nil)
require.NoError(t, err) require.NoError(t, err)
err = httpRequest(http.MethodPost, "http://localhost:9997/v1/config/paths/remove/my/path", nil, nil) err = httpRequest(http.MethodPost, "http://localhost:9997/v2/config/paths/remove/my/path", nil, nil)
require.NoError(t, err) require.NoError(t, err)
var out struct { var out struct {
Paths map[string]interface{} `json:"paths"` Paths map[string]interface{} `json:"paths"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/config/get", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/config/get", nil, &out)
require.NoError(t, err) require.NoError(t, err)
_, ok = out.Paths["my/path"] _, ok = out.Paths["my/path"]
require.Equal(t, false, ok) require.Equal(t, false, ok)
@ -242,7 +242,7 @@ func TestAPIPathsList(t *testing.T) {
}) })
var out pathList var out pathList
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/paths/list", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, pathList{ require.Equal(t, pathList{
PageCount: 1, PageCount: 1,
@ -303,7 +303,7 @@ func TestAPIPathsList(t *testing.T) {
defer source.Close() defer source.Close()
var out pathList var out pathList
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/paths/list", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, pathList{ require.Equal(t, pathList{
PageCount: 1, PageCount: 1,
@ -328,7 +328,7 @@ func TestAPIPathsList(t *testing.T) {
defer p.Close() defer p.Close()
var out pathList var out pathList
err := httpRequest(http.MethodGet, "http://localhost:9997/v1/paths/list", nil, &out) err := httpRequest(http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, pathList{ require.Equal(t, pathList{
PageCount: 1, PageCount: 1,
@ -353,7 +353,7 @@ func TestAPIPathsList(t *testing.T) {
defer p.Close() defer p.Close()
var out pathList var out pathList
err := httpRequest(http.MethodGet, "http://localhost:9997/v1/paths/list", nil, &out) err := httpRequest(http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, pathList{ require.Equal(t, pathList{
PageCount: 1, PageCount: 1,
@ -378,7 +378,7 @@ func TestAPIPathsList(t *testing.T) {
defer p.Close() defer p.Close()
var out pathList var out pathList
err := httpRequest(http.MethodGet, "http://localhost:9997/v1/paths/list", nil, &out) err := httpRequest(http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, pathList{ require.Equal(t, pathList{
PageCount: 1, PageCount: 1,
@ -595,7 +595,7 @@ func TestAPIProtocolSpecificList(t *testing.T) {
State string `json:"state"` State string `json:"state"`
} `json:"items"` } `json:"items"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/"+pa+"/list", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/"+pa+"/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
if ca != "rtsp conns" && ca != "rtsps conns" { if ca != "rtsp conns" && ca != "rtsps conns" {
@ -609,7 +609,7 @@ func TestAPIProtocolSpecificList(t *testing.T) {
LastRequest string `json:"lastRequest"` LastRequest string `json:"lastRequest"`
} `json:"items"` } `json:"items"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/hlsmuxers/list", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/hlsmuxers/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
s := fmt.Sprintf("^%d-", time.Now().Year()) s := fmt.Sprintf("^%d-", time.Now().Year())
@ -631,7 +631,7 @@ func TestAPIProtocolSpecificList(t *testing.T) {
PageCount int `json:"pageCount"` PageCount int `json:"pageCount"`
Items []item `json:"items"` Items []item `json:"items"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/webrtcsessions/list", nil, &out) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/webrtcsessions/list", nil, &out)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, true, out.Items[0].PeerConnectionEstablished) require.Equal(t, true, out.Items[0].PeerConnectionEstablished)
@ -733,10 +733,10 @@ func TestAPIKick(t *testing.T) {
ID string `json:"id"` ID string `json:"id"`
} `json:"items"` } `json:"items"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/"+pa+"/list", nil, &out1) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/"+pa+"/list", nil, &out1)
require.NoError(t, err) require.NoError(t, err)
err = httpRequest(http.MethodPost, "http://localhost:9997/v1/"+pa+"/kick/"+out1.Items[0].ID, nil, nil) err = httpRequest(http.MethodPost, "http://localhost:9997/v2/"+pa+"/kick/"+out1.Items[0].ID, nil, nil)
require.NoError(t, err) require.NoError(t, err)
var out2 struct { var out2 struct {
@ -744,7 +744,7 @@ func TestAPIKick(t *testing.T) {
ID string `json:"id"` ID string `json:"id"`
} `json:"items"` } `json:"items"`
} }
err = httpRequest(http.MethodGet, "http://localhost:9997/v1/"+pa+"/list", nil, &out2) err = httpRequest(http.MethodGet, "http://localhost:9997/v2/"+pa+"/list", nil, &out2)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, 0, len(out2.Items)) require.Equal(t, 0, len(out2.Items))
}) })

Loading…
Cancel
Save