stream-deploy/ZLM/3rdpart/media-server/librtsp/source/client/rtsp-client-options.c

59 lines
1.4 KiB
C++

/*
C->S:
OPTIONS * RTSP/1.0
CSeq: 1
Require: implicit-play
Proxy-Require: gzipped-messages
S->C:
RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
*/
#include "rtsp-client-internal.h"
static const char* sc_format =
"OPTIONS * RTSP/1.0\r\n"
"CSeq: %u\r\n"
"%s" // "Require: implicit-play\r\n"
"%s" // "Session: xxx\r\n"
"User-Agent: %s\r\n"
"\r\n";
int rtsp_client_options(struct rtsp_client_t *rtsp, const char* commands)
{
int r = 0;
char require[128];
char session[128];
rtsp->state = RTSP_OPTIONS;
require[0] = session[0] = '\0';
if ((commands && commands[0] && sizeof(require) <= snprintf(require, sizeof(require), "Require: %s\r\n", commands))
|| (rtsp->media_count > 0 && *rtsp->session[0].session && sizeof(session) <= snprintf(session, sizeof(session) - 1, "Session: %s\r\n", rtsp->session[0].session)))
return -1;
r = snprintf(rtsp->req, sizeof(rtsp->req), sc_format, rtsp->cseq++, require, session, USER_AGENT);
return (r > 0 && r < sizeof(rtsp->req) && r == rtsp->handler.send(rtsp->param, rtsp->uri, rtsp->req, r)) ? 0 : -1;
}
int rtsp_client_options_onreply(struct rtsp_client_t* rtsp, void* parser)
{
int code;
const char *methods;
assert(RTSP_OPTIONS == rtsp->state);
code = http_get_status_code(parser);
if (200 == code)
{
methods = http_get_header_by_name(parser, "Public");
(void)methods; // TODO: check support methods
return 0; // next step
}
else
{
return -1;
}
}