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.
jellyfin/MediaBrowser.Server.Impleme.../LiveTv/TunerHosts/SatIp/Rtsp/RtspResponse.cs

150 lines
4.5 KiB

/*
Copyright (C) <2007-2016> <Kay Diefenthal>
SatIp.RtspSample is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SatIp.RtspSample is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SatIp.RtspSample. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.Rtsp
{
/// <summary>
/// A simple class that can be used to deserialise RTSP responses.
/// </summary>
public class RtspResponse
{
private static readonly Regex RegexStatusLine = new Regex(@"RTSP/(\d+)\.(\d+)\s+(\d+)\s+([^.]+?)\r\n(.*)", RegexOptions.Singleline);
private int _majorVersion = 1;
private int _minorVersion;
private RtspStatusCode _statusCode;
private string _reasonPhrase;
private IDictionary<string, string> _headers;
private string _body;
/// <summary>
/// Initialise a new instance of the <see cref="RtspResponse"/> class.
/// </summary>
private RtspResponse()
{
}
/// <summary>
/// Get the response major version number.
/// </summary>
public int MajorVersion
{
get
{
return _majorVersion;
}
}
/// <summary>
/// Get the response minor version number.
/// </summary>
public int MinorVersion
{
get
{
return _minorVersion;
}
}
/// <summary>
/// Get the response status code.
/// </summary>
public RtspStatusCode StatusCode
{
get
{
return _statusCode;
}
}
/// <summary>
/// Get the response reason phrase.
/// </summary>
public string ReasonPhrase
{
get
{
return _reasonPhrase;
}
}
/// <summary>
/// Get the response headers.
/// </summary>
public IDictionary<string, string> Headers
{
get
{
return _headers;
}
}
/// <summary>
/// Get the response body.
/// </summary>
public string Body
{
get
{
return _body;
}
set
{
_body = value;
}
}
/// <summary>
/// Deserialise/parse an RTSP response.
/// </summary>
/// <param name="responseBytes">The raw response bytes.</param>
/// <param name="responseByteCount">The number of valid bytes in the response.</param>
/// <returns>a response object</returns>
public static RtspResponse Deserialise(byte[] responseBytes, int responseByteCount)
{
var response = new RtspResponse();
var responseString = Encoding.UTF8.GetString(responseBytes, 0, responseByteCount);
var m = RegexStatusLine.Match(responseString);
if (m.Success)
{
response._majorVersion = int.Parse(m.Groups[1].Captures[0].Value);
response._minorVersion = int.Parse(m.Groups[2].Captures[0].Value);
response._statusCode = (RtspStatusCode)int.Parse(m.Groups[3].Captures[0].Value);
response._reasonPhrase = m.Groups[4].Captures[0].Value;
responseString = m.Groups[5].Captures[0].Value;
}
var sections = responseString.Split(new[] { "\r\n\r\n" }, StringSplitOptions.None);
response._body = sections[1];
var headers = sections[0].Split(new[] { "\r\n" }, StringSplitOptions.None);
response._headers = new Dictionary<string, string>();
foreach (var headerInfo in headers.Select(header => header.Split(':')))
{
response._headers.Add(headerInfo[0], headerInfo[1].Trim());
}
return response;
}
}
}