Пример #1
0
        private HTTPResponse createResponse(HTTPRequestParser parser)
        {
            var base64 = parser.GetHeader(HTTPRequestParser.Header_Uri);
            base64 = HTTPProtocol.URLDecode(base64).TrimStart('/').Substring("b64_".Length).Replace('_', '=');
            var filepathBytes = Convert.FromBase64String(base64);
            var filepath = Encoding.UTF8.GetString(filepathBytes);

            return HTTPResponse.FromFile(parser, filepath);
        }
Пример #2
0
        private HTTPResponse createResponse(HTTPRequestParser parser)
        {
            var soap = parser.GetHeader("SOAPACTION");
            if (soap != null)
                return createSoapResponse(parser, soap);

            var alias = parser.GetHeader(HTTPRequestParser.Header_Uri);
            alias = HTTPProtocol.URLDecode(alias);

            var path = DLNA.Tree.GetFilePath(alias);
            return HTTPResponse.FromFile(parser, path);
        }
Пример #3
0
        private HTTPResponse createSoapResponse(HTTPRequestParser parser, string soapAction)
        {
            if (!soapAction.Contains("Browse"))
                return null;

            soapAction = soapAction.Replace("\"", "");
            var delim = soapAction.LastIndexOf('#');
            var service = soapAction.Substring(0, delim - 1);
            var action = soapAction.Substring(delim + 1);

            var doc = new XmlDocument();
            doc.LoadXml(parser.Body);

            var id = doc.SelectSingleNode("//ObjectID").InnerText;
            var start = int.Parse(doc.SelectSingleNode("//StartingIndex").InnerText);
            var count = int.Parse(doc.SelectSingleNode("//RequestedCount").InnerText);
            var browseFlag = doc.SelectSingleNode("//BrowseFlag").InnerText;

            DIDLResult didl;
            switch (browseFlag)
            {
                case "BrowseMetadata":
                    //need get object id metadata
                    didl = DLNA.Tree.ToDIDL_Lite_Meta(id);
                    break;
                case "BrowseDirectChildren":
                    //browse all children
                    didl = DLNA.Tree.ToDIDL_Lite(id, start, count);
                    break;
                default:
                    throw new NotSupportedException("BrowseFlag " + browseFlag + " is not supported");
            }

            if (id == "0")
                //root
                id = "";

            var browsable = UpnpProtocol.GetBrowseResponse(didl);

            ConsoleUtils.WriteLn(new Wr(ConsoleColor.DarkRed, parser.Body));
             return HTTPResponse.FromData(parser, browsable);
             //   return HTTPResponse.FromFile(parser, "ContentDirDescription – TV OK.xml");
        }
Пример #4
0
        /// <summary>
        /// Send appropriate response to parsed request
        /// </summary>
        /// <param name="parser"></param>
        /// <param name="client"></param>
        private void proceedRequest(HTTPRequestParser parser, TcpClient client)
        {
            var stream = client.GetStream();
            var response = createResponse(parser);
            if (response == null)
                response = HTTPResponse.FromData(parser, "", 500);

            stream.Write(response.Headers);
            /*     ConsoleUtils.WriteLn(
                  new Wr(ConsoleColor.Yellow, "{0} -> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint),
                  new Wr(ConsoleColor.White, response.Headers)
                );*/

            var method = parser.GetHeader(HTTPRequestParser.Header_Method);

            if (method != "HEAD")
                stream.Write(response.Stream);

            client.Close();
        }
Пример #5
0
        public static HTTPResponse FromFile(HTTPRequestParser request,string path)
        {
            var headers = createHeaders(request, 200);
            var splited = path.Split('?');
            path = splited[0];

            var info = new FileInfo(path);
            if (!info.Exists)
                return FromData(request, "Path "+path+" is unavailable", 500);
            var stream= new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            var respStream = createResponseStream(headers, request, stream, info.Length);
            var mime = GetContentType(path);
            headers.SetHeader("Content-Type",mime);
            headers.SetHeader("Accept-Ranges","bytes");
            headers.SetHeader("ContentFeatures.DLNA.ORG","DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000");
            headers.SetHeader("TransferMode.DLNA.ORG", "Streaming");

            return new HTTPResponse(headers, respStream);
        }
Пример #6
0
        /// <summary>
        /// Handle specified http client
        /// </summary>
        /// <param name="client">Client to be handled</param>
        private void _handleClient(TcpClient client)
        {
            var stream = client.GetStream();

            //parse incoming http request
            var parser = new HTTPRequestParser();
            while (!parser.IsComplete)
                parser.AddData(stream.Read());

            ConsoleUtils.WriteLn(
                new Wr(ConsoleColor.Yellow, "{1} -> {0}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint),
                new Wr(ConsoleColor.Green, parser.HeaderPart.Replace("{", "{{").Replace("}","}}"))
                );

            proceedRequest(parser, client);
        }
Пример #7
0
        private HTTPRequestParser sendHTTP(string http, params object[] pars)
        {
            http = string.Format(http, pars);
            var tv = new TcpClient();
            var result = tv.BeginConnect(RemoteIP, RemotePort, null, null);

            var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5));
            if (!success)
            {
                return null;
            }

            // we have connected
            tv.EndConnect(result);

            var stream = tv.GetStream();
            stream.Write(http);
            var parser = new HTTPRequestParser();
            while (!parser.IsComplete)
            {
                var data = stream.Read();
                parser.AddData(data);
            }
            tv.Close();

            return parser;
        }
