X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fstream_out%2Frtsp.c;h=30e35526bc87da2150294ab9287a93cafb915265;hb=32c874662a6ba2f05edd7d5a0206a7719ddf1a03;hp=8437c7379a04d4c7bcac8738c6ae4e413d643507;hpb=fe182634ea51564a9f1374eb337b27890da15ef0;p=vlc diff --git a/modules/stream_out/rtsp.c b/modules/stream_out/rtsp.c index 8437c7379a..30e35526bc 100644 --- a/modules/stream_out/rtsp.c +++ b/modules/stream_out/rtsp.c @@ -30,7 +30,7 @@ # include "config.h" #endif -#include +#include #include #include @@ -138,6 +138,8 @@ void RtspUnsetup( rtsp_stream_t *rtsp ) free( rtsp->psz_path ); vlc_mutex_destroy( &rtsp->lock ); + + free( rtsp ); } @@ -348,6 +350,9 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, const char *psz_session = NULL, *psz; char control[sizeof("rtsp://[]:12345") + NI_MAXNUMERICHOST + strlen( rtsp->psz_path )]; + time_t now; + + time (&now); if( answer == NULL || query == NULL || cl == NULL ) return VLC_SUCCESS; @@ -376,6 +381,22 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, answer->i_body = 0; answer->p_body = NULL; + httpd_MsgAdd( answer, "Server", "%s", PACKAGE_STRING ); + + /* Date: is always allowed, and sometimes mandatory with RTSP/2.0. */ + struct tm ut; + if (gmtime_r (&now, &ut) != NULL) + { /* RFC1123 format, GMT is mandatory */ + static const char wdays[7][4] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static const char mons[12][4] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + httpd_MsgAdd (answer, "Date", "%s, %02u %s %04u %02u:%02u:%02u GMT", + wdays[ut.tm_wday], ut.tm_mday, mons[ut.tm_mon], + 1900 + ut.tm_year, ut.tm_hour, ut.tm_min, ut.tm_sec); + } + if( query->i_proto != HTTPD_PROTO_RTSP ) { answer->i_status = 505; @@ -600,6 +621,14 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, rtsp_session_t *ses; answer->i_status = 200; + psz_session = httpd_MsgGet( query, "Session" ); + const char *range = httpd_MsgGet (query, "Range"); + if (range && strncmp (range, "npt=", 4)) + { + answer->i_status = 501; + break; + } + vlc_mutex_lock( &rtsp->lock ); ses = RtspClientGet( rtsp, psz_session ); if( ses != NULL ) @@ -633,7 +662,6 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, } vlc_mutex_unlock( &rtsp->lock ); - httpd_MsgAdd( answer, "Range", "npt=now-" ); if( httpd_MsgGet( query, "Scale" ) != NULL ) httpd_MsgAdd( answer, "Scale", "1." ); break; @@ -689,7 +717,6 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, return VLC_EGENERIC; } - httpd_MsgAdd( answer, "Server", "%s", PACKAGE_STRING ); if( psz_session ) httpd_MsgAdd( answer, "Session", "%s"/*;timeout=5*/, psz_session );