private static void AddGeneralProperties(IHeaders props, XmlElement item) { string prop; var ownerDocument = item.OwnerDocument; if (ownerDocument == null) { throw new ArgumentNullException(nameof(item)); } if (props.TryGetValue("DateO", out prop)) { var e = ownerDocument.CreateElement("dc", "date", NS_DC); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Genre", out prop)) { var e = ownerDocument.CreateElement("upnp", "genre", NS_UPNP); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Description", out prop)) { var e = ownerDocument.CreateElement("dc", "description", NS_DC); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Artist", out prop)) { var e = ownerDocument.CreateElement("upnp", "artist", NS_UPNP); e.SetAttribute("role", "AlbumArtist"); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Performer", out prop)) { var e = ownerDocument.CreateElement("upnp", "artist", NS_UPNP); e.SetAttribute("role", "Performer"); e.InnerText = prop; item.AppendChild(e); e = ownerDocument.CreateElement("dc", "creator", NS_DC); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Album", out prop)) { var e = ownerDocument.CreateElement("upnp", "album", NS_UPNP); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Track", out prop)) { var e = ownerDocument.CreateElement( "upnp", "originalTrackNumber", NS_UPNP); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Creator", out prop)) { var e = ownerDocument.CreateElement("dc", "creator", NS_DC); e.InnerText = prop; item.AppendChild(e); } if (props.TryGetValue("Director", out prop)) { var e = ownerDocument.CreateElement("upnp", "director", NS_UPNP); e.InnerText = prop; item.AppendChild(e); } }
private Stream ProcessRanges(IResponse rangedResponse, ref HttpCode status) { var responseBody = rangedResponse.Body; var contentLength = GetContentLengthFromStream(responseBody); try { string ar; if (status != HttpCode.Ok && contentLength > 0 || !headers.TryGetValue("Range", out ar)) { return(responseBody); } var m = bytes.Match(ar); if (!m.Success) { throw new InvalidDataException("Not parsed!"); } var totalLength = contentLength; var start = 0L; var end = totalLength - 1; if (!long.TryParse(m.Groups[1].Value, out start) || start < 0) { throw new InvalidDataException("Not parsed"); } if (m.Groups.Count != 3 || !long.TryParse(m.Groups[2].Value, out end) || end <= start || end >= totalLength) { end = totalLength - 1; } if (start >= end) { responseBody.Close(); rangedResponse = Error416.HandleRequest(this); return(rangedResponse.Body); } if (start > 0) { responseBody.Seek(start, SeekOrigin.Current); } contentLength = end - start + 1; rangedResponse.Headers["Content-Length"] = contentLength.ToString(); rangedResponse.Headers.Add( "Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, totalLength) ); status = HttpCode.Partial; } catch (Exception ex) { _logger.Warn(String.Format( "{0} - Failed to process range request!", this), ex); } return(responseBody); }
public bool Authorize(IHeaders headers, IPEndPoint ep, string mac) { if (headers == null) { throw new ArgumentNullException("headers"); } string ua; if (!headers.TryGetValue("User-Agent", out ua)) { return(false); } if (string.IsNullOrEmpty(ua)) { return(false); } var rv = userAgents.ContainsKey(ua); if (!rv) { DebugFormat("Rejecting {0}. Not in User-Agent whitelist", ua); } else { DebugFormat("Accepted {0} via User-Agent whitelist", ua); } return(rv); }
public HttpRequestAuthParameters(IHeaders headers, IPEndPoint endPoint) { if (headers != null) { headers.TryGetValue("User-Agent", out _userAgent); } if (endPoint != null) { _address = endPoint.Address; _mac = IP.GetMAC(_address); } }
public bool Authorize(IHeaders headers, IPEndPoint endPoint, string mac) { if (headers == null) { throw new ArgumentNullException(nameof(headers)); } string ua; if (!headers.TryGetValue("User-Agent", out ua)) { return false; } if (string.IsNullOrEmpty(ua)) { return false; } var rv = userAgents.ContainsKey(ua); DebugFormat(!rv ? "Rejecting {0}. Not in User-Agent whitelist" : "Accepted {0} via User-Agent whitelist", ua); return rv; }
public bool Authorize(IHeaders headers, IPEndPoint endPoint) { if (headers == null) { throw new ArgumentNullException(nameof(headers)); } string ua; if (!headers.TryGetValue("User-Agent", out ua)) { return(false); } if (string.IsNullOrEmpty(ua)) { return(false); } var rv = userAgents.ContainsKey(ua); Trace.WriteLine(!rv ? $"Rejecting {ua}. Not in User-Agent whitelist" : $"Accepted {ua} via User-Agent whitelist"); return(rv); }
private void SendResponse() { var responseBody = response.Body; var st = response.Status; var contentLength = GetContentLengthFromStream(responseBody); string ar; if (st == HttpCodes.OK && contentLength > 0 && headers.TryGetValue("Range", out ar)) { try { var m = bytes.Match(ar); if (!m.Success) { throw new InvalidDataException("Not parsed!"); } var totalLength = contentLength; var start = 0L; var end = totalLength - 1; if (!long.TryParse(m.Groups[1].Value, out start) || start < 0) { throw new InvalidDataException("Not parsed"); } if (m.Groups.Count != 3 || !long.TryParse(m.Groups[2].Value, out end) || end <= start || end >= totalLength) { end = totalLength - 1; } if (start >= end) { responseBody.Close(); response = Error416.HandleRequest(this); SendResponse(); return; } if (start > 0) { responseBody.Seek(start, SeekOrigin.Current); } contentLength = end - start + 1; response.Headers["Content-Length"] = contentLength.ToString(); response.Headers.Add("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, totalLength)); st = HttpCodes.PARTIAL; } catch (Exception ex) { Warn(String.Format("{0} - Failed to process range request!", this), ex); } } var hb = new StringBuilder(); hb.AppendFormat("HTTP/1.1 {0} {1}\r\n", (uint)st, HttpPhrases.Phrases[st]); hb.Append(response.Headers.HeaderBlock); hb.Append("\r\n"); var rs = new ConcatenatedStream(); try { var headerStream = new MemoryStream(Encoding.ASCII.GetBytes(hb.ToString())); rs.AddStream(headerStream); if (method != "HEAD" && responseBody != null) { rs.AddStream(responseBody); } InfoFormat("{0} - {1} response for {2}", this, (uint)st, path); state = HttpStates.WRITING; new StreamPump(rs, stream, (pump, result) => { pump.Input.Close(); pump.Input.Dispose(); if (result == StreamPumpResult.Delivered) { DebugFormat("{0} - Done writing response", this); string conn; if (headers.TryGetValue("connection", out conn) && conn.ToLower() == "keep-alive") { ReadNext(); return; } } Close(); }, BUFFER_SIZE); } catch (Exception) { rs.Dispose(); throw; } }