public virtual void ApiPost(ApiRequestContext context)
 {
     if (context.Request.ContainsKey("isEnabled"))
     {
         IsEnabled = context.Request.GetNamedBoolean("isEnabled", false);
         NotificationHandler.PublishFrom(this, NotificationType.Info, "'{0}' {1}.", Id, IsEnabled ? "enabled" : "disabled");
     }
 }
Exemplo n.º 2
0
        public override void ApiGet(ApiRequestContext context)
        {
            var state = new JsonObject();
            foreach (var casement in _casements)
            {
                state.SetNamedValue(casement.Id, JsonValue.CreateStringValue(casement.State.ToString()));
            }            

            context.Response.SetNamedValue("state", state);
        }
Exemplo n.º 3
0
        public async Task endpoint_invocation___returns_true_for_api_response_and_uri_and_body_parameter_and_extra_parameters_endpoint()
        {
            var controller = new StandardController();

            var uriModel = new StandardModel
            {
                IntProp = 204
            };

            var bodyModel = new StandardNullableModel
            {
                IntProp = 301
            };

            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    InvocationContext = new ApiInvocationContext
                    {
                        ControllerInstance = controller,
                        UriModel           = uriModel,
                        BodyModel          = bodyModel
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Route = new ApiRoutingItem
                    {
                        Location = new ApiEndpointLocation(
                            controller: controller.GetType(),
                            methodInfo: controller.GetType().GetMethod(nameof(controller.DefaultFullApiResponseEndpointWithUriParameterAndBodyParameterAndExtraParameters)),
                            httpMethod: null)
                    }
                }
            };

            var processed = await context.ProcessHttpEndpointInvocation().ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.StatusCode.Should().Be(200);
            context.Response.ResponseObject.Should().BeOfType <int>();
            context.Response.ResponseObject.Should().Be(301);
        }
Exemplo n.º 4
0
        public async void pipeline_preflight__returns_true_and_includes_max_age_for_explicit_config()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method             = "options",
                    CrossOriginRequest = new CrossOriginRequestValues
                    {
                        Origin = "http://ron.vecchi.net",
                        AccessControlRequestMethod  = "POST",
                        AccessControlRequestHeaders = "Content-Type, X-Header"
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Template = new ApiRoutingTemplate("/test")
                },
                Configuration = new DeepSleepRequestConfiguration
                {
                    CrossOriginConfig = new ApiCrossOriginConfiguration
                    {
                        AllowedHeaders = new string[] { "Content-Type", "X-RequestId" },
                        MaxAgeSeconds  = 100
                    }
                }
            };

            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "POST"));

            var processed = await context.ProcessHttpRequestCrossOriginResourceSharingPreflight(null, null, null).ConfigureAwait(false);

            processed.Should().BeFalse();
            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(200);

            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(3);
            context.Response.Headers[0].Name.Should().Be("Access-Control-Allow-Methods");
            context.Response.Headers[0].Value.Should().Be("POST");
            context.Response.Headers[1].Name.Should().Be("Access-Control-Allow-Headers");
            context.Response.Headers[1].Value.Should().Be("Content-Type, X-RequestId");
            context.Response.Headers[2].Name.Should().Be("Access-Control-Max-Age");
            context.Response.Headers[2].Value.Should().Be("100");
        }
Exemplo n.º 5
0
        public override async Task OnRequestAsync(ApiRequestContext context)
        {
            ITokenManager tokenManager = context.HttpContext.ServiceProvider.GetRequiredService <ITokenManager>();
            string        accessToken  = await tokenManager.GetAccessTokenAsync();

            context.HttpContext.RequestMessage.AddUrlQuery("access_token", accessToken);

            //if (context.HttpContext.RequestMessage.Content != null)
            //{
            //    var data = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync();
            //    if (!string.IsNullOrEmpty(data))
            //    {
            //        var logger = context.HttpContext.ServiceProvider.GetRequiredService<ILogger<AccessTokenApiFilter>>();
            //        logger.LogInformation(data);
            //    }
            //}
        }