Пример #8
0
        private static HTTPHeaders createHeaders(HTTPRequestParser request,int code, string codeDescription="")
        {
            var hasRange=request.GetHeader("Range") == null;

            switch (code)
            {
                case 200:
                case 206:
                    code = hasRange ? 200 : 206;
                    if(codeDescription=="")
                        codeDescription = hasRange ? "OK" : "Partial content";
                    break;
            }

            return HTTPHeaders.Response(code, codeDescription);
        }
Пример #9
0
 public static HTTPResponse NotFound(HTTPRequestParser request)
 {
     return fromData(request, "Page was not found", 404);
 }
Пример #10
0
 public static HTTPResponse FromData(HTTPRequestParser request, string data,int code=200)
 {
     return fromData(request, data, code);
 }
Пример #11
0
        private static HTTPResponse fromData(HTTPRequestParser request, string data, int code)
        {
            string description="";
            switch (code)
            {
                case 500:
                    description = "Internal server error";
                    break;
                case 404:
                    description = "Not found";
                    break;
            }
            var headers = createHeaders(request, code, description);
            var respStream = createResponseStream(headers, request, createStream(data),Encoding.UTF8.GetByteCount(data));

            return new HTTPResponse(headers, respStream);
        }
Пример #12
0
        /// <summary>
        /// Create response stream according to data stream and range request. Also inject appropriate range and length headers
        /// </summary>
        /// <param name="headers"></param>
        /// <param name="request"></param>
        /// <param name="dataStream"></param>
        /// <param name="dataTotalLength"></param>
        /// <returns></returns>
        private static ResponseStream createResponseStream(HTTPHeaders headers, HTTPRequestParser request,Stream dataStream ,long dataTotalLength)
        {
            var rangeSelector = request.GetHeader("Range");
            var range=new HTTPRange(dataTotalLength,rangeSelector);

            if (range.IsPartial)
                //inject range header into response headers
                headers.SetHeader("Content-Range", string.Format("bytes {0}-{1}/{2}",range.FromBytes,range.ToBytes,range.FileLength));

            headers.SetHeader("Content-Length", range.ContentLength.ToString());
            return new ResponseStream(dataStream, range.FromBytes, range.ToBytes);
        }
Пример #13
0
        /// <summary>
        /// Listen on specified port, while _end is true
        /// </summary>
        private void _listen()
        {
            //       _listener.Client.Listen(500);
            lock (_listenHandShake)
                Monitor.Pulse(_listenHandShake);

            IPEndPoint clientEndPoint;

            var processedClients = new Dictionary<string, HTTPRequestParser>();
            _listener.EnableBroadcast = true;
            _listener.MulticastLoopback = true;

            var address = IPAddress.Parse("239.255.255.250");
            _listener.JoinMulticastGroup(address);

            while (!_end)
            {
                //handle incomming reqs
                string data;
                try
                {
                    clientEndPoint = new IPEndPoint(IPAddress.Any, _port);
                    var buffer = _listener.Receive(ref clientEndPoint);
                    data = Encoding.ASCII.GetString(buffer);
                }
                catch (Exception ex)
                {
                    ConsoleUtils.WriteLn(ex);
                    break;
                }

                var clientKey = clientEndPoint.ToString();
                HTTPRequestParser parser;
                if (!processedClients.TryGetValue(clientKey, out parser))
                    processedClients.Add(clientKey, parser = new HTTPRequestParser());

                parser.AddData(data);
                if (parser.IsComplete)
                {
                    processedClients.Remove(clientKey);
                    onReqCompleted(parser, clientEndPoint);
                }

            }
            _listener.Close();
        }
Пример #14
0
        private void onReqCompleted(HTTPRequestParser request, IPEndPoint endpoint)
        {
            ConsoleUtils.WriteLn(
                new Wr(ConsoleColor.Yellow, "UHTTP recieved {0}", endpoint),
                new Wr(ConsoleColor.Cyan, request.HeaderPart)
                );

            if (request.GetHeader(HTTPRequestParser.Header_Method).Contains("SEARCH"))
            {
                var search = request.GetHeader("ST");
                if (search == "ssdp:all")
                {
                    throw new NotImplementedException("response with all services");
                }

                string location;
                if (_upnpServices.TryGetValue(search, out location))
                {
                    var th = new Thread(() =>
                    {
                        //Positive replay to search

                        try
                        {
                            SendTo(endpoint, HTTPProtocol.Headers_SEARCH_ok, location, search, UpnpProtocol.GetUSN(UpnpProtocol.UUID, search));
                        }
                        catch (Exception ex)
                        {
                            ConsoleUtils.WriteLn(ex);
                        }
                    });

                    th.IsBackground = true;
                    th.Start();
                }
            }
        }