public dynamic Post(GameLeaveRequest request, string appId)
        {
            if (log.IsDebugEnabled) log.DebugFormat("{0} - {1}", Request.RequestUri, JsonConvert.SerializeObject(request));

            string message;
            if (!IsValid(request, out message))
            {
                var errorResponse = new ErrorResponse { Message = message };
                if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(errorResponse));
                return errorResponse;
            }

            if (request.IsInactive)
            {
                if (request.ActorNr > 0)
                {
                    WebApiApplication.DataAccess.GameInsert(appId, request.UserId, request.GameId, request.ActorNr);
                }
            }
            else
            {
                WebApiApplication.DataAccess.GameDelete(appId, request.UserId, request.GameId);
            }

            var okResponse = new OkResponse();
            if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(okResponse));
            return okResponse;
        }
        public dynamic Post(GameLeaveRequest request, string appId)
        {
            if (log.IsDebugEnabled) log.DebugFormat("{0} - {1}", Request.RequestUri, JsonConvert.SerializeObject(request));

            var response = new OkResponse();
            if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(response));
            return response;
        }
        public dynamic Post(GamePropertiesRequest request, string appId)
        {
            if (log.IsDebugEnabled) log.DebugFormat("{0} - {1}", Request.RequestUri, JsonConvert.SerializeObject(request));

            string message;
            if (!IsValid(request, out message))
            {
                var errorResponse = new ErrorResponse { Message = message };
                if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(errorResponse));
                return errorResponse;
            }

            if (request.State != null)
            {
                var state = (string)JsonConvert.SerializeObject(request.State);
                WebApiApplication.DataAccess.StateSet(appId, request.GameId, state);

                var properties = request.Properties;
                object actorNrNext = null;
                if (properties != null)
                {
                    properties.TryGetValue("turn", out actorNrNext);
                }
                var userNextInTurn = string.Empty;
                foreach (var actor in request.State.ActorList)
                {
                    if (actorNrNext != null)
                    {
                        if (actor.ActorNr == actorNrNext)
                        {
                            userNextInTurn = (string)actor.UserId;
                        }
                    }
                    WebApiApplication.DataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (int)actor.ActorNr);
                }

                if (!string.IsNullOrEmpty(userNextInTurn))
                {
                    var notificationContent = new Dictionary<string, string>
                                                  {
                                                      { "en", "{USERNAME} finished. It's your turn." },
                                                      { "de", "{USERNAME} hat seinen Zug gemacht. Du bist dran." },
                                                  };
                    pushWoosh.RequestPushNotification(notificationContent, request.Username, "UID2", userNextInTurn, appId);
                }
            }

            var response = new OkResponse();
            if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(response));
            return response;
        }
        public dynamic Post(GameCloseRequest request, string appId)
        {
            if (log.IsDebugEnabled) log.DebugFormat("{0} - {1}", Request.RequestUri, JsonConvert.SerializeObject(request));

            string message;
            if (!IsValid(request, out message))
            {
                var errorResponse = new ErrorResponse { Message = message };
                if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(errorResponse));
                return errorResponse;
            }

            if (request.State == null)
            {
                if (request.ActorCount > 0)
                {
                    var errorResponse = new ErrorResponse { Message = "Missing State." };
                    if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(errorResponse));
                    return errorResponse;
                }

                WebApiApplication.DataAccess.StateDelete(appId, request.GameId);

                var okResponse = new OkResponse();
                if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(okResponse));
                return okResponse;
            }

            foreach (var actor in request.State.ActorList)
            {
                //var listProperties = new ListProperties() { ActorNr = (int)actor.ActorNr, Properties = request.State.CustomProperties };
                //WebApiApplication.DataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (string)JsonConvert.SerializeObject(listProperties));
                WebApiApplication.DataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (int)actor.ActorNr);
            }                

            //deprecated
            if (request.State2 != null)
            {
                foreach (var actor in request.State2.ActorList)
                {
                    WebApiApplication.DataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (int)actor.ActorNr);
                }
            }

            var state = (string)JsonConvert.SerializeObject(request.State);
            WebApiApplication.DataAccess.StateSet(appId, request.GameId, state);

            var response = new OkResponse();
            if (log.IsDebugEnabled) log.Debug(JsonConvert.SerializeObject(response));
            return response;
        }
        /// <summary>
        /// Before request is made to server respond with the specified HTML string to client
        /// and ignore the request.
        /// </summary>
        /// <param name="html">HTML content to sent.</param>
        /// <param name="headers">HTTP response headers.</param>
        /// <param name="closeServerConnection">Close the server connection used by request if any?</param>
        public void Ok(string html, Dictionary <string, HttpHeader> headers = null,
                       bool closeServerConnection = false)
        {
            var response = new OkResponse();

            if (headers != null)
            {
                response.Headers.AddHeaders(headers);
            }

            response.HttpVersion = WebSession.Request.HttpVersion;
            response.Body        = response.Encoding.GetBytes(html ?? string.Empty);

            Respond(response, closeServerConnection);
        }
Beispiel #6
0
        public dynamic Post(GameEventRequest request, string appId)
        {
            if (log.IsDebugEnabled)
            {
                log.DebugFormat("{0} - {1}", Request.RequestUri, request == null ? "null" : JsonConvert.SerializeObject(request));
            }

            var okResponse = new OkResponse();

            if (log.IsDebugEnabled)
            {
                log.Debug(JsonConvert.SerializeObject(okResponse));
            }
            return(okResponse);
        }
