internal IHttpRequestReponse Parse(HttpParserDelegate requestHandler, Stream stream, TimeSpan timeout)
        {
            using (var parserHandler = new HttpCombinedParser(requestHandler))
            {
                var observeRequstStream = new ObservableHttpData().Create(requestHandler.HttpRequestReponse, stream, timeout);

                var observerRequestSubscriber = observeRequstStream.Subscribe(
                    bArray =>
                {
                    try
                    {
                        if (parserHandler.Execute(new ArraySegment <byte>(bArray, 0, bArray.Length)) <= 0)
                        {
                            requestHandler.HttpRequestReponse.IsUnableToParseHttp = true;
                        }
                    }
                    catch (Exception)
                    {
                        requestHandler.HttpRequestReponse.IsUnableToParseHttp = true;
                    }
                },
                    ex =>
                {
                    if (ex is TimeoutException)
                    {
                        requestHandler = new HttpParserDelegate
                        {
                            HttpRequestReponse =
                            {
                                IsRequestTimedOut = true
                            }
                        };
                    }
                    else
                    {
                        requestHandler = new HttpParserDelegate
                        {
                            HttpRequestReponse =
                            {
                                IsUnableToParseHttp = true
                            }
                        };
                    }
                },
                    () =>
                {
                });

                observerRequestSubscriber.Dispose();

                parserHandler.Execute(default(ArraySegment <byte>));

                requestHandler.HttpRequestReponse.MajorVersion    = parserHandler.MajorVersion;
                requestHandler.HttpRequestReponse.MinorVersion    = parserHandler.MinorVersion;
                requestHandler.HttpRequestReponse.ShouldKeepAlive = parserHandler.ShouldKeepAlive;
            }
            return(requestHandler.HttpRequestReponse);
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            var handler = new ParserHandler();
            var parser  = new HttpCombinedParser(handler);

            var bArray = Encoding.UTF8.GetBytes(TestReponse());

            System.Console.WriteLine(parser.Execute(new ArraySegment <byte>(bArray, 0, bArray.Length)) == bArray.Length
                ? $"Reponse test succeed. Type identified is; {handler.MessageType}"
                : $"Response test failed");

            bArray = Encoding.UTF8.GetBytes(TestRequest());
            System.Console.WriteLine(parser.Execute(new ArraySegment <byte>(bArray, 0, bArray.Length)) == bArray.Length
                ? $"Request test succeed. Type identified is; {handler.MessageType}"
                : $"Request test failed");

            System.Console.ReadKey();
        }
Esempio n. 3
0
        internal bool Parse(
            byte[]?byteArray,
            IEnumerable <string>?subProtocols)
        {
            if (byteArray is null)
            {
                return(false);
            }

            _parserHandler.Execute(byteArray);

            if (_parserDelegate.HttpRequestResponse is not null &&
                _parserDelegate.HttpRequestResponse.IsEndOfMessage)
            {
                if (_parserDelegate.HttpRequestResponse.StatusCode == 101)
                {
                    if (subProtocols is not null &&
                        _parserDelegate?.HttpRequestResponse?.Headers is not null)
                    {
                        if (_parserDelegate
                            .HttpRequestResponse
                            .Headers
                            .TryGetValue("SEC-WEBSOCKET-PROTOCOL", out var subprotocolAcceptedNames))
                        {
                            SubprotocolAcceptedNames = subprotocolAcceptedNames.Where(spn => subProtocols.Contains(spn));

                            if (!SubprotocolAcceptedNames?.Any() ?? true)
                            {
                                _connectionStatusAction(
                                    ConnectionStatus.Aborted,
                                    new WebsocketClientLiteException("Server responded only with subprotocols not known by client."));
                            }
                        }
                        else
                        {
                            _connectionStatusAction(
                                ConnectionStatus.Aborted,
                                new WebsocketClientLiteException("Server responded with blank Sub Protocol name")
                                );
                        }
                    }

                    Debug.WriteLine("HandShake completed");
                    return(true);
                }
                else
                {
                    _connectionStatusAction(
                        ConnectionStatus.Aborted,
                        new WebsocketClientLiteException($"Unable to connect to websocket Server. " +
                                                         $"Error code: {_parserDelegate.HttpRequestResponse.StatusCode}, " +
                                                         $"Error reason: {_parserDelegate.HttpRequestResponse.ResponseReason}"));
                }
            }

            return(false);
        }
