You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.8KB

  1. // RFC 2326 Real Time Streaming Protocol (RTSP)
  2. //
  3. // 12.37 Session (p57)
  4. // Session = "Session" ":" session-id [ ";" "timeout" "=" delta-seconds ]
  5. //
  6. #include "rtsp-header-session.h"
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10. int rtsp_header_session(const char* field, struct rtsp_header_session_t* session)
  11. {
  12. const char* p;
  13. // RFC2326 12.37 Session (p57)
  14. // The timeout is measured in seconds, with a default of 60 seconds (1 minute).
  15. session->timeout = 60000;
  16. p = strchr(field, ';');
  17. if(p)
  18. {
  19. size_t n = (size_t)(p - field);
  20. if(n >= sizeof(session->session))
  21. return -1;
  22. memcpy(session->session, field, n);
  23. session->session[n] = '\0';
  24. for (++p; ' ' == *p; p++); // skip blank
  25. if(0 == strncmp("timeout=", p, 8))
  26. session->timeout = (int)(atof(p+8) * 1000);
  27. }
  28. else
  29. {
  30. #if defined(OS_MAC)
  31. strlcpy(session->session, field, sizeof(session->session));
  32. #else
  33. size_t n = strlen(field);
  34. if(n >= sizeof(session->session))
  35. return -1;
  36. memcpy(session->session, field, n);
  37. session->session[n] = '\0';
  38. #endif
  39. }
  40. return 0;
  41. }
  42. #if defined(DEBUG) || defined(_DEBUG)
  43. void rtsp_header_session_test(void)
  44. {
  45. struct rtsp_header_session_t session;
  46. char id1[sizeof(session.session)];
  47. char id2[sizeof(session.session)+10];
  48. assert(0 == rtsp_header_session("47112344", &session));
  49. assert(0 == strcmp("47112344", session.session) && 60000 == session.timeout);
  50. assert(0 == rtsp_header_session("47112344;timeout=10.1", &session));
  51. assert(0 == strcmp("47112344", session.session) && 10100 == session.timeout);
  52. assert(0 == rtsp_header_session("47112344; timeout=10.1", &session));
  53. assert(0 == strcmp("47112344", session.session) && 10100 == session.timeout);
  54. memset(id1, '1', sizeof(id1));
  55. memset(id2, '1', sizeof(id2));
  56. id1[sizeof(session.session)-1] = '\0';
  57. assert(0 != rtsp_header_session(id2, &session));
  58. }
  59. #endif