Beispiel #7
0
        /// <summary>
        /// Before request is made to server
        /// Respond with the specified byte[] to client
        /// and ignore the request
        /// </summary>
        /// <param name="result"></param>
        /// <param name="headers"></param>
        public async Task Ok(byte[] result, Dictionary <string, HttpHeader> headers)
        {
            var response = new OkResponse();

            if (headers != null && headers.Count > 0)
            {
                response.ResponseHeaders = headers;
            }
            response.HttpVersion  = WebSession.Request.HttpVersion;
            response.ResponseBody = result;

            await Respond(response);

            WebSession.Request.CancelRequest = true;
        }
Beispiel #8
0
        public IResponse Execute(List <ICommand> commandList)
        {
            IResponse response = new OkResponse("");

            foreach (var command in commandList)
            {
                var successfulResponseList = _commandToResponseFactory.CreateResponseList(command.Command);
                response = _commandProcessor.Process(command);
                if (!successfulResponseList.Contains(response.ResponseCode))
                {
                    return(response);
                }
            }
            return(response);
        }
        public IActionResult Index([FromBody] GamePropertiesRequest request, [FromHeader] string appId)
        {
            if (!IsValid(request, out string message))
            {
                var errorResponse = new ErrorResponse {
                    Message = message
                };
                _logger.LogError($"{Request.GetUri()} - {JsonConvert.SerializeObject(errorResponse)}");
                return(BadRequest(errorResponse));
            }

            if (request.State != null)
            {
                var state = (string)JsonConvert.SerializeObject(request.State);
                _dataAccess.StateSet(appId, request.GameId, state);

                var    properties  = request.Properties;
                object actorNrNext = null;
                properties?.TryGetValue("turn", out actorNrNext);
                var userNextInTurn = string.Empty;
                foreach (var actor in request.State.ActorList)
                {
                    if (actorNrNext != null)
                    {
                        if (actor.ActorNr == actorNrNext)
                        {
                            userNextInTurn = (string)actor.UserId;
                        }
                    }
                    _dataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (int)actor.ActorNr);
                }

                if (!string.IsNullOrEmpty(userNextInTurn))
                {
                    var notificationContent = new Dictionary <string, string>
                    {
                        { "en", "{USERNAME} finished. It's your turn." },
                        { "de", "{USERNAME} hat seinen Zug gemacht. Du bist dran." },
                    };
                    _notification.SendMessage(notificationContent, request.Username, "UID2", userNextInTurn, appId);
                }
            }

            var response = new OkResponse();

            _logger.LogInformation($"{Request.GetUri()} - {JsonConvert.SerializeObject(response)}");
            return(Ok(response));
        }
Beispiel #10
0
        public async Task Invoke(HttpContext httpContext)
        {
            object result         = null;
            var    errMessage     = string.Empty;
            var    httpStatusCode = HttpStatusCode.OK;
            var    buildRequest   = grpcRequestBuilder.BuildRequest(httpContext);

            if (buildRequest.IsError)
            {
                errMessage     = "bad request";
                httpStatusCode = HttpStatusCode.BadRequest;
                Logger.LogWarning(errMessage);
            }
            else
            {
                try
                {
                    var channel = grpcPool.GetChannel(new ServiceEndpoint(httpContext.Items.DownstreamRequest().Host, httpContext.Items.DownstreamRequest().Port));
                    var client  = new MethodDescriptorClient(channel);
                    result = await client.InvokeAsync(buildRequest.Data.GrpcMethod, buildRequest.Data.Headers, buildRequest.Data.RequestMessage);
                }
                catch (RpcException ex)
                {
                    httpStatusCode = HttpStatusCode.InternalServerError;
                    errMessage     = $"rpc exception.";
                    Logger.LogError($"{ex.StatusCode}--{ex.Message}", ex);
                }
                catch (Exception ex)
                {
                    httpStatusCode = HttpStatusCode.ServiceUnavailable;
                    errMessage     = $"error in request grpc service.";
                    Logger.LogError($"{errMessage}--{httpContext.Items.DownstreamRequest().ToUri()}", ex);
                }
            }
            OkResponse <GrpcHttpContent> httpResponse;

            if (string.IsNullOrEmpty(errMessage))
            {
                httpResponse = new OkResponse <GrpcHttpContent>(new GrpcHttpContent(result));
            }
            else
            {
                httpResponse = new OkResponse <GrpcHttpContent>(new GrpcHttpContent(errMessage));
            }
            httpContext.Response.ContentType = "application/json";
            httpContext.Items.UpsertDownstreamResponse(new DownstreamResponse(httpResponse.Data, httpStatusCode, httpResponse.Data.Headers, "OcelotGrpcHttpMiddleware"));
            // httpContext.DownstreamResponse = new DownstreamResponse(httpResponse.Data, httpStatusCode, httpResponse.Data.Headers, "OcelotGrpcHttpMiddleware");
        }
        public void should_return_claims_to_things()
        {
            var userInput = new Dictionary <string, string>()
            {
                { "CustomerId", "Claims[CustomerId] > value" }
            };

            var claimsToThing = new OkResponse <ClaimToThing>(new ClaimToThing("CustomerId", "CustomerId", "", 0));

            this.Given(x => x.GivenTheFollowingDictionary(userInput))
            .And(x => x.GivenTheConfigHeaderExtractorReturns(claimsToThing))
            .When(x => x.WhenIGetTheThings())
            .Then(x => x.ThenTheConfigParserIsCalledCorrectly())
            .And(x => x.ThenClaimsToThingsAreReturned())
            .BDDfy();
        }