Esempio n. 4
0
 internal void Parse(byte[] data, HttpParserDelegate parserDelegate, HttpCombinedParser parserHandler)
 {
     try
     {
         if (parserHandler.Execute(new ArraySegment <byte>(data, 0, data.Length)) <= 0)
         {
             parserDelegate.HttpRequestResponse.IsUnableToParseHttp = true;
         }
     }
     catch (Exception)
     {
         parserDelegate.HttpRequestResponse.IsUnableToParseHttp = true;
     }
 }
Esempio n. 5
0
        internal async Task <IHttpRequestResponse> ParseAsync(Stream stream, CancellationToken ct)
        {
            _disposableParserCompletion = _parserDelegate.ParserCompletionObservable
                                          .Subscribe(parserState =>
            {
                switch (parserState)
                {
                case ParserState.Start:
                    break;

                case ParserState.Parsing:
                    break;

                case ParserState.Completed:
                    break;

                case ParserState.Failed:
                    HasParsingError = true;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(parserState), parserState, null);
                }
            },
                                                     ex => throw ex,
                                                     () =>
            {
                IsDone = true;
            });

            await Observable.While(
                () => !HasParsingError && !IsDone,
                Observable.FromAsync(() => ReadBytesAsync(stream, ct)))
            .Catch <byte[], SimpleHttpListenerException>(ex =>
            {
                HasParsingError = true;
                return(Observable.Return(Enumerable.Empty <byte>().ToArray()));
            })
            .Where(b => b != Enumerable.Empty <byte>().ToArray())
            .Where(bSegment => bSegment.Length > 0)
            .Select(b => new ArraySegment <byte>(b, 0, b.Length))
            .Select(bSegment => _parser.Execute(bSegment));

            _parser.Execute(default);
Esempio n. 6
0
    static void Main(string[] args)
    {
        byte[] bArray;

        using (var handler = new ParserHandler())
            using (var parser = new HttpCombinedParser(handler))
            {
                bArray = TestReponse();
                System.Console.WriteLine(parser.Execute(new ArraySegment <byte>(bArray, 0, bArray.Length)) == bArray.Length
                ? $"Reponse test succeed. Type identified is; {handler.MessageType}"
                : $"Response test failed");

                handler.HttpRequestReponse.Body.Position = 0;
                var reader = new StreamReader(handler.HttpRequestReponse.Body);
                var body   = reader.ReadToEnd();

                //bArray = Encoding.UTF8.GetBytes(TestRequest());
                //System.Console.WriteLine(parser.Execute(new ArraySegment<byte>(bArray, 0, bArray.Length)) == bArray.Length
                //    ? $"Request test succeed. Type identified is; {handler.MessageType}"
                //    : $"Request test failed");
            }

        using (var handler = new ParserHandler())
            using (var parser = new HttpCombinedParser(handler))
            {
                bArray = TestChunkedResponse();
                System.Console.WriteLine(parser.Execute(new ArraySegment <byte>(bArray, 0, bArray.Length)) == bArray.Length
                ? $"Chunked Response test succeed. Type identified is; {handler.MessageType}."
                : $"Chunked Response test failed");

                handler.HttpRequestReponse.Body.Position = 0;
                var reader = new StreamReader(handler.HttpRequestReponse.Body);
                var body   = reader.ReadToEnd();
            }

        System.Console.ReadKey();
    }