123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- 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.SatIp
- {
- /// <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;
- }
- }
- }
|