public async Task AddOutgoingAsync <TSupplierType>(string outgoingPrefix, TSupplierType supplierType, CancellationToken cancellationToken = default)
        {
            try
            {
                outgoingPrefix.NotNullOrWhiteSpace(nameof(outgoingPrefix));
                supplierType.NotNull(nameof(supplierType));

                var strSupplierType = supplierType.ConvertTo <string>();
                var hashCode        = outgoingPrefix.GetInvariantHashCode();

                Logger.SetProperty(LogConstants.OutgoingRequestHashCode, hashCode);
                Logger.SetProperty(LogConstants.SupplierType, strSupplierType);

                var outgoingRequest = new OutgoingRequest
                {
                    CreatedAt = SystemClock.DateTimeNow,
                    HashCode  = hashCode
                };

                using (await AsyncLock.LockAsync())
                    await OutgoingRequestStore.AddAsync(outgoingRequest, cancellationToken);
            }
            catch (Exception ex)
                when(Logger.LogErrorIfNotBefore(ex, "Exception ocurred in {MethodName}", nameof(AddOutgoingAsync)))
                {
                    throw;
                }
        }
Esempio n. 2
0
        public virtual TConnection Generate(Tcp.Connection connection, URL url, params string[] reqSubprotocols)
        {
            ClientConnection httpClient    = new ClientConnection(connection);
            OutgoingRequest  req           = httpClient.Enqueue("HTTP/1.1", "GET", url);
            TConnection      newConnection = GenerateConnection(connection, req.Head);

            string reqExtensions = NegotiatingExtension.Stringify(RequestExtensions());
            string key           = Secret.GenerateKey();

            req["Connection"]            = "Upgrade";
            req["Upgrade"]               = "websocket";
            req["Sec-WebSocket-Version"] = "13";
            req["Sec-WebSocket-Key"]     = key;
            if (reqSubprotocols.Length > 0)
            {
                req["Sec-WebSocket-Protocol"] = SubprotocolNegotiation.Stringify(reqSubprotocols);
            }
            if (reqExtensions.Length > 0)
            {
                req["Sec-WebSocket-Extensions"] = reqExtensions;
            }

            req.OnResponse += (res) =>
            {
                if (!VerifyResponseHead(res, key))
                {
                    httpClient.Terminate(); return;
                }
                string subprotocol = res["Sec-WebSocket-Protocol"];
                if (subprotocol != null)
                {
                    bool validSubprotocol = false;
                    for (int i = 0; i < reqSubprotocols.Length; i++)
                    {
                        if (reqSubprotocols[i] == subprotocol)
                        {
                            validSubprotocol = true; break;
                        }
                    }
                    if (!validSubprotocol)
                    {
                        httpClient.Terminate(); return;
                    }
                }
                newConnection.SetSubprotocol(subprotocol);
                if (
                    !NegotiatingExtension.TryParse(res["Sec-WebSocket-Extensions"] ?? "", out NegotiatingExtension[] resExtensions) ||
                    !CheckExtensions(resExtensions)
                    )
                {
                    httpClient.Terminate(); return;
                }

                byte[] trail = httpClient.Freeze();
                if (!httpClient.End())
                {
                    return;
                }
                newConnection.Initiate(trail);
            };
Esempio n. 3
0
        public void CreateNewRequest(OutgoingRequest request)
        {
            var port    = GetPortByNumber(request.Target);
            var message = "";

            switch (port.State)
            {
            case PortState.Busy:
                message = "Subscriber is busy now";
                break;

            case PortState.Disabled:
                message = "Subscriber is not available now";
                break;

            case PortState.Free:
                port.State = PortState.Busy;
                port.NewIncomingRequest(request.Source);
                port.CallRespond += ((sender, respond) => GetRespond((Port)sender, respond));
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }

            port.NewStationRespond(new StationRespond()
            {
                Request = request, DeclineMessage = message, State = RespondState.Decline
            });
            _currentCall.State = CallState.Rejected;
        }
Esempio n. 4
0
        private void HasNewRequest(object sender, OutgoingRequest request)
        {
            var handler = new RequestHandler(request.Source, request.Target, _portCollection, GetTariff());

            handler.CreateNewRequest(request);
            _billingStation.NewCallInfo(handler.GetCallInfo());
        }
Esempio n. 5
0
 public void OnOutgoingRequest(object sender, PhoneNumber target)
 {
     OutgoingRequest?.Invoke(sender, new Requests.OutgoingRequest()
     {
         Source = Terminal.Number, Target = target
     });
 }
Esempio n. 6
0
        public async Task ShouldSerializeRequests()
        {
            var pipe = new Pipe(new PipeOptions());

            using var handler = NewHandler(pipe.Writer);

            var value = new OutgoingRequest {
                Method = "method",
                Id     = 1,
                Params = new object(),
            };

            handler.Send(value);
            await handler.WriteAndFlush();

            using var reader = new StreamReader(pipe.Reader.AsStream());
            var received = await reader.ReadToEndAsync();

            const string send =
                "Content-Length: 60\r\n\r\n{\"seq\":1,\"type\":\"request\",\"command\":\"method\",\"arguments\":{}}";

            received.Should().Be(send);
        }
Esempio n. 7
0
 internal void RaiseOutgoingRequest(string request)
 {
     OutgoingRequest?.Invoke(this, request);
 }
Esempio n. 8
0
        public static void HttpClientConnectionTest(string[] args)
        {
            IPEndPoint       clientEndPoint = new IPEndPoint(IPAddress.Loopback, 420);
            IPEndPoint       serverEndPoint = new IPEndPoint(IPAddress.Any, 420);
            HttpListener     listener       = new HttpListener(serverEndPoint);
            ServerConnection server         = null;

            listener.OnRequest = (sreq, res) =>
            {
                Console.WriteLine("Server request");
                server = sreq.Connection;
                if (sreq.Path != "/echo")
                {
                    res["Content-Length"] = "0";
                    res.End(404, "Not Found"); return;
                }
                switch (sreq.Method)
                {
                case "GET":
                    Console.WriteLine("Server GET request");
                    res["Content-Type"]      = "text/plain";
                    res["Transfer-Encoding"] = "chunked";
                    res.SendHead(200, "OK");
                    res.Write(UTF8.GetBytes("GET on /echo\r\nMake a POST request to echo its body"));
                    res.End();
                    Console.WriteLine("Server response finish");
                    break;

                case "POST":
                    Console.WriteLine("Server POST request");
                    sreq.OnFinish += () =>
                    {
                        Console.WriteLine("Server POST request finish");
                        if (sreq.BufferedReadable == 0)
                        {
                            res.End(400, "Bad Request"); return;
                        }
                        res["Content-Type"]      = "text/plain";
                        res["Transfer-Encoding"] = "chunked";
                        res.SendHead(200, "OK");
                        res.Write(UTF8.GetBytes("/ path on POST!\r\n"));
                        res.Write(UTF8.GetBytes("Body is as follows:\r\n\r\n"));
                        byte[] data = sreq.Read();
                        Console.WriteLine(UTF8.GetString(data).Replace("\r", "\\r").Replace("\n", "\\n"));
                        res.Write(data);
                        res.End();
                        Console.WriteLine("Server response finish");
                    };
                    break;

                default: res.End(400, "Bad Request"); break;
                }
            };
            listener.Start();
            ClientConnection client = null;

            client = new ClientConnection(clientEndPoint, () =>
            {
                OutgoingRequest creq = client.Enqueue("HTTP/1.1", "POST", "/echo");
                creq.OnResponse     += (res) =>
                {
                    Console.WriteLine("Client response {0} {1}", res.StatusCode, res.StatusDescription);
                    res.OnFinish += () =>
                    {
                        Console.WriteLine("Client response finish\r\n{0}", UTF8.GetString(res.Read()));
                        client.End();
                        client.Base.End();
                    };
                };
                creq["Transfer-Encoding"] = "chunked";
                creq.SendHead();
                creq.Write(UTF8.GetBytes("I am a body"));
                creq.End();
                Console.WriteLine("Client request finish");
            });
            Console.ReadKey();
            listener.Stop();
            Console.ReadKey();
            //client.Terminate();
        }
Esempio n. 9
0
 private async void HasNewRequestAsynс(object sender, OutgoingRequest request)
 {
     await Task.Run(() => HasNewRequest(sender, request));
 }
Esempio n. 10
0
 public void OnOutgoingRequest(object sender, OwinContext context)
 {
     OutgoingRequest?.Invoke(sender, new OwinEventArgs(context));
 }