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"); } }
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); }
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); }
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"); }
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); // } //} }
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); }
/// <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); }
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); }
/// <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); }
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(); }
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); }
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(); }
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"); }
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); } }
/// <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)); }
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(); }
/// <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)); }
/// <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)); }
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(); }
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(); }
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(); }
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(); }
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); }
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); }
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"); }
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(); }
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(); }
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); }
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); }
/// <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); }
/// <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); }
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); }); }
public virtual void ApiGet(ApiRequestContext context) { context.Response.SetNamedValue("isEnabled", JsonValue.CreateBooleanValue(IsEnabled)); }
public override void ApiGet(ApiRequestContext context) { if (!States.Any()) { return; } context.Response.SetNamedValue("state", JsonValue.CreateStringValue(States[_index].Id)); }
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; }
public override void ApiPost(ApiRequestContext context) { if (!context.Request.ContainsKey("state")) { return; } string stateId = context.Request.GetNamedString("state", string.Empty); ApplyState(stateId); }
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(); } }
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)); }