59 lines
1.4 KiB
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;
|
|
}
|
|
}
|