protected void PositionInfoSink(CpAVTransport sender, UInt32 InstanceID, UInt32 Track, string TrackDuration, string TrackMetaData, string TrackURI, string RelTime, string AbsTime, int RelCount, int AbsCount, UPnPInvokeException e, object Handle) { DText p = new DText(); p.ATTRMARK = ":"; try { p[0] = TrackDuration; _CurrentDuration = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); } catch (Exception) { } try { p[0] = RelTime; _CurrentPosition = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); } catch (Exception) { } if (OnCurrentPositionChanged != null) { OnCurrentPositionChanged(this); } _CurrentTrack = Track; this._TrackURI = HTTPMessage.UnEscapeString(TrackURI); if (this.OnTrackURIChanged != null) { OnTrackURIChanged(this); } if (OnCurrentTrackChanged != null) { OnCurrentTrackChanged(this); } lock (this) { --StateCounter; if (StateCounter == 0) { if (OnReady != null) { OnReady(this); } } } }
protected override void RunAlice() { MemoryStream msStream = new MemoryStream(); NetworkStream sIn = StreamAlice; NetworkStream sOut = StreamBob; try { while (bSouldRun) { int iLen = 0; HTTPRequest htreq = new eExNetworkLibrary.HTTP.HTTPRequest(sIn, out iLen); HTTPMessage htreqForward = ModifyRequest(htreq); if (htreqForward != null) { byte[] bData = htreqForward.RawBytes; sOut.Write(bData, 0, bData.Length); sOut.Flush(); } } } catch (HTTPParserStreamEndedException ex) { } catch (ObjectDisposedException ex) { throw new NetworkStreamModifierException("A network stream was forcibly closed, but " + this.ToString() + " still had data to write.", ex); } }
private HTTPMessage Request(Uri GetUri, bool isGetRequest, bool isHttp1_1) { directiveObjTextBox.Text = GetUri.PathAndQuery; IPAddress Addr = null; try { if (GetUri.HostNameType == UriHostNameType.Dns) { Addr = Dns.GetHostEntry(GetUri.Host).AddressList[0]; } else { Addr = IPAddress.Parse(GetUri.Host); } } catch (Exception) { return(null); } if (Addr == null) { return(null); } IPEndPoint ep = new IPEndPoint(Addr, GetUri.Port); // NKIDD - ADDED support for requesting GET/HEAD 1.0/1.1 HTTPMessage req = null; if (isHttp1_1) { req = new HTTPMessage(); } else { req = new HTTPMessage("1.0"); } if (isGetRequest) { req.Directive = "GET"; } else { req.Directive = "HEAD"; } req.DirectiveObj = HTTPMessage.UnEscapeString(GetUri.PathAndQuery); req.AddTag("Host", ep.ToString()); this.Text = "Device Sniffer - " + GetUri.AbsoluteUri; SniffText.Text = ""; GetText.Text = ""; return(req); }
protected void SniffPacketSink(UPnPService sender, HTTPMessage MSG) { if (OnSniffPacket != null) { OnSniffPacket(this, MSG); } }
protected override void RunBob() { MemoryStream msStream = new MemoryStream(); NetworkStream sIn = StreamBob; NetworkStream sOut = StreamAlice; try { while (bSouldRun) { HTTPResponse htrsp = new HTTPResponse(sIn); HTTPMessage htrspForward = ModifyResponse(htrsp); if (htrspForward != null) { byte[] bData = htrspForward.RawBytes; sOut.Write(bData, 0, bData.Length); sOut.Flush(); } } } catch (HTTPParserStreamEndedException ex) { } catch (ObjectDisposedException ex) { throw new NetworkStreamModifierException("A network stream was forcibly closed, but " + this.ToString() + " still had data to write.", ex); } }
protected void GetMediaInfoSink(System.UInt32 InstanceID, out System.UInt32 NrTracks, out System.String MediaDuration, out System.String CurrentURI, out System.String CurrentURIMetaData, out System.String NextURI, out System.String NextURIMetaData, out DvAVTransport.Enum_PlaybackStorageMedium PlayMedium, out DvAVTransport.Enum_RecordStorageMedium RecordMedium, out DvAVTransport.Enum_RecordMediumWriteStatus WriteStatus) { if (ID_Table.ContainsKey(InstanceID) == false) { throw(new UPnPCustomException(802, InstanceID.ToString() + " is not a valid InstanceID")); } else { AVConnection c = (AVConnection)ID_Table[InstanceID]; NrTracks = c._NumberOfTracks; MediaDuration = string.Format("{0:00}", c._Duration.Hours) + ":" + string.Format("{0:00}", c._Duration.Minutes) + ":" + string.Format("{0:00}", c._Duration.Seconds); if (c._CurrentURI == null) { CurrentURI = ""; } else { CurrentURI = HTTPMessage.UnEscapeString(c._CurrentURI.AbsoluteUri); } if (c._NextURI == null) { NextURI = ""; } else { NextURI = HTTPMessage.UnEscapeString(c._NextURI.AbsoluteUri); } CurrentURIMetaData = c._CurrentURIMetaData; NextURIMetaData = c._NextURIMetaData; PlayMedium = c._PlaybackMedium; RecordMedium = c._RecordMedium; WriteStatus = c._WriteStatus; } }
private string ConvertLocalFileToHTTPResource(IMediaResource resource) { if (resource.ContentUri.StartsWith(MediaResource.AUTOMAPFILE)) { // Map File string tempName = resource.ContentUri.Substring(MediaResource.AUTOMAPFILE.Length); string fileName = tempName.GetHashCode().ToString() + "/" + tempName.Substring(tempName.LastIndexOf("\\") + 1); if (resource.Owner != null) { fileName = tempName.GetHashCode().ToString() + "/" + resource.Owner.Creator + " - " + resource.Owner.Title + tempName.Substring(tempName.LastIndexOf(".")); // fileName = tempName.GetHashCode().ToString() + "/" + tempName.Substring(tempName.LastIndexOf(".")); } FileInfoTable[tempName.GetHashCode().ToString()] = tempName; CheckMiniWebServer(); string path = "http://" + _AVR.device.InterfaceToHost.ToString() + ":" + MWS.LocalIPEndPoint.Port.ToString() + "/" + fileName; return(HTTPMessage.EscapeString(path)); } else { // Don't Map File return(resource.ContentUri); } }
private void SendErrorMessage(HTTPSession webSession, Stream stream) { try { if (stream != null) { webSession.CloseStreamObject(stream); stream.Dispose(); stream = null; } HTTPMessage error = new HTTPMessage(); error.StatusCode = 404; error.StatusData = "Error"; error.StringBuffer = "Error"; webSession.Send(error); } catch (Exception ex) { Utils.WriteException(ex); } finally { AllowSystemStandBy(); } }
private void MSEARCHSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, HeadPointer, BufferSize); DText P = new DText(); string USN = msg.GetTag("USN"); string UDN; if (USN.IndexOf("::") != -1) { UDN = USN.Substring(0, USN.IndexOf("::")); } else { UDN = USN; } UDN = UDN.Substring(5); sender.BufferBeginPointer = BufferSize; if (TestDevice.GetDevice(UDN) == null) { return; } lock (MSEARCHTable) { this.sample += "\r\n" + msg.GetTag("ST"); MSEARCHTable[msg.GetTag("ST").Trim()] = ""; } }
public override bool IsMatch(HTTPMessage httpMessage) { bool bResult = false; if (httpMessage.MessageType == HTTPMessageType.Response && EvaluateRequestForResponse && bLastRequestWasMatch) { bResult = true; } else { foreach (HTTPHeader hHeader in httpMessage.Headers[Header]) { if (System.Text.RegularExpressions.Regex.IsMatch(hHeader.Value, Pattern)) { bResult = true; break; } } if (httpMessage.MessageType == HTTPMessageType.Request) { bLastRequestWasMatch = bResult; } } bool bBaseResult = base.IsMatch(httpMessage); return(bResult && bBaseResult); }
private void ReceiveSink2(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, 0, BufferSize); if (msg.Directive != "NOTIFY") { sender.BufferBeginPointer = BufferSize; return; } string USN = msg.GetTag("USN"); string UDN; if (USN.IndexOf("::") != -1) { UDN = USN.Substring(0, USN.IndexOf("::")); } else { UDN = USN; } UDN = UDN.Substring(5); if (msg.GetTag("NTS").Trim() == "ssdp:alive") { if (TestDevice.GetDevice(UDN) != null) { NotifyTable[msg.GetTag("NT")] = DateTime.Now; } } sender.BufferBeginPointer = BufferSize; }
private void ReceiveSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { DateTime EndTime = DateTime.Now; DText P = new DText(); HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, 0, BufferSize); string USN = msg.GetTag("USN"); string UDN = USN; if (USN.IndexOf("::") != -1) { UDN = USN.Substring(0, USN.IndexOf("::")); } UDN = UDN.Substring(5); sender.BufferBeginPointer = BufferSize; if (UDN != TestDevice.UniqueDeviceName) { return; } string cc = msg.GetTag("Cache-Control"); P.ATTRMARK = "="; P[0] = cc; cc = P[2].Trim(); this.Cache = int.Parse(cc); DPA.AddDataPoint(EndTime.Subtract(StartTime)); MRE.Set(); }
public void AddPacket(HTTPMessage packet) { packets.Add(packet); if (this.OnPacketTraceChanged != null) { OnPacketTraceChanged(this, packet); } }
/// <summary> /// This method returns a resource URI in string form, such that the /// URI is not a URI using the /// <see cref="MediaResource.AUTOMAPFILE"/> /// protocol. /// </summary> /// <param name="baseUri">the base http URL. If null, then the original local path is printed. If empty string, then only the relative portion of URI is printed.</param> /// <returns>A URI not using the /// <see cref="MediaResource.AUTOMAPFILE"/> /// protocol. /// </returns> internal string EnsureNonAutoMapProtocol(string baseUri) { IUPnPMedia item = this.m_Owner; if (this.ContentUri.StartsWith(AUTOMAPFILE)) { if (baseUri == null) { return(this.ContentUri); } if (this.m_LocalFileExists) { StringBuilder uri = new StringBuilder(this.ContentUri.Length); int dotpos = this.ContentUri.LastIndexOf('.'); string ext = ""; if (this.OverrideFileExtenstion == null) { if ((dotpos > 0) && (dotpos < this.ContentUri.Length - 1)) { ext = this.ContentUri.Substring(dotpos); } int querypos = ext.IndexOf('?'); if ((querypos > 0) && (querypos < ext.Length - 1)) { ext = ext.Substring(0, querypos); } } else { if (this.OverrideFileExtenstion.StartsWith(".")) { ext = this.OverrideFileExtenstion; } else { ext = "." + this.OverrideFileExtenstion; } } uri.Append(baseUri); uri.AppendFormat("/{0}/{1}/{2} - {3}{4}", this.m_ResourceID, item.ID, item.Creator, item.Title, ext); string uriString = HTTPMessage.EscapeString(uri.ToString()); return(uriString); } else { return(""); } } else { return(this.ContentUri); } }
private void BadMSEARCHSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, HeadPointer, BufferSize); if (remote.Address.ToString() == TestDevice.RemoteEndPoint.Address.ToString()) { lock (MSEARCHTable) { MSEARCHTable[remote.Address.ToString()] = msg; } } }
private void SubscribeSink(HTTPRequest sender, HTTPMessage MSG, object Tag) { if (MSG != null) { AddPacket(MSG); if (MSG.StatusCode == 200) { SID = MSG.GetTag("SID"); } } MRE.Set(); }
public override bool IsMatch(HTTPMessage httpMessage) { bool bResult = false; if (httpMessage.Headers.Contains("Content-Type")) { bResult = httpMessage.Headers["Content-Type"][0].Value.ToLower().Contains("image"); } bool bBaseResult = base.IsMatch(httpMessage); return(bResult && bBaseResult); }
private void CancelSink(HTTPRequest sender, HTTPMessage MSG, object Tag) { if (MSG != null) { AddPacket(MSG); if (MSG.StatusCode == 200) { SID = "CANCELED"; } } MRE.Set(); }
public HTTPMessage HandleContent(string GetWhat, System.Net.IPEndPoint local, HTTPMessage msg, HTTPSession WebSession) { System.Diagnostics.Debug.WriteLine("HandleContent GetWhat = '" + GetWhat + "'"); HTTPMessage message = new HTTPMessage(); message.StatusCode = 200; message.StatusData = "OK"; string tagData = "text/xml"; message.BodyBuffer = new System.Text.ASCIIEncoding().GetBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?><blah>" + GetWhat + "</blah>"); message.AddTag("Content-Type", tagData); WebSession.Send(message); return(null); }
private void grabHttpPacket(XmlElement packetElement) { string packetString = packetElement.InnerText; System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(); System.Text.Encoder utf8Enc = utf8.GetEncoder(); char [] packetChars = packetString.ToCharArray(); int len = packetChars.Length; byte [] packetBytes = new byte[len]; utf8Enc.GetBytes(packetChars, 0, len, packetBytes, 0, true); HTTPMessage m = HTTPMessage.ParseByteArray(packetBytes); packets.Add(m); }
private HTTPMessage[] MSEARCH(UPnPDevice device) { ArrayList PacketList = new ArrayList(); foreach (UPnPDevice d in device.EmbeddedDevices) { foreach (HTTPMessage m in MSEARCH(d)) { PacketList.Add(m); } } HTTPMessage rq; rq = new HTTPMessage(); rq.Directive = "M-SEARCH"; rq.DirectiveObj = "*"; rq.AddTag("MX", "5"); rq.AddTag("ST", "uuid:" + device.UniqueDeviceName); rq.AddTag("Host", "239.255.255.250:1900"); rq.AddTag("MAN", "\"ssdp:discover\""); PacketList.Add(rq); rq = new HTTPMessage(); rq.Directive = "M-SEARCH"; rq.DirectiveObj = "*"; rq.AddTag("MX", "5"); rq.AddTag("ST", device.DeviceURN); rq.AddTag("Host", "239.255.255.250:1900"); rq.AddTag("MAN", "\"ssdp:discover\""); PacketList.Add(rq); foreach (UPnPService s in device.Services) { rq = new HTTPMessage(); rq.Directive = "M-SEARCH"; rq.DirectiveObj = "*"; rq.AddTag("MX", "5"); rq.AddTag("ST", s.ServiceURN); rq.AddTag("Host", "239.255.255.250:1900"); rq.AddTag("MAN", "\"ssdp:discover\""); PacketList.Add(rq); } return((HTTPMessage[])PacketList.ToArray(typeof(HTTPMessage))); }
public void Search(string SearchString, IPEndPoint ep) { HTTPMessage request = new HTTPMessage(); request.Directive = "M-SEARCH"; request.DirectiveObj = "*"; if (ep.AddressFamily == AddressFamily.InterNetwork) { request.AddTag("HOST", ep.ToString()); // "239.255.255.250:1900" } if (ep.AddressFamily == AddressFamily.InterNetworkV6) { request.AddTag("HOST", string.Format("[{0}]:{1}", ep.Address.ToString(), ep.Port)); // "[FF05::C]:1900" or "[FF02::C]:1900" } request.AddTag("MAN", "\"ssdp:discover\""); request.AddTag("MX", "10"); request.AddTag("ST", SearchString); SearchEx(System.Text.UTF8Encoding.UTF8.GetBytes(request.StringPacket), ep); }
/// <summary> /// Checkes whether this rule matches a given message. /// </summary> /// <param name="httpMessage">The HTTP message to match</param> public virtual bool IsMatch(HTTPMessage httpMessage) { bool bResult = false; lock (lChildRules) { if (lChildRules.Count == 0) { return(true); //Nothing to validate } foreach (HTTPStreamModifierCondition htCondition in lChildRules) { if (htCondition.IsMatch(httpMessage)) { bResult = true; } } } return(bResult); }
private UserAgent GetUserAgent() { HTTPMessage headers = GetUPnPService().GetWebSession().Headers; if (headers != null) { string userAgent = headers.GetTag("User-Agent"); if (!String.IsNullOrWhiteSpace(userAgent)) { if (userAgent.Contains("fbxupnpav/6.0")) { return(UserAgent.FreeboxV6); } if (userAgent.Contains("fbxupnpav/1.0") || userAgent.Contains("libfbxhttp")) { return(UserAgent.FreeboxV5); } } } return(UserAgent.Other); }
public override HTTPMessage ApplyAction(HTTPMessage httpMessage) { ImageFormat imgFormat = GetImageFormat(httpMessage.Headers["Content-Type"][0].Value.ToLower()); if (imgFormat == null) { throw new InvalidOperationException("Unknown image format " + httpMessage.Headers["Content-Type"][0].Value); } Bitmap img = new Bitmap(new MemoryStream(httpMessage.Payload)); img = ModifyImage(img); MemoryStream msSave = new MemoryStream(); img.Save(msSave, imgFormat); httpMessage.Payload = msSave.ToArray(); img.Dispose(); msSave.Dispose(); return(httpMessage); }
private void AddHTTPMessage(HTTPMessage msg) { AddPacket(msg); }
private void SniffPacketSink(UPnPServiceWatcher sender, HTTPMessage MSG) { AddPacket(MSG); }
/// <summary> /// Applys an actions to this HTTP Message /// </summary> /// <param name="httpMessage">The HTTP message to edit</param> /// <returns>The edited HTTP message</returns> public abstract HTTPMessage ApplyAction(HTTPMessage httpMessage);
private HTTPMessage Request() { HTTPMessage RetVal = null; if (this.Visible == false) { Show(); } else { Activate(); } Uri uri; try { uri = new Uri(addressTextBox.Text); } catch { SniffText.Text = "Invalid Request URI"; GetText.Text = "Invalid Request URI"; return(null); } SniffText.Text = ""; GetText.Text = ""; if (MethodBox.SelectedIndex == 0) { // GET 1.0 RetVal = Request(uri, true, false); } else if (MethodBox.SelectedIndex == 1) { // GET 1.1 RetVal = Request(uri, true, true); } else if (MethodBox.SelectedIndex == 2) { // HEAD 1.0 RetVal = Request(uri, false, false); } else if (MethodBox.SelectedIndex == 3) { // HEAD 1.1 RetVal = Request(uri, false, true); } else if (MethodBox.SelectedIndex == 4) { HTTPMessage msg = new HTTPMessage(); msg.Directive = directiveTextBox.Text; msg.DirectiveObj = directiveObjTextBox.Text; if (versionComboBox.SelectedIndex == 0) { msg.Version = "0.9"; } if (versionComboBox.SelectedIndex == 1) { msg.Version = "1.0"; } if (versionComboBox.SelectedIndex == 2) { msg.Version = "1.1"; } try { bool addreturn = false; if (fieldsTextBox.Text.EndsWith("\r\n") == false) { fieldsTextBox.Text += "\r\n"; addreturn = true; } int pos = 0; while (pos != -1) { int s1 = fieldsTextBox.Text.IndexOf(":", pos); int s2 = fieldsTextBox.Text.IndexOf("\r\n", pos); if (s1 == -1 || s2 == -1) { break; } msg.AppendTag(fieldsTextBox.Text.Substring(pos, s1 - pos), fieldsTextBox.Text.Substring(s1 + 1, s2 - s1 - 1)); pos = s2 + 2; } if (addreturn == true) { fieldsTextBox.Text = fieldsTextBox.Text.Substring(0, fieldsTextBox.Text.Length - 2); } } catch { } msg.StringBuffer = bodyTextBox.Text; RetVal = msg; } if (RetVal == null) { SniffText.Text = "Invalid Request URI"; GetText.Text = "Invalid Request URI"; } return(RetVal); }
private void ReceiveSink(HTTPSession sender, HTTPMessage msg) { GetText.Text = msg.StringPacket; }
/// <summary> /// This method gets called when a new Request is received /// </summary> /// <param name="request"></param> /// <param name="WebSession"></param> protected void ReceiveSink(HTTPMessage request, HTTPSession WebSession) { HTTPMessage rsp = new HTTPMessage(); UTF8Encoding U = new UTF8Encoding(); if ((request.Directive == "HEAD") || (request.Directive == "GET")) { if (request.DirectiveObj == "/item.m3u") {/* rsp.StatusCode = 200; rsp.StatusData = "OK"; rsp.ContentType = "audio/mpegurl"; rsp.StringBuffer = M3UString; */ string r = request.GetTag("Range"); if (r == "") { rsp.StatusCode = 200; rsp.StatusData = "OK"; rsp.ContentType = "audio/mpegurl"; rsp.StringBuffer = M3UString; } else { rsp.StatusCode = 206; rsp.StatusData = "Partial Content"; rsp.ContentType = "audio/mpegurl"; DText rp0 = new DText(); rp0.ATTRMARK = "="; rp0[0] = r; DText rp = new DText(); rp.ATTRMARK = "-"; rp[0] = rp0[2].Trim(); if (rp[1] == "") { // LastBytes try { if (int.Parse(rp[2]) > M3UString.Length) { rsp.AddTag("Content-Range", "bytes 0-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString()); rsp.StringBuffer = M3UString; } else { rsp.AddTag("Content-Range", "bytes " + (M3UString.Length - int.Parse(rp[2])).ToString() + "-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString()); rsp.StringBuffer = M3UString.Substring(M3UString.Length - int.Parse(rp[2])); } } catch (Exception) { rsp = new HTTPMessage(); rsp.StatusCode = 400; rsp.StatusData = "Bad Request"; } } else if (rp[2] == "") { // Offset till end try { rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString()); rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1])); } catch (Exception) { rsp = new HTTPMessage(); rsp.StatusCode = 400; rsp.StatusData = "Bad Request"; } } else { // Range try { if (int.Parse(rp[2]) > M3UString.Length + 1) { rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + (M3UString.Length - 1).ToString() + "/" + M3UString.Length.ToString()); rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1])); } else { rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + rp[2] + "/" + M3UString.Length.ToString()); rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1]), 1 + int.Parse(rp[2]) - int.Parse(rp[1])); } } catch (Exception) { rsp = new HTTPMessage(); rsp.StatusCode = 400; rsp.StatusData = "Bad Request"; } } } } else { try { int i = request.DirectiveObj.LastIndexOf("/"); string tmp = request.DirectiveObj.Substring(1, i - 1); bool hasRange = true; if (tmp.IndexOf("/") != -1) { tmp = tmp.Substring(0, tmp.IndexOf("/")); } if (FileInfoTable.ContainsKey(tmp)) { FileInfo f; if (FileInfoTable[tmp].GetType() == typeof(string)) { f = new FileInfo((string)FileInfoTable[tmp]); FileInfoTable[tmp] = f; } else { f = (FileInfo)FileInfoTable[tmp]; } ProtocolInfoString pis = ProtocolInfoString.CreateHttpGetProtocolInfoString(f); rsp.StatusCode = 200; rsp.StatusData = "OK"; rsp.ContentType = pis.MimeType; if (request.Directive == "HEAD") { rsp.AddTag("Content-Length", f.Length.ToString()); rsp.OverrideContentLength = true; } else { HTTPSession.Range[] RNG = null; if (request.GetTag("Range") != "") { long x, y; ArrayList RList = new ArrayList(); DText rp = new DText(); rp.ATTRMARK = "="; rp.MULTMARK = ","; rp.SUBVMARK = "-"; rp[0] = request.GetTag("Range"); for (int I = 1; I <= rp.DCOUNT(2); ++I) { if (rp[2, I, 1] == "") { // Final Bytes y = long.Parse(rp[2, I, 2].Trim()); x = f.Length - y; y = x + y; } else if (rp[2, I, 2] == "") { // Offset till end x = long.Parse(rp[2, I, 1].Trim()); y = f.Length - x; } else { // Full Range x = long.Parse(rp[2, I, 1].Trim()); y = long.Parse(rp[2, I, 2].Trim()); } RList.Add(new HTTPSession.Range(x, 1 + y - x)); } RNG = (HTTPSession.Range[])RList.ToArray(typeof(HTTPSession.Range)); } else { hasRange = false; } if (request.Version == "1.0") { WebSession.OnStreamDone += new HTTPSession.StreamDoneHandler(DoneSink); } // ((HTTPMessage)(new UPnPDebugObject(WebSession)).GetField("Headers")).Version = "1.0"; if (hasRange) { WebSession.SendStreamObject(f.OpenRead(), RNG, pis.MimeType); } else { FileStream fs = f.OpenRead(); long length = fs.Length; WebSession.SendStreamObject(fs, length, pis.MimeType); } return; } } else { rsp.StatusCode = 404; rsp.StatusData = "Not Found"; } } catch (Exception) { rsp.StatusCode = 404; rsp.StatusData = "Not Found"; } } WebSession.Send(rsp); return; } rsp.StatusCode = 500; rsp.StatusData = "Not implemented"; WebSession.Send(rsp); }