Exemplo n.º 6
0
        public async void ProcessExtendedMessagesForMultipleProviders()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Validation     = new ApiValidationInfo
                {
                    Errors = new List <string>
                    {
                        "test1.0",
                        "test1.1",
                        "test1.0",
                        "test1.5",
                        "test1.3"
                    }
                },
                Response = new ApiResponseInfo
                {
                    StatusCode = 400
                },
                Configuration = new Configuration.DeepSleepRequestConfiguration
                {
                    ApiErrorResponseProvider = (p) => new ValidationErrorResponseProvider()
                }
            };

            var processed = await context.ProcessHttpResponseMessages(new ApiRequestContextResolver()).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeAssignableTo <IList <string> >();

            var apiResult = context.Response.ResponseObject as IList <string>;

            apiResult.Should().NotBeNull();
            apiResult.Should().HaveCount(4);
            apiResult[0].Should().Be("test1.0");
            apiResult[1].Should().Be("test1.1");
            apiResult[2].Should().Be("test1.5");
            apiResult[3].Should().Be("test1.3");

            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(0);
        }
Exemplo n.º 7
0
        /// <summary>Builds the API request context.</summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        private Task <ApiRequestContext> BuildApiRequestContext(HttpContext context)
        {
            var serverTime = DateTimeOffset.UtcNow;

            var apiContext = new ApiRequestContext
            {
                PathBase                  = context.Request.PathBase,
                RequestAborted            = context.RequestAborted,
                RequestServices           = context.RequestServices,
                RegisterForDispose        = (disposable) => context.Response.RegisterForDispose(disposable),
                ConfigureMaxRequestLength = (length) => SetMaxRequestLength(length, context),
                Request = new ApiRequestInfo
                {
                    Path                     = context.Request.Path,
                    Protocol                 = context.Request.Protocol,
                    RequestIdentifier        = context.TraceIdentifier ?? Guid.NewGuid().ToString(),
                    Method                   = context.Request.Method.ToUpper(),
                    Accept                   = GetAcceptTypes(context.Request),
                    AcceptCharset            = GetAcceptCharset(context.Request),
                    AcceptLanguage           = GetAcceptLanguage(context.Request),
                    AcceptCulture            = CultureInfo.CurrentUICulture,
                    AcceptEncoding           = GetAcceptEncoding(context.Request),
                    ContentType              = GetContentType(context.Request),
                    ContentLength            = GetContentLength(context.Request),
                    RequestDate              = GetRequestDate(context.Request, serverTime),
                    RemoteUser               = GetRemoteUserFromServerVariables(context.Request),
                    ClientAuthenticationInfo = GetClientAuthInfo(context.Request),
                    CrossOriginRequest       = GetCrossOriginRequestValues(context.Request),
                    QueryVariables           = GetQueryStringVariables(context),
                    Cookies                  = GetRequestCookies(context.Request),
                    // GETTING FULL URI BASED ON HEADER HOST AND NOT DIRECTLY FROM RequestURI.
                    // THIS CAN BE CHANGED VIA PROXY SERVERS BUT CLIENT APPS USE THE HOST HEADER
                    RequestUri        = context.Request.GetEncodedUrl(),
                    Headers           = GetRequestHeaders(context.Request),
                    IfMatch           = GetIfMatch(context.Request),
                    IfNoneMatch       = GetIfNoneMatch(context.Request),
                    IfModifiedSince   = GetIfModifiedSince(context.Request),
                    IfUnmodifiedSince = GetIfUnmodifiedSince(context.Request),
                    Body = context.Request.Body
                }
            };

            apiContext.Runtime.Duration.UtcStart = serverTime;

            return(Task.FromResult(apiContext));
        }
 public override void ApiPost(ApiRequestContext context)
 {
     base.ApiPost(context);
     
     if (context.Request.ContainsKey("action"))
     {
         string action = context.Request.GetNamedString("action");
         if (action.Equals("detected", StringComparison.OrdinalIgnoreCase))
         {
             OnMotionDetected();
         }
         else if (action.Equals("detectionCompleted", StringComparison.OrdinalIgnoreCase))
         {
             OnDetectionCompleted();
         }
     }
 }
        public override void ApiPost(ApiRequestContext context)
        {
            var button = context.Request.GetNamedString("button", string.Empty);

            if (string.IsNullOrEmpty(button))
            {
                throw new BadRequestException("Button is not set.");
            }

            VirtualButton virtualButton;
            if (!_buttons.TryGetValue(button, out virtualButton))
            {
                throw new BadRequestException("The specified button is unknown.");
            }

            virtualButton.ApiPost(context);
        }
Exemplo n.º 10
0
        public async void body_binding___returns_false_and_415_status_for_non_writable_formatter()
        {
            var xmlformatter  = SetupXmlFormatterMock(null, null);
            var jsonformatter = SetupJsonFormatterMock(null, null);
            var mockFactory   = SetupFormatterFactory(xmlformatter.Object, jsonformatter.Object);

            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method            = "POST",
                    ContentLength     = 1,
                    ContentType       = "application/json",
                    InvocationContext = new ApiInvocationContext
                    {
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Route = new ApiRoutingItem
                    {
                        Location = new ApiEndpointLocation(
                            controller: null,
                            httpMethod: null,
                            methodInfo: null,
                            uriParameterType: null,
                            bodyParameterType: typeof(string),
                            simpleParameters: null,
                            methodReturnType: null)
                    }
                }
            };

            var contextResolver = new ApiRequestContextResolver();

            contextResolver.SetContext(context);

            var processed = await context.ProcessHttpRequestBodyBinding(contextResolver, mockFactory.Object).ConfigureAwait(false);

            processed.Should().BeFalse();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(415);
        }
Exemplo n.º 11
0
        /// <summary>
        /// 请求之前
        /// </summary>
        /// <param name="context">上下文</param>
        /// <returns></returns>
        public sealed async override Task OnRequestAsync(ApiRequestContext context)
        {
            var logMessage = new LogMessage
            {
                RequestTime = DateTime.Now,
                HasRequest  = this.LogRequest
            };

            if (this.LogRequest == true)
            {
                var request = context.HttpContext.RequestMessage;
                logMessage.RequestHeaders = request.GetHeadersString();
                logMessage.RequestContent = await this.ReadRequestContentAsync(request.Content).ConfigureAwait(false);
            }

            context.UserDatas.Set(typeof(LoggingFilterAttribute), logMessage);
        }
Exemplo n.º 12
0
        public async void ReturnsTrueWhenEmptyHeaders()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Headers = new List <ApiHeader>()
                }
            };

            var processed = await context.ProcessHttpRequestHeaderValidation().ConfigureAwait(false);

            processed.Should().BeTrue();
            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 13
0
        public override Task OnRequestAsync(ApiRequestContext context)
        {
            var options = context.HttpContext.HttpApiOptions;

            //获取注册时为服务配置的服务名
            options.Properties.TryGetValue("serviceName", out object serviceNameObj);
            string                serviceName    = serviceNameObj as string;
            IServiceProvider      sp             = context.HttpContext.ServiceProvider;
            HostProvider          hostProvider   = sp.GetRequiredService <HostProvider>();
            string                host           = hostProvider.ResolveService(serviceName);
            HttpApiRequestMessage requestMessage = context.HttpContext.RequestMessage;

            //和原有的Uri组合并覆盖原有Uri
            //并非一定要这样实现,只要覆盖了RequestUri,即完成了替换
            requestMessage.RequestUri = requestMessage.MakeRequestUri(new Uri(host));
            return(Task.CompletedTask);
        }
Exemplo n.º 14
0
        public async void pipeline_preflight__returns_true_for_non_options_preflight_request_method(string method)
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method = method
                }
            };

            var processed = await context.ProcessHttpRequestCrossOriginResourceSharingPreflight(null, null, null).ConfigureAwait(false);

            processed.Should().BeTrue();
            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 15
0
        public async void ReturnsTrueAndCorrectHeadersForCachableRequestMethodAndPublicCacheLocation(string method)
        {
            var cacheDirective = new ApiCacheDirectiveConfiguration
            {
                Cacheability      = HttpCacheType.Cacheable,
                CacheLocation     = HttpCacheLocation.Public,
                ExpirationSeconds = 1,
                VaryHeaderValue   = "Accept, Accept-Encoding, Accept-Language"
            };

            var expiresDate = DateTime.Parse(DateTime.UtcNow.AddSeconds(cacheDirective.ExpirationSeconds.Value).ToString("r"));

            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method = method
                },
                Response = new ApiResponseInfo
                {
                    StatusCode = 200
                },
                Configuration = new DeepSleepRequestConfiguration
                {
                    CacheDirective = cacheDirective
                }
            };

            var processed = await context.ProcessHttpResponseCaching(null).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(3);
            context.Response.Headers[0].Name.Should().Be("Cache-Control");
            context.Response.Headers[0].Value.Should().Be($"{cacheDirective.CacheLocation.ToString().ToLower()}, max-age={cacheDirective.ExpirationSeconds}");
            context.Response.Headers[1].Name.Should().Be("Expires");

            var expires = DateTime.Parse(context.Response.Headers[1].Value);

            expires.Should().BeOnOrAfter(expiresDate);

            context.Response.Headers[2].Name.Should().Be("Vary");
            context.Response.Headers[2].Value.Should().Be("Accept, Accept-Encoding, Accept-Language");
        }
Exemplo n.º 16
0
        public async void ReturnsTrueAndCorrectlyBindsUtcDateTimeRouteVariables(string date)
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    InvocationContext = new ApiInvocationContext
                    {
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Route = new ApiRoutingItem
                    {
                        RouteVariables = new Dictionary <string, string>
                        {
                            { "DateTimeProp", date }
                        },
                        Location = new ApiEndpointLocation(
                            controller: null,
                            httpMethod: null,
                            methodInfo: null,
                            uriParameterType: typeof(StandardModel),
                            bodyParameterType: null,
                            simpleParameters: null,
                            methodReturnType: null)
                    }
                }
            };

            var processed = await context.ProcessHttpRequestUriBinding(new FormUrlEncodedObjectSerializer()).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Routing.Should().NotBeNull();
            context.Request.InvocationContext.UriModel.Should().NotBeNull();

            var model = context.Request.InvocationContext.UriModel as StandardModel;

            model.Should().NotBeNull();
            model.DateTimeProp.ToString("r").Should().Be("Mon, 15 Jun 2009 20:45:30 GMT");
        }
        /// <summary>
        /// 处理请求上下文
        /// </summary>
        /// <returns></returns>
        private static async Task HandleRequestAsync(ApiRequestContext context)
        {
            // 参数验证
            var validateProperty = context.HttpContext.HttpApiOptions.UseParameterPropertyValidate;

            foreach (var parameter in context.ActionDescriptor.Parameters)
            {
                var parameterValue = context.Arguments[parameter.Index];
                DataValidator.ValidateParameter(parameter, parameterValue, validateProperty);
            }

            // action特性请求前执行
            foreach (var attr in context.ActionDescriptor.Attributes)
            {
                await attr.OnRequestAsync(context).ConfigureAwait(false);
            }

            // 参数特性请求前执行
            foreach (var parameter in context.ActionDescriptor.Parameters)
            {
                var ctx = new ApiParameterContext(context, parameter);
                foreach (var attr in parameter.Attributes)
                {
                    await attr.OnRequestAsync(ctx).ConfigureAwait(false);
                }
            }

            // Return特性请求前执行
            foreach (var @return in context.ActionDescriptor.Return.Attributes)
            {
                await @return.OnRequestAsync(context).ConfigureAwait(false);
            }

            // GlobalFilter请求前执行
            foreach (var filter in context.HttpContext.HttpApiOptions.GlobalFilters)
            {
                await filter.OnRequestAsync(context).ConfigureAwait(false);
            }

            // Filter请求前执行
            foreach (var filter in context.ActionDescriptor.FilterAttributes)
            {
                await filter.OnRequestAsync(context).ConfigureAwait(false);
            }
        }
Exemplo n.º 18
0
        /// <summary>Processes the HTTP request URI validation.</summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        internal static Task <bool> ProcessHttpRequestUriValidation(this ApiRequestContext context)
        {
            if (!context.RequestAborted.IsCancellationRequested)
            {
                if (context.Configuration?.RequestValidation?.MaxRequestUriLength > 0 && !string.IsNullOrWhiteSpace(context.Request?.RequestUri))
                {
                    if (context.Request.RequestUri.Length > context.Configuration.RequestValidation.MaxRequestUriLength)
                    {
                        context.Response.StatusCode = 414;
                        return(Task.FromResult(false));
                    }
                }

                return(Task.FromResult(true));
            }

            return(Task.FromResult(false));
        }
Exemplo n.º 19
0
        public async void pipeline_method___returns_true_when_endpoint_locations_is_empty()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Routing        = new ApiRoutingInfo
                {
                    Template = new ApiRoutingTemplate(null)
                }
            };

            var processed = await context.ProcessHttpRequestMethod(null, null, null).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 20
0
        /// <summary>Processes the HTTP request not found.</summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        internal static Task <bool> ProcessHttpRequestNotFound(this ApiRequestContext context)
        {
            if (!context.RequestAborted.IsCancellationRequested)
            {
                if ((context.Routing?.Template?.Locations?.Count ?? 0) == 0)
                {
                    context.Runtime.Internals.IsNotFound = true;

                    context.Response.StatusCode = 404;

                    return(Task.FromResult(false));
                }

                return(Task.FromResult(true));
            }

            return(Task.FromResult(false));
        }
Exemplo n.º 21
0
        /// <summary>Processes the HTTP response cross origin resource sharing.</summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        internal static Task <bool> ProcessHttpResponseCookies(this ApiRequestContext context)
        {
            if (!(context?.RequestAborted.IsCancellationRequested ?? false))
            {
                if (context.Response != null && context.Response.Cookies != null)
                {
                    foreach (var cookie in context.Response.Cookies)
                    {
                        context.Response.AddHeader("Set-Cookie", cookie.ToCookie());
                    }
                    ;
                }

                return(Task.FromResult(true));
            }

            return(Task.FromResult(true));
        }
Exemplo n.º 22
0
        public async void ReturnsTrueForNullInvocationContext()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    InvocationContext = null
                }
            };

            var processed = await context.ProcessHttpRequestUriBinding(null).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 23
0
        public async Task endpoint_invocation___returns_true_for_null_invocation_context()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    InvocationContext = null
                }
            };

            var processed = await context.ProcessHttpEndpointInvocation().ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 24
0
        public async void ReturnsFalseForCancelledRequest()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(true)
            };

            var contextResolver = new ApiRequestContextResolver();

            contextResolver.SetContext(context);

            var processed = await context.ProcessHttpRequestAccept(contextResolver, null).ConfigureAwait(false);

            processed.Should().BeFalse();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 25
0
        public async void body_binding___returns_true_for_non_inbody_request_method(string method)
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method = method
                }
            };

            var processed = await context.ProcessHttpRequestBodyBinding(new ApiRequestContextResolver(), null).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 26
0
        public async void pipeline_preflight__returns_correct_request_headers_for_preflight_request_method(string expectedAllowHeaders, params string[] requestHeaders)
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method             = "options",
                    CrossOriginRequest = new CrossOriginRequestValues
                    {
                        Origin = "http://ron.vecchi.net",
                        AccessControlRequestMethod  = "POST",
                        AccessControlRequestHeaders = "Content-Type, X-Header"
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Template = new ApiRoutingTemplate("/test")
                },
                Configuration = new DeepSleepRequestConfiguration
                {
                    CrossOriginConfig = new ApiCrossOriginConfiguration
                    {
                        AllowedHeaders = requestHeaders
                    }
                }
            };

            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "POST"));

            var processed = await context.ProcessHttpRequestCrossOriginResourceSharingPreflight(null, null, null).ConfigureAwait(false);

            processed.Should().BeFalse();
            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(200);

            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(2);
            context.Response.Headers[0].Name.Should().Be("Access-Control-Allow-Methods");
            context.Response.Headers[0].Value.Should().Be("POST");
            context.Response.Headers[1].Name.Should().Be("Access-Control-Allow-Headers");
            context.Response.Headers[1].Value.Should().Be(expectedAllowHeaders);
        }
Exemplo n.º 27
0
        public async void ReturnsTrueAndDoesWritesWithMatchedEtagButUnMatchedIfModifiedSince()
        {
            var            formatter   = SetupJsonFormatterMock(null, new string[] { "application/json", "text/json" });
            var            mockFactory = SetupFormatterFactory(formatter.Object);
            var            etag        = "TEST-IF-MATCH";
            DateTimeOffset lastModifed = DateTimeOffset.UtcNow;


            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Response       = new ApiResponseInfo
                {
                    StatusCode     = 201,
                    ResponseObject = "test"
                },
                Request = new ApiRequestInfo
                {
                    Method          = "GET",
                    Accept          = "application/json",
                    IfMatch         = etag,
                    IfModifiedSince = lastModifed.AddSeconds(1)
                }
            };

            var contextResolver = new ApiRequestContextResolver();

            contextResolver.SetContext(context);

            context.Response.Headers.Add(new ApiHeader("ETag", etag));
            context.Response.Headers.Add(new ApiHeader("Last-Modified", lastModifed.ToString("r")));

            var processed = await context.ProcessHttpResponseBodyWriting(contextResolver, mockFactory.Object).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.ResponseObject.Should().NotBeNull();
            context.Response.StatusCode.Should().Be(201);
            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(2);
            context.Response.ContentType.Should().NotBeNull();
            context.Response.ContentType.Should().Be("application/json");
            context.Response.ContentLength.Should().Be(0);
        }
Exemplo n.º 28
0
        public async void pipeline_preflight__returns_correct_matched_route_templates_allow_methods_for_preflight_request_method(string requestMethod)
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method             = "options",
                    CrossOriginRequest = new CrossOriginRequestValues
                    {
                        Origin = "http://ron.vecchi.net",
                        AccessControlRequestMethod = requestMethod
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Template = new ApiRoutingTemplate("/test")
                }
            };

            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "POST"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "PUT"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "PUT"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "PATCH"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: null));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "get"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: "DelEte"));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: " "));
            context.Routing.Template.Locations.Add(new ApiEndpointLocation(controller: null, methodInfo: null, httpMethod: ""));


            var processed = await context.ProcessHttpRequestCrossOriginResourceSharingPreflight(null, null, null).ConfigureAwait(false);

            processed.Should().BeFalse();
            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(200);

            context.Response.Headers.Should().NotBeNull();
            context.Response.Headers.Should().HaveCount(1);
            context.Response.Headers[0].Name.Should().Be("Access-Control-Allow-Methods");
            context.Response.Headers[0].Value.Should().Be("POST, PUT, PATCH, GET, DELETE");
        }
Exemplo n.º 29
0
        public async void ReturnsTrueForNullProcessingInfo()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Runtime        = null,
                Configuration  = new Configuration.DeepSleepRequestConfiguration
                {
                    ApiErrorResponseProvider = (p) => new ValidationErrorResponseProvider()
                }
            };

            var processed = await context.ProcessHttpResponseMessages(new ApiRequestContextResolver()).ConfigureAwait(false);

            processed.Should().BeTrue();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 30
0
        public async void body_binding___returns_false_for_cancelled_request()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(true),
                Request        = null
            };

            var contextResolver = new ApiRequestContextResolver();

            contextResolver.SetContext(context);

            var processed = await context.ProcessHttpRequestBodyBinding(contextResolver, null).ConfigureAwait(false);

            processed.Should().BeFalse();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
        }
Exemplo n.º 31
0
        public async void ReturnsFalseForEmptyEndpointLocations()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Routing        = new ApiRoutingInfo
                {
                    Template = new ApiRoutingTemplate(null)
                }
            };

            var processed = await context.ProcessHttpRequestNotFound().ConfigureAwait(false);

            processed.Should().BeFalse();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(404);
        }
Exemplo n.º 32
0
        public async void body_binding___returns_false_and_411_status_for_contentlength_supplied_but_null_invocationcontext_bodymodeltype()
        {
            var context = new ApiRequestContext
            {
                RequestAborted = new System.Threading.CancellationToken(false),
                Request        = new ApiRequestInfo
                {
                    Method            = "PATCH",
                    ContentLength     = 1,
                    ContentType       = "application/json",
                    InvocationContext = new ApiInvocationContext
                    {
                    }
                },
                Routing = new ApiRoutingInfo
                {
                    Route = new ApiRoutingItem
                    {
                        Location = new ApiEndpointLocation(
                            controller: null,
                            httpMethod: null,
                            methodInfo: null,
                            uriParameterType: null,
                            bodyParameterType: null,
                            simpleParameters: null,
                            methodReturnType: null)
                    }
                }
            };

            var contextResolver = new ApiRequestContextResolver();

            contextResolver.SetContext(context);

            var processed = await context.ProcessHttpRequestBodyBinding(contextResolver, null).ConfigureAwait(false);

            processed.Should().BeFalse();

            context.Response.Should().NotBeNull();
            context.Response.ResponseObject.Should().BeNull();
            context.Response.StatusCode.Should().Be(413);
        }
Exemplo n.º 33
0
        /// <summary>
        /// Filter请求前
        /// </summary>
        /// <param name="context">上下文</param>
        /// <returns></returns>
        Task IApiFilterAttribute.OnRequestAsync(ApiRequestContext context)
        {
            var jsonRpcContent = new JsonRpcContent(this.ContentType);

            context.HttpContext.RequestMessage.Content = jsonRpcContent;

            var parameters     = context.Properties.Get <JsonRpcParameters>(typeof(JsonRpcParameters));
            var jsonRpcRequest = new JsonRpcRequest
            {
                Method = this.method ?? context.ApiAction.Name,
                Params = parameters.ToJsonRpcParams(this.ParamsStyle),
            };

            var options        = context.HttpContext.HttpApiOptions.JsonSerializeOptions;
            var jsonSerializer = context.HttpContext.ServiceProvider.GetJsonSerializer();

            jsonSerializer.Serialize(jsonRpcContent, jsonRpcRequest, options);

            return(Task.CompletedTask);
        }
Exemplo n.º 34
0
        /// <summary>Handles the exception.</summary>
        /// <param name="context">The context.</param>
        /// <param name="exception">The exception.</param>
        /// <returns></returns>
        internal static int HandleException(this ApiRequestContext context, Exception exception)
        {
            int code;

            if (exception is ApiException apiException)
            {
                code = apiException.HttpStatus;
            }
            else
            {
                code = 500;
            }

            if (context != null)
            {
                context.AddException(exception);
            }

            return(code);
        }
Exemplo n.º 35
0
        private void ExposeToApi()
        {
            HttpApiController.Handle(HttpMethod.Post, "actuator")
                .WithSegment(Id)
                .WithRequiredJsonBody()
                .Using(c =>
                {
                    var context = new ApiRequestContext(c.Request.JsonBody, new JsonObject());
                    ApiPost(context);

                    c.Response.Body = new JsonBody(context.Response);
                });

            HttpApiController.Handle(HttpMethod.Get, "actuator")
                .WithSegment(Id)
                .Using(c =>
                {
                    var context = new ApiRequestContext(c.Request.JsonBody, new JsonObject());
                    ApiGet(context);

                    c.Response.Body = new JsonBody(context.Response);
                });
        }
Exemplo n.º 36
0
 public virtual void ApiGet(ApiRequestContext context)
 {
     context.Response.SetNamedValue("isEnabled", JsonValue.CreateBooleanValue(IsEnabled));
 }
Exemplo n.º 37
0
        public override void ApiGet(ApiRequestContext context)
        {
            if (!States.Any())
            {
                return;
            }

            context.Response.SetNamedValue("state", JsonValue.CreateStringValue(States[_index].Id));
        }
Exemplo n.º 38
0
        private JsonObject GetStatusAsJSON()
        {
            var result = new JsonObject();
            foreach (var actuator in Actuators.Values)
            {
                var context = new ApiRequestContext(new JsonObject(), new JsonObject());
                actuator.ApiGet(context);

                result.SetNamedValue(actuator.Id, context.Response);
            }

            if (WeatherStation != null)
            {
                result.SetNamedValue("weatherStation", WeatherStation.ApiGet());
            }

            return result;
        }
Exemplo n.º 39
0
        public override void ApiPost(ApiRequestContext context)
        {
            if (!context.Request.ContainsKey("state"))
            {
                return;
            }

            string stateId = context.Request.GetNamedString("state", string.Empty);
            ApplyState(stateId);
        }
Exemplo n.º 40
0
        public override void ApiPost(ApiRequestContext context)
        {
            if (!context.Request.ContainsKey("state"))
            {
                return;
            }

            var state = (RollerShutterState)Enum.Parse(typeof(RollerShutterState), context.Request.GetNamedString("state"), true);

            if (state == RollerShutterState.MovingDown)
            {
                StartMoveDown();
            }
            else if (state == RollerShutterState.MovingUp)
            {
                StartMoveUp();
            }
            else
            {
                Stop();
            }
        }
Exemplo n.º 41
0
 public override void ApiGet(ApiRequestContext context)
 {
     context.Response.SetNamedValue("state", JsonValue.CreateStringValue(State.ToString()));
     context.Response.SetNamedValue("position", JsonValue.CreateNumberValue(_position));
     context.Response.SetNamedValue("positionMax", JsonValue.CreateNumberValue(_positionMax));
 }
 public override void ApiGet(ApiRequestContext context)
 {
     base.ApiGet(context);
     context.Response.SetNamedValue("state", JsonValue.CreateBooleanValue(IsMotionDetected));
 }
 public override void ApiGet(ApiRequestContext context)
 {
     context.Response.SetNamedValue("value", JsonValue.CreateNumberValue(Value));
 }