Beispiel #12
0
        public async Task <OkResponse <CourseDto> > CreateAsync(CourseCreateDto dto)
        {
            if (dto == null || string.IsNullOrEmpty(dto.Name))
            {
                return(OkResponse <CourseDto> .Error(HttpStatusCode.BadRequest, "Model is not valid!"));
            }

            var newCourse = _mapper.Map <Course>(dto);

            newCourse.CreatedTime = DateTime.Now;
            await _courseCollection.InsertOneAsync(newCourse);

            var mapDto = _mapper.Map <CourseDto>(newCourse);

            return(OkResponse <CourseDto> .Success(HttpStatusCode.OK, mapDto));
        }
        public Response <DownstreamRoute> Get(string upstreamUrlPath, string upstreamQueryString, string upstreamHttpMethod, IInternalConfiguration configuration, string upstreamHost)
        {
            var serviceName = GetServiceName(upstreamUrlPath);

            var downstreamPath = GetDownstreamPath(upstreamUrlPath);

            if (HasQueryString(downstreamPath))
            {
                downstreamPath = RemoveQueryString(downstreamPath);
            }

            var downstreamPathForKeys = $"/{serviceName}{downstreamPath}";

            var loadBalancerKey = CreateLoadBalancerKey(downstreamPathForKeys, upstreamHttpMethod, configuration.LoadBalancerOptions);

            if (_cache.TryGetValue(loadBalancerKey, out var downstreamRoute))
            {
                return(downstreamRoute);
            }

            var qosOptions = _qoSOptionsCreator.Create(configuration.QoSOptions, downstreamPathForKeys, new [] { upstreamHttpMethod });

            var downstreamReRoute = new DownstreamReRouteBuilder()
                                    .WithServiceName(serviceName)
                                    .WithLoadBalancerKey(loadBalancerKey)
                                    .WithDownstreamPathTemplate(downstreamPath)
                                    .WithUseServiceDiscovery(true)
                                    .WithHttpHandlerOptions(configuration.HttpHandlerOptions)
                                    .WithQosOptions(qosOptions)
                                    .WithDownstreamScheme(configuration.DownstreamScheme)
                                    .WithLoadBalancerOptions(configuration.LoadBalancerOptions)
                                    .Build();

            var reRoute = new ReRouteBuilder()
                          .WithDownstreamReRoute(downstreamReRoute)
                          .WithUpstreamHttpMethod(new List <string>()
            {
                upstreamHttpMethod
            })
                          .Build();

            downstreamRoute = new OkResponse <DownstreamRoute>(new DownstreamRoute(new List <PlaceholderNameAndValue>(), reRoute));

            _cache.AddOrUpdate(loadBalancerKey, downstreamRoute, (x, y) => downstreamRoute);

            return(downstreamRoute);
        }
Beispiel #14
0
        TResponse TryDeserialize <TResponse>(string responseJson) where TResponse : class, IKernelResponse
        {
            JObject responseObject = (JObject)JsonConvert.DeserializeObject(responseJson, new JsonSerializerSettings
            {
                DateParseHandling = DateParseHandling.None
            }) !;

            if (responseObject.ContainsKey("error"))
            {
                ErrorResponse errorResponse = responseObject.ToObject <ErrorResponse>() !;

                throw new JsiiException(errorResponse, null);
            }

            if (typeof(TResponse).IsAssignableFrom(typeof(HelloResponse)))
            {
                return(responseObject.ToObject <TResponse>() !);
            }

            if (responseObject.ContainsKey("callback"))
            {
                CallbackResponse callbackResponse = responseObject.ToObject <CallbackResponse>() !;
                Callback         callback         = callbackResponse.Callback;

                object?result = callback.InvokeCallback(_referenceMap, _frameworkToJsiiConverter, out string?error);

                return(Send <SynchronousCompleteRequest, TResponse>(new SynchronousCompleteRequest
                                                                    (
                                                                        new CompleteRequest(callback.CallbackId, error, result)
                                                                    )));
            }

            if (responseObject.ContainsKey("pending"))
            {
                // TODO: What does this mean?
                throw new NotImplementedException();
            }

            if (responseObject.ContainsKey("ok"))
            {
                OkResponse <TResponse> okResponse = responseObject.ToObject <OkResponse <TResponse> >() !;

                return(okResponse.Ok);
            }

            throw new ArgumentException("Unrecognized response format", nameof(responseJson));
        }
Beispiel #15
0
        public void BasicEventDispatcherTest()
        {
            const int port = 8732;

            //Setup test's ZMQ
            Utils.CreateZmq(ZSocketType.REP, port, true, out ZContext context, out ZSocket socket);

            //Create the event dispatcher
            EventDispatcher <EngineActionEvent, EngineActionResponse> eventDispatcher = null;

            _ = Task.Run(() =>
            {
                eventDispatcher = new EventDispatcher <EngineActionEvent, EngineActionResponse>(new TimeSpan(0, 0, 0, 4), port);
                eventDispatcher.DispatchEventsThread().RunSynchronously();
            });
            SpinWait.SpinUntil(() => eventDispatcher != null);

            //Send the event
            bool gotResponse = false;

            eventDispatcher.QueueEvent(new PingEvent(), responseEventDispatcher =>
            {
                //We got a response
                gotResponse = true;
                Assert.IsNotNull(responseEventDispatcher);
                Assert.That(responseEventDispatcher.GetType(), Is.EqualTo(typeof(OkResponse)));
            });

            //Get a event from the dispatcher
            byte[]            requestData = socket.Receive();
            EngineActionEvent actionEvent = EventsSerializer.DeserializeEvent <EngineActionEvent>(requestData);

            Assert.IsNotNull(actionEvent);
            Assert.That(actionEvent.GetType(), Is.EqualTo(typeof(PingEvent)));

            //Respond
            EngineActionResponse response = new OkResponse();

            byte[] responseData = EventsSerializer.SerializeEvent <EngineActionResponse>(response);
            socket.Send(responseData);
            SpinWait.SpinUntil(() => gotResponse);

            eventDispatcher.Dispose();
            socket.Dispose();
            context.Dispose();
        }
Beispiel #16
0
        public IActionResult Index([FromBody] GameCloseRequest request, string appId)
        {
            if (!IsValid(request, out string message))
            {
                var errorResponse = new ErrorResponse {
                    Message = message
                };
                _logger.LogError($"{Request.GetUri()} - {JsonConvert.SerializeObject(errorResponse)}");
                return(Ok(errorResponse));
            }

            appId = appId.ToLowerInvariant();

            if (request.State == null)
            {
                if (request.ActorCount > 0)
                {
                    var errorResponse = new ErrorResponse {
                        Message = "Missing State."
                    };
                    _logger.LogError($"{Request.GetUri()} - {JsonConvert.SerializeObject(errorResponse)}");
                    return(Ok(errorResponse));
                }

                _dataAccess.StateDelete(appId, request.GameId);

                var okResponse = new OkResponse();
                _logger.LogInformation($"{Request.GetUri()} - {JsonConvert.SerializeObject(okResponse)}");
                return(Ok(okResponse));
            }

            foreach (var actor in request.State.ActorList)
            {
                //var listProperties = new ListProperties() { ActorNr = (int)actor.ActorNr, Properties = request.State.CustomProperties };
                _dataAccess.GameInsert(appId, (string)actor.UserId, request.GameId, (int)actor.ActorNr);
            }

            var state = JsonConvert.SerializeObject(request.State);

            _dataAccess.StateSet(appId, request.GameId, state);

            var response = new OkResponse();

            _logger.LogInformation($"{Request.GetUri()} - {JsonConvert.SerializeObject(response)}");
            return(Ok(response));
        }
Beispiel #17
0
        public async Task <OkResponse <CategoryDto> > GetByIdAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return(OkResponse <CategoryDto> .Error(HttpStatusCode.BadRequest, "Id cannot be empty!"));
            }

            var category = await _categoryCollection.Find(x => x.Id == id).FirstOrDefaultAsync();

            if (category == null)
            {
                return(OkResponse <CategoryDto> .Error(HttpStatusCode.NotFound, "Category not found!"));
            }

            var mapDto = _mapper.Map <CategoryDto>(category);

            return(OkResponse <CategoryDto> .Success(HttpStatusCode.OK, mapDto));
        }
Beispiel #18
0
 private void GivenNotPassingSecurityVerification()
 {
     for (int i = 0; i < _securityPolicyList.Count; i++)
     {
         Mock <ISecurityPolicy> item = _securityPolicyList[i];
         if (i == 0)
         {
             Error    error    = new UnauthenticatedError($"Not passing security verification");
             Response response = new ErrorResponse(error);
             item.Setup(x => x.Security(_downstreamContext)).Returns(Task.FromResult(response));
         }
         else
         {
             Response response = new OkResponse();
             item.Setup(x => x.Security(_downstreamContext)).Returns(Task.FromResult(response));
         }
     }
 }
Beispiel #19
0
        public async Task <OkResponse <object> > DeleteAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return(OkResponse <object> .Error(HttpStatusCode.BadRequest, "Id cannot be empty!"));
            }

            var result = await _courseCollection.DeleteOneAsync(x => x.Id == id);

            if (result.DeletedCount > 0)
            {
                return(OkResponse <object> .Success(HttpStatusCode.NoContent));
            }
            else
            {
                return(OkResponse <object> .Error(HttpStatusCode.NotFound, "Course is not found."));
            }
        }
Beispiel #20
0
        public async Task <OkResponse <CategoryDto> > UpdateAsync(CategoryUpdateDto dto)
        {
            if (dto == null || string.IsNullOrEmpty(dto.Id) || string.IsNullOrEmpty(dto.Name))
            {
                return(OkResponse <CategoryDto> .Error(HttpStatusCode.BadRequest, "Model is not valid!"));
            }

            var updateCategory = _mapper.Map <Category>(dto);
            var result         = await _categoryCollection.FindOneAndReplaceAsync(x => x.Id == updateCategory.Id, updateCategory);

            if (result == null)
            {
                return(OkResponse <CategoryDto> .Error(HttpStatusCode.NotFound, "Category is not found."));
            }

            var mapDto = _mapper.Map <CategoryDto>(result);

            return(OkResponse <CategoryDto> .Success(HttpStatusCode.OK, mapDto));
        }
        public dynamic Post(GameLeaveRequest request, string appId)
        {
            appId = appId.ToLowerInvariant();

            string message;

            if (!IsValid(request, out message))
            {
                var errorResponse = new ErrorResponse {
                    Message = message
                };
                if (log.IsDebugEnabled)
                {
                    log.Debug(JsonConvert.SerializeObject(errorResponse));
                }
                return(errorResponse);
            }

            if (log.IsDebugEnabled)
            {
                log.DebugFormat("{0} - {1}", Request.RequestUri, JsonConvert.SerializeObject(request));
            }

            if (request.IsInactive)
            {
                if (request.ActorNr > 0)
                {
                    WebApiApplication.DataAccess.GameInsert(appId, request.UserId, request.GameId, request.ActorNr);
                }
            }
            else
            {
                WebApiApplication.DataAccess.GameDelete(appId, request.UserId, request.GameId);
            }

            var okResponse = new OkResponse();

            if (log.IsDebugEnabled)
            {
                log.Debug(JsonConvert.SerializeObject(okResponse));
            }
            return(okResponse);
        }
        public async Task Invoke(DownstreamContext context)
        {
            var httpStatusCode = HttpStatusCode.OK;
            var buildRequest   = await _dotNettyRequestBuilder.BuildRequest(context);

            string resultMessage;

            if (buildRequest.IsError)
            {
                resultMessage  = "bad request";
                httpStatusCode = HttpStatusCode.BadRequest;
                Logger.LogDebug(resultMessage);
            }
            else
            {
                try
                {
                    var endpoint  = new IPEndPoint(IPAddress.Parse(context.DownstreamRequest.Host), context.DownstreamRequest.Port);
                    var serviceId = context.DownstreamRequest.AbsolutePath.TrimStart('/');
                    var result    = await _serviceProxyProvider.InvokeAsync <object>(buildRequest.Data, serviceId, endpoint);

                    resultMessage = JsonConvert.SerializeObject(result);
                }
                catch (RpcException ex)
                {
                    httpStatusCode = HttpStatusCode.InternalServerError;
                    resultMessage  = $"rpc exception.";
                    Logger.LogError("apigateway dotnetty client error", ex);
                }
                catch (Exception ex)
                {
                    httpStatusCode = HttpStatusCode.ServiceUnavailable;
                    resultMessage  = $"error in request netty service.";
                    Logger.LogError($"{resultMessage}--{context.DownstreamRequest.ToUri()}", ex);
                }
            }

            OkResponse <DotNettyHttpContent> httpResponse = new OkResponse <DotNettyHttpContent>(new DotNettyHttpContent(resultMessage));

            //context.HttpContext.Response.ContentType = "application/json";
            context.DownstreamResponse = new DownstreamResponse(httpResponse.Data, httpStatusCode, httpResponse.Data.Headers, string.Empty);
        }
        public async Task Invoke(DownstreamContext context)
        {
            string resultMessage  = string.Empty;
            var    httpStatusCode = HttpStatusCode.OK;
            var    buildRequest   = grpcRequestBuilder.BuildRequest(context);

            if (buildRequest.IsError)
            {
                resultMessage  = "bad request";
                httpStatusCode = HttpStatusCode.BadRequest;
                Logger.LogDebug(resultMessage);
                //SetPipelineError(context, buildRequest.Errors);
            }
            else
            {
                try
                {
                    //缓存连接应该使用服务发现或执行健康检查,不如会等太久
                    var channel = grpcChannelFactory.GetGrpcChannel(context.DownstreamRequest.Host, context.DownstreamRequest.Port);
                    var client  = new GrpcClient(channel);

                    resultMessage = await client.InvokeMethodAsync(buildRequest.Data.GrpcMethod, buildRequest.Data.RequestMessage);
                }
                catch (RpcException ex)
                {
                    httpStatusCode = HttpStatusCode.InternalServerError;
                    resultMessage  = $"rpc exception.";
                    Logger.LogError($"{ex.StatusCode}--{ex.Message}", ex);
                }
                catch (Exception ex)
                {
                    httpStatusCode = HttpStatusCode.ServiceUnavailable;
                    resultMessage  = $"error in request grpc service.";
                    //SetPipelineError(context, new UnknownError(error));
                    Logger.LogError($"{resultMessage}--{context.DownstreamRequest.ToUri()}", ex);
                }
            }
            OkResponse <GrpcHttpContent> httpResponse = new OkResponse <GrpcHttpContent>(new GrpcHttpContent(resultMessage));

            context.HttpContext.Response.ContentType = "application/json";
            context.DownstreamResponse = new DownstreamResponse(httpResponse.Data, httpStatusCode, httpResponse.Data.Headers);
        }
        public async Task <Response <ServiceHostAndPort> > Lease(HttpContext httpContext)
        {
            var services = await _services();

            if (_failings is null)
            {
                _failings = new Dictionary <int, Service>();
                await PollAsync(null);

                t = new Timer(Poll);
                t.Change(10000, 10000);
                _last = -1;
            }

            lock (_lock)
            {
                if (_failings.Count == services.Count)
                {
                    Console.WriteLine("Critical: No available api nodes");
                    return(new ErrorResponse <ServiceHostAndPort>(new ErrorInvokingLoadBalancerCreator(new Exception("No available API Nodes."))));
                }
                _last++;
                if (_last >= services.Count)
                {
                    _last = 0;
                }
                while (_failings.ContainsKey(_last))
                {
                    _last++;
                    if (_last >= services.Count)
                    {
                        _last = 0;
                    }
                }
                //Console.WriteLine(this.route.LoadBalancerKey + " " + _last);
                var next = services[_last];

                var response = new OkResponse <ServiceHostAndPort>(next.HostAndPort);
                return(response);
            }
        }
        private static dynamic GameCreate(GameCreateRequest request, string appId)
        {
            dynamic response;
            if (WebApiApplication.DataAccess.StateExists(appId, request.GameId))
            {
                response = new ErrorResponse { Message = "Game already exists." };
                return response;
            }

            if (request.CreateOptions == null)
            {
                WebApiApplication.DataAccess.StateSet(appId, request.GameId, string.Empty);
            }
            else
            {
                WebApiApplication.DataAccess.StateSet(appId, request.GameId, (string)JsonConvert.SerializeObject(request.CreateOptions));
            }

            response = new OkResponse();
            return response;
        }
        private static SwaggerServiceDiscoveryProvider CreateProvider(Service service = null)
        {
            IServiceDiscoveryProviderFactory     serviceDiscovery     = Substitute.For <IServiceDiscoveryProviderFactory>();
            IServiceProviderConfigurationCreator configurationCreator = Substitute.For <IServiceProviderConfigurationCreator>();
            IOptionsMonitor <FileConfiguration>  options = Substitute.For <IOptionsMonitor <FileConfiguration> >();

            options.CurrentValue.Returns(new FileConfiguration());

            IServiceDiscoveryProvider serviceProvider = Substitute.For <IServiceDiscoveryProvider>();

            serviceProvider.Get().Returns(new List <Service>()
            {
                service
            });
            var response = new OkResponse <IServiceDiscoveryProvider>(serviceProvider);

            serviceDiscovery.Get(Arg.Any <ServiceProviderConfiguration>(), Arg.Any <DownstreamReRoute>()).Returns(response);

            var provider = new SwaggerServiceDiscoveryProvider(serviceDiscovery, configurationCreator, options);

            return(provider);
        }
        public override int GetHashCode()
        {
            int hash = 1;

            if (status_ != null)
            {
                hash ^= Status.GetHashCode();
            }
            if (httpResponseCase_ == HttpResponseOneofCase.DeniedResponse)
            {
                hash ^= DeniedResponse.GetHashCode();
            }
            if (httpResponseCase_ == HttpResponseOneofCase.OkResponse)
            {
                hash ^= OkResponse.GetHashCode();
            }
            hash ^= (int)httpResponseCase_;
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Beispiel #28
0
        public async Task <OkResponse <List <CourseDto> > > GetAllAsync(string userId = null)
        {
            var courses = await _courseCollection.Find(x => string.IsNullOrEmpty(userId) || x.UserId == userId).ToListAsync();

            if (!courses.Any())
            {
                courses = new List <Course>();
            }
            else
            {
                var categoryIds = courses.Select(x => x.CategoryId).ToList();
                var categories  = await _categoryCollection.Find(x => categoryIds.Contains(x.Id)).ToListAsync();

                if (categoryIds.Any())
                {
                    courses.ForEach(item => item.Category = categories.FirstOrDefault(x => x.Id == item.CategoryId));
                }
            }

            var mapDtos = _mapper.Map <List <CourseDto> >(courses);

            return(OkResponse <List <CourseDto> > .Success(HttpStatusCode.OK, mapDtos));
        }
Beispiel #29
0
        public async Task <TResponse> ExecuteAsync(ServiceRequest request, Func <Task> action)
        {
            Guard.ThrowIfNull(request, nameof(request));
            Guard.ThrowIfNull(action, nameof(action));

            ServiceResponse response;

            _logger.Information(request.CorrelationId, $"{action.Method.Name} => Started");

            var timer = new Stopwatch();

            try
            {
                timer.Start();
                await action();

                timer.Stop();

                _logger.Verbose(request.CorrelationId, $"{action.Method.Name} => Execution time: {timer.ElapsedMilliseconds}.");

                response = new OkResponse(request.CorrelationId);
            }
            catch (Exception ex)
            {
                _logger.Error(request.CorrelationId, ex, $"{action.Method.Name} => Failed.");

                response = new FailedResponse(request.CorrelationId, ex, action.Method.Name);
            }
            finally
            {
                _logger.Information(request.CorrelationId, $"{action.Method.Name} => Finished.");
            }

            var convertedResponse = _converter(response);

            return(convertedResponse);
        }
Beispiel #30
0
        public static dynamic GameLoad(GameCreateRequest request, string appId)
        {
            dynamic response;
            string  stateJson = string.Empty;

            stateJson = WebApiApplication.DataAccess.StateGet(appId, request.GameId);

            if (!string.IsNullOrEmpty(stateJson))
            {
                response = new GameLoadResponse {
                    State = JsonConvert.DeserializeObject(stateJson)
                };
                return(response);
            }

            //TBD - check how deleteIfEmpty works with createifnot exists
            if (stateJson == string.Empty)
            {
                WebApiApplication.DataAccess.StateDelete(appId, request.GameId);

                if (log.IsDebugEnabled)
                {
                    log.DebugFormat("Deleted empty state, app id {0}, gameId {1}", appId, request.GameId);
                }
            }

            if (request.CreateIfNotExists)
            {
                response = new OkResponse();
                return(response);
            }

            response = new ErrorResponse {
                Message = "GameId not Found."
            };
            return(response);
        }
Beispiel #31
0
        private static dynamic GameCreate(GameCreateRequest request, string appId)
        {
            dynamic response;

            if (WebApiApplication.DataAccess.StateExists(appId, request.GameId))
            {
                response = new ErrorResponse {
                    Message = "Game already exists."
                };
                return(response);
            }

            if (request.CreateOptions == null)
            {
                WebApiApplication.DataAccess.StateSet(appId, request.GameId, string.Empty);
            }
            else
            {
                WebApiApplication.DataAccess.StateSet(appId, request.GameId, (string)JsonConvert.SerializeObject(request.CreateOptions));
            }

            response = new OkResponse();
            return(response);
        }
Beispiel #32
0
        public static async Task HandleGrpcRequestAsync(this DownstreamContext context, Func <Task> next, IEnumerable <Interceptor> interceptors = null, SslCredentials secureCredentials = null)
        {
            // ignore if the request is not a gRPC content type
            if (!context.HttpContext.Request.Headers.Any(h => h.Key.ToLowerInvariant() == "content-type" && h.Value == "application/grpc"))
            {
                await next.Invoke();
            }
            else
            {
                var methodPath           = context.DownstreamReRoute.DownstreamPathTemplate.Value;
                var grpcAssemblyResolver = context.HttpContext.RequestServices.GetService <GrpcAssemblyResolver>();
                var methodDescriptor     = grpcAssemblyResolver.FindMethodDescriptor(methodPath.Split('/').Last().ToUpperInvariant());

                if (methodDescriptor == null)
                {
                    await next.Invoke();
                }
                else
                {
                    var logger          = context.HttpContext.RequestServices.GetService <IOcelotLoggerFactory>().CreateLogger <GrpcAssemblyResolver>();
                    var upstreamHeaders = new Dictionary <string, string>
                    {
                        { "x-grpc-route-data", JsonConvert.SerializeObject(context.TemplatePlaceholderNameAndValues.Select(x => new { x.Name, x.Value })) },
                        { "x-grpc-body-data", await context.DownstreamRequest.Content.ReadAsStringAsync() }
                    };

                    logger.LogInformation($"Upstream request method is {context.HttpContext.Request.Method}");
                    logger.LogInformation($"Upstream header data for x-grpc-route-data is {upstreamHeaders["x-grpc-route-data"]}");
                    logger.LogInformation($"Upstream header data for x-grpc-body-data is {upstreamHeaders["x-grpc-body-data"]}");
                    var requestObject   = context.HttpContext.ParseRequestData(upstreamHeaders);
                    var requestJsonData = JsonConvert.SerializeObject(requestObject);
                    logger.LogInformation($"Request object data is {requestJsonData}");

                    var loadBalancerFactory  = context.HttpContext.RequestServices.GetService <ILoadBalancerFactory>();
                    var loadBalancerResponse = await loadBalancerFactory.Get(context.DownstreamReRoute, context.Configuration.ServiceProviderConfiguration);

                    var serviceHostPort = await loadBalancerResponse.Data.Lease(context);

                    var downstreamHost = $"{serviceHostPort.Data.DownstreamHost}:{serviceHostPort.Data.DownstreamPort}";
                    logger.LogInformation($"Downstream IP Address is {downstreamHost}");

                    var channel = new Channel(downstreamHost, secureCredentials ?? ChannelCredentials.Insecure);

                    MethodDescriptorCaller client;
                    if (interceptors != null && interceptors.Any())
                    {
                        CallInvoker callInvoker = null;
                        foreach (var interceptor in interceptors)
                        {
                            callInvoker = channel.Intercept(interceptor);
                        }
                        client = new MethodDescriptorCaller(callInvoker);
                    }
                    else
                    {
                        client = new MethodDescriptorCaller(channel);
                    }

                    var concreteObject = JsonConvert.DeserializeObject(requestJsonData, methodDescriptor.InputType.ClrType);
                    var result         = await client.InvokeAsync(methodDescriptor, context.HttpContext.GetRequestHeaders(), concreteObject);

                    logger.LogDebug($"gRPC response called with {JsonConvert.SerializeObject(result)}");

                    var jsonSerializer = new JsonSerializerSettings {
                        ContractResolver = new CamelCasePropertyNamesContractResolver()
                    };
                    var response = new OkResponse <GrpcHttpContent>(new GrpcHttpContent(JsonConvert.SerializeObject(result, jsonSerializer)));

                    var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = response.Data
                    };

                    context.HttpContext.Response.ContentType = "application/json";
                    context.DownstreamResponse = new DownstreamResponse(httpResponseMessage);
                }
            }
        }
Beispiel #33
0
        private IResponse HandleRequest(Request request)
        {
            IResponse response = null;

            if (request is LoginRequest)
            {
                Console.WriteLine(value: "Login request ...");
                LoginRequest logReq = (LoginRequest)request;
                UserDTO      udto   = logReq.User;
                User         user   = DTOUtils.GetFromDTO(usdto: udto);
                try
                {
                    lock (server)
                    {
                        server.Login(user: user, client: this);
                    }
                    return(new OkResponse());
                }
                catch (ControllerException e)
                {
                    _connected = false;
                    return(new ErrorResponse(message: e.Message));
                }
            }
            if (request is LogoutRequest)
            {
                Console.WriteLine(value: "Logout request");
                LogoutRequest logReq = (LogoutRequest)request;
                UserDTO       udto   = logReq.User;
                User          user   = DTOUtils.GetFromDTO(usdto: udto);
                try
                {
                    lock (server)
                    {
                        server.Logout(user: user, client: this);
                    }
                    //_connected = false;
                    return(new OkResponse());
                }
                catch (ControllerException e)
                {
                    _connected = false;
                    return(new ErrorResponse(message: e.Message));
                }
            }
            if (request is GetAllRequest)
            {
                Console.WriteLine(value: "GetAllRequest");
                GetAllRequest getAllRequest = (GetAllRequest)request;
                try
                {
                    List <Match> list = null;
                    lock (server)
                    {
                        list = server.GetAllMatches();
                    }
                    // _connected = false;
                    response = new GetAllReponse(list: list);
                }
                catch (Exception e)
                {
                    _connected = false;
                    response   = new ErrorResponse(message: e.Message);
                }
            }
            if (request is GetAllFilteredAndSortedRequest)
            {
                Console.WriteLine(value: "GetAllFilteredAndSortedRequest");
                GetAllFilteredAndSortedRequest getAllRequest = (GetAllFilteredAndSortedRequest)request;
                try
                {
                    List <Match> list = null;
                    lock (server)
                    {
                        list = server.GetFilteredAndSortedMatches();
                    }
                    // _connected = false;
                    response = new GetAllFilteredAndSortedResponse(list: list);
                }
                catch (Exception e)
                {
                    _connected = false;
                    response   = new ErrorResponse(message: e.Message);
                }
            }
            if (request is SellTicketsRequest)
            {
                Console.WriteLine(value: "Worker - sellTickets");
                SellTicketsRequest sellTicketsRequest = (SellTicketsRequest)request;
                try
                {
                    SalesDTO sale = sellTicketsRequest.Sale;
                    lock (server)
                    {
                        this.server.SellTickets(idMatch: sale.IdMatch, quantity: sale.Quantity, buyerPerson: sale.Person,
                                                username: sale.Username);
                    }
                    response = new OkResponse();
                }
                catch (Exception e)
                {
                    _connected = false;
                    response   = new ErrorResponse(e.Message);
                }
            }
            return(response);
        }
        public static dynamic GameLoad(GameCreateRequest request, string appId)
        {
            dynamic response;
            string stateJson = string.Empty;
            stateJson = WebApiApplication.DataAccess.StateGet(appId, request.GameId);

            if (!string.IsNullOrEmpty(stateJson))
            {
                response = new GameLoadResponse { State = JsonConvert.DeserializeObject(stateJson) };
                return response;
            }

            //TBD - check how deleteIfEmpty works with createifnot exists
            if (stateJson == string.Empty)
            {
                WebApiApplication.DataAccess.StateDelete(appId, request.GameId);

                if (log.IsDebugEnabled)
                {
                    log.DebugFormat("Deleted empty state, app id {0}, gameId {1}", appId, request.GameId);
                }
            }

            if (request.CreateIfNotExists)
            {
                response = new OkResponse();
                return response;
            }

            response = new ErrorResponse { Message = "GameId not Found." };
            return response;
        }
        public Response <DownstreamRouteHolder> Get(string upstreamUrlPath, string upstreamQueryString, string upstreamHttpMethod, IInternalConfiguration configuration, string upstreamHost)
        {
            var serviceName = IsSystemApi(upstreamUrlPath) ? "baseService" : GetServiceName(upstreamUrlPath);
            //var downstreamPath = IsSystemApi(upstreamUrlPath) ? upstreamUrlPath : GetDownstreamPath(upstreamUrlPath);
            var downstreamPath = upstreamUrlPath;

            if (HasQueryString(downstreamPath))
            {
                downstreamPath = RemoveQueryString(downstreamPath);
            }

            var downstreamPathForKeys = $"/{serviceName}{downstreamPath}";

            var loadBalancerKey = CreateLoadBalancerKey(downstreamPathForKeys, upstreamHttpMethod, configuration.LoadBalancerOptions);

            if (_cache.TryGetValue(loadBalancerKey, out var downstreamRouteHolder))
            {
                return(downstreamRouteHolder);
            }

            var qosOptions = _qoSOptionsCreator.Create(configuration.QoSOptions, downstreamPathForKeys, new List <string> {
                upstreamHttpMethod
            });

            var upstreamPathTemplate = new UpstreamPathTemplateBuilder().WithOriginalValue(upstreamUrlPath).Build();

            var downstreamRouteBuilder = new DownstreamRouteBuilder()
                                         .WithServiceName(serviceName)
                                         .WithLoadBalancerKey(loadBalancerKey)
                                         .WithDownstreamPathTemplate(downstreamPath)
                                         .WithUseServiceDiscovery(true)
                                         .WithHttpHandlerOptions(configuration.HttpHandlerOptions)
                                         .WithQosOptions(qosOptions)
                                         .WithDownstreamScheme(configuration.DownstreamScheme)
                                         .WithLoadBalancerOptions(configuration.LoadBalancerOptions)
                                         .WithDownstreamHttpVersion(configuration.DownstreamHttpVersion)
                                         .WithUpstreamPathTemplate(upstreamPathTemplate);

            var rateLimitOptions = configuration.Routes != null
                ? configuration.Routes.SelectMany(t => t.DownstreamRoute).FirstOrDefault(t => t.ServiceName == serviceName) : null;

            if (rateLimitOptions != null)
            {
                downstreamRouteBuilder
                .WithRateLimitOptions(rateLimitOptions.RateLimitOptions)
                .WithEnableRateLimiting(true);
            }

            var downstreamRoute = downstreamRouteBuilder.Build();

            var route = new RouteBuilder()
                        .WithDownstreamRoute(downstreamRoute)
                        .WithUpstreamHttpMethod(new List <string>()
            {
                upstreamHttpMethod
            })
                        .WithUpstreamPathTemplate(upstreamPathTemplate)
                        .Build();

            downstreamRouteHolder = new OkResponse <DownstreamRouteHolder>(new DownstreamRouteHolder(new List <PlaceholderNameAndValue>(), route));

            _cache.AddOrUpdate(loadBalancerKey, downstreamRouteHolder, (x, y) => downstreamRouteHolder);

            return(downstreamRouteHolder);
        }
Beispiel #36
0
        private IResponse handleRequest(IRequest request)
        {
            IResponse response = null;

            if (request is LogInRequest)
            {
                Console.WriteLine("Login request ...");
                LogInRequest logReq = (LogInRequest)request;
                AngajatDTO   udto   = logReq.User;
                Angajat      user   = DTOUtils.getFromDTO(udto);

                try
                {
                    lock (server)
                    {
                        bool ok = server.logIn(user.User, user.Parola);
                        if (ok == true)
                        {
                            response = new OkResponse();
                        }
                        else
                        {
                            response = new ErrorResponse("log in error");
                        }
                    }
                }
                catch (Exception e)
                {
                    connected = false;
                    return(new ErrorResponse(e.Message));
                }
            }
            else
            if (request is GetFlightsRequest)
            {
                List <Zbor> flights = new List <Zbor>();
                flights  = server.getAllFlight();
                response = new GetFlightsResponse(DTOUtils.getDTO(flights));
            }
            else
            if (request is SearchFlightsRequest)
            {
                SearchFlightsRequest r       = (SearchFlightsRequest)request;
                List <Zbor>          flights = new List <Zbor>();
                flights  = server.findByDestinatieDataplecareFlight(r.Destinatie, r.DataPlecare);
                response = new SearchFlightsResponse(DTOUtils.getDTO(flights));
            }
            else
            if (request is AddBiletRequest)
            {
                AddBiletRequest r = (AddBiletRequest)request;
                server.addBilet(r.Client, r.Turisti, r.Adresa, r.IdDestinatie);
                response = new AddBiletResponse();
            }
            else
            {
                if (request is FindByIdZborRequest)
                {
                    FindByIdZborRequest r = (FindByIdZborRequest)request;
                    Zbor z = server.findByIdZbor(r.IdZbor);
                    response = new FindByIdResponse(DTOUtils.getDTO(z));
                }
            }
            return(response);
        }