stream-deploy/ZLM/3rdpart/media-server/librtsp/source/rtsp-header-session.c

71 lines
1.8 KiB
C++

// RFC 2326 Real Time Streaming Protocol (RTSP)
//
// 12.37 Session (p57)
// Session = "Session" ":" session-id [ ";" "timeout" "=" delta-seconds ]
//
#include "rtsp-header-session.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int rtsp_header_session(const char* field, struct rtsp_header_session_t* session)
{
const char* p;
// RFC2326 12.37 Session (p57)
// The timeout is measured in seconds, with a default of 60 seconds (1 minute).
session->timeout = 60000;
p = strchr(field, ';');
if(p)
{
size_t n = (size_t)(p - field);
if(n >= sizeof(session->session))
return -1;
memcpy(session->session, field, n);
session->session[n] = '\0';
for (++p; ' ' == *p; p++); // skip blank
if(0 == strncmp("timeout=", p, 8))
session->timeout = (int)(atof(p+8) * 1000);
}
else
{
#if defined(OS_MAC)
strlcpy(session->session, field, sizeof(session->session));
#else
size_t n = strlen(field);
if(n >= sizeof(session->session))
return -1;
memcpy(session->session, field, n);
session->session[n] = '\0';
#endif
}
return 0;
}
#if defined(DEBUG) || defined(_DEBUG)
void rtsp_header_session_test(void)
{
struct rtsp_header_session_t session;
char id1[sizeof(session.session)];
char id2[sizeof(session.session)+10];
assert(0 == rtsp_header_session("47112344", &session));
assert(0 == strcmp("47112344", session.session) && 60000 == session.timeout);
assert(0 == rtsp_header_session("47112344;timeout=10.1", &session));
assert(0 == strcmp("47112344", session.session) && 10100 == session.timeout);
assert(0 == rtsp_header_session("47112344; timeout=10.1", &session));
assert(0 == strcmp("47112344", session.session) && 10100 == session.timeout);
memset(id1, '1', sizeof(id1));
memset(id2, '1', sizeof(id2));
id1[sizeof(session.session)-1] = '\0';
assert(0 != rtsp_header_session(id2, &session));
}
#endif