mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support http hooks: on_connect/close/publish/unpublish/play/stop.
This commit is contained in:
parent
3d4474f620
commit
889ad9238b
11 changed files with 971 additions and 51 deletions
|
@ -57,10 +57,11 @@ class Error:
|
|||
success = 0
|
||||
# error when parse json
|
||||
system_parse_json = 100
|
||||
# request action invalid
|
||||
request_invalid_action = 200
|
||||
|
||||
'''
|
||||
handle the clients requests:
|
||||
POST: create new client, handle the SRS on_connect callback.
|
||||
handle the clients requests: connect/disconnect vhost/app.
|
||||
'''
|
||||
class RESTClients(object):
|
||||
exposed = True
|
||||
|
@ -72,13 +73,24 @@ class RESTClients(object):
|
|||
return json.dumps(clients)
|
||||
|
||||
'''
|
||||
for SRS hook: on_connect
|
||||
when client connect to vhost/app, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"pageUrl": "http://www.test.com/live.html"
|
||||
}
|
||||
for SRS hook: on_connect/on_close
|
||||
on_connect:
|
||||
when client connect to vhost/app, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_connect",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"pageUrl": "http://www.test.com/live.html"
|
||||
}
|
||||
on_close:
|
||||
when client close/disconnect to vhost/app/stream, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_close",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live"
|
||||
}
|
||||
if valid, the hook must return HTTP code 200(Stauts OK) and response
|
||||
an int value specifies the error code(0 corresponding to success):
|
||||
0
|
||||
|
@ -87,29 +99,227 @@ class RESTClients(object):
|
|||
enable_crossdomain()
|
||||
|
||||
# return the error code in str
|
||||
ret = Error.success
|
||||
code = Error.success
|
||||
|
||||
req = cherrypy.request.body.read()
|
||||
trace("post to clients, req=%s"%(req))
|
||||
try:
|
||||
json_req = json.loads(req)
|
||||
except Exception, ex:
|
||||
ret = Error.system_parse_json
|
||||
trace("parse the request to json failed, req=%s, ex=%s, ret=%s"%(req, ex, ret))
|
||||
return str(ret)
|
||||
code = Error.system_parse_json
|
||||
trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code))
|
||||
return str(code)
|
||||
|
||||
trace("srs on_connect: client ip=%s, vhost=%s, app=%s, pageUrl=%s"%(
|
||||
json_req["ip"], json_req["vhost"], json_req["app"], json_req["pageUrl"]
|
||||
))
|
||||
action = json_req["action"]
|
||||
if action == "on_connect":
|
||||
code = self.__on_connect(json_req)
|
||||
elif action == "on_close":
|
||||
code = self.__on_close(json_req)
|
||||
else:
|
||||
trace("invalid request action: %s"%(json_req["action"]))
|
||||
code = Error.request_invalid_action
|
||||
|
||||
# TODO: valid the client.
|
||||
|
||||
trace("valid clients post request success.")
|
||||
return str(ret)
|
||||
return str(code)
|
||||
|
||||
def OPTIONS(self):
|
||||
enable_crossdomain()
|
||||
|
||||
def __on_connect(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s, pageUrl=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"], req["pageUrl"]
|
||||
))
|
||||
|
||||
# TODO: process the on_connect event
|
||||
|
||||
return code
|
||||
|
||||
def __on_close(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"]
|
||||
))
|
||||
|
||||
# TODO: process the on_close event
|
||||
|
||||
return code
|
||||
|
||||
'''
|
||||
handle the streams requests: publish/unpublish stream.
|
||||
'''
|
||||
class RESTStreams(object):
|
||||
exposed = True
|
||||
|
||||
def GET(self):
|
||||
enable_crossdomain()
|
||||
|
||||
streams = {}
|
||||
return json.dumps(streams)
|
||||
|
||||
'''
|
||||
for SRS hook: on_publish/on_unpublish
|
||||
on_publish:
|
||||
when client(encoder) publish to vhost/app/stream, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_publish",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"stream": "livestream"
|
||||
}
|
||||
on_unpublish:
|
||||
when client(encoder) stop publish to vhost/app/stream, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_unpublish",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"stream": "livestream"
|
||||
}
|
||||
if valid, the hook must return HTTP code 200(Stauts OK) and response
|
||||
an int value specifies the error code(0 corresponding to success):
|
||||
0
|
||||
'''
|
||||
def POST(self):
|
||||
enable_crossdomain()
|
||||
|
||||
# return the error code in str
|
||||
code = Error.success
|
||||
|
||||
req = cherrypy.request.body.read()
|
||||
trace("post to streams, req=%s"%(req))
|
||||
try:
|
||||
json_req = json.loads(req)
|
||||
except Exception, ex:
|
||||
code = Error.system_parse_json
|
||||
trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code))
|
||||
return str(code)
|
||||
|
||||
action = json_req["action"]
|
||||
if action == "on_publish":
|
||||
code = self.__on_publish(json_req)
|
||||
elif action == "on_unpublish":
|
||||
code = self.__on_unpublish(json_req)
|
||||
else:
|
||||
trace("invalid request action: %s"%(json_req["action"]))
|
||||
code = Error.request_invalid_action
|
||||
|
||||
return str(code)
|
||||
|
||||
def OPTIONS(self):
|
||||
enable_crossdomain()
|
||||
|
||||
def __on_publish(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s, stream=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"], req["stream"]
|
||||
))
|
||||
|
||||
# TODO: process the on_publish event
|
||||
|
||||
return code
|
||||
|
||||
def __on_unpublish(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s, stream=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"], req["stream"]
|
||||
))
|
||||
|
||||
# TODO: process the on_unpublish event
|
||||
|
||||
return code
|
||||
|
||||
'''
|
||||
handle the sessions requests: client play/stop stream
|
||||
'''
|
||||
class RESTSessions(object):
|
||||
exposed = True
|
||||
|
||||
def GET(self):
|
||||
enable_crossdomain()
|
||||
|
||||
sessions = {}
|
||||
return json.dumps(sessions)
|
||||
|
||||
'''
|
||||
for SRS hook: on_play/on_stop
|
||||
on_play:
|
||||
when client(encoder) publish to vhost/app/stream, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_play",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"stream": "livestream"
|
||||
}
|
||||
on_stop:
|
||||
when client(encoder) stop publish to vhost/app/stream, call the hook,
|
||||
the request in the POST data string is a object encode by json:
|
||||
{
|
||||
"action": "on_stop",
|
||||
"client_id": 1985,
|
||||
"ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",
|
||||
"stream": "livestream"
|
||||
}
|
||||
if valid, the hook must return HTTP code 200(Stauts OK) and response
|
||||
an int value specifies the error code(0 corresponding to success):
|
||||
0
|
||||
'''
|
||||
def POST(self):
|
||||
enable_crossdomain()
|
||||
|
||||
# return the error code in str
|
||||
code = Error.success
|
||||
|
||||
req = cherrypy.request.body.read()
|
||||
trace("post to sessions, req=%s"%(req))
|
||||
try:
|
||||
json_req = json.loads(req)
|
||||
except Exception, ex:
|
||||
code = Error.system_parse_json
|
||||
trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code))
|
||||
return str(code)
|
||||
|
||||
action = json_req["action"]
|
||||
if action == "on_play":
|
||||
code = self.__on_play(json_req)
|
||||
elif action == "on_stop":
|
||||
code = self.__on_stop(json_req)
|
||||
else:
|
||||
trace("invalid request action: %s"%(json_req["action"]))
|
||||
code = Error.request_invalid_action
|
||||
|
||||
return str(code)
|
||||
|
||||
def OPTIONS(self):
|
||||
enable_crossdomain()
|
||||
|
||||
def __on_play(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s, stream=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"], req["stream"]
|
||||
))
|
||||
|
||||
# TODO: process the on_play event
|
||||
|
||||
return code
|
||||
|
||||
def __on_stop(self, req):
|
||||
code = Error.success
|
||||
|
||||
trace("srs %s: client id=%s, ip=%s, vhost=%s, app=%s, stream=%s"%(
|
||||
req["action"], req["client_id"], req["ip"], req["vhost"], req["app"], req["stream"]
|
||||
))
|
||||
|
||||
# TODO: process the on_stop event
|
||||
|
||||
return code
|
||||
|
||||
# HTTP RESTful path.
|
||||
class Root(object):
|
||||
def __init__(self):
|
||||
|
@ -123,6 +333,8 @@ class Api(object):
|
|||
class V1(object):
|
||||
def __init__(self):
|
||||
self.clients = RESTClients()
|
||||
self.streams = RESTStreams()
|
||||
self.sessions = RESTSessions()
|
||||
|
||||
'''
|
||||
main code start.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue