Ejemplo n.º 1
0
        private void DefaultHttpContext(
            HttpContext context,
            MemoryStream memoryStream = null,
            bool isCount    = false,
            bool useProduct = false,
            bool isSingle   = false)
        {
            var request = context.Features.Get <IHttpRequestFeature>();

            request.Method = HttpMethods.Post;
            var contextName = useProduct ? nameof(TestProductsContext) :
                              nameof(TestWidgetsContext);
            var collectionName = useProduct ? nameof(TestProductsContext.Products) :
                                 nameof(TestWidgetsContext.Widgets);

            request.Path = $"/efcore/{contextName}/{collectionName}";

            var bytes         = Encoding.UTF8.GetBytes(queryJson(isCount, useProduct, isSingle));
            var requestStream = new MemoryStream(bytes);

            request.Body = requestStream;

            request.Headers.Add("Content-Type", "application/json");
            request.Headers.Add("Content-Length", requestStream.Length.ToString());

            var responseBody        = memoryStream ?? new MemoryStream();
            var responseBodyFeature = new StreamResponseBodyFeature(responseBody);

            context.Features.Set <IHttpResponseBodyFeature>(responseBodyFeature);
        }
Ejemplo n.º 2
0
        public RPCMiddlewareTest()
        {
            this.authorization   = new Mock <IRPCAuthorization>();
            this.delegateContext = new Mock <RequestDelegate>();

            this.httpContext       = new DefaultHttpContext();
            this.response          = new HttpResponseFeature();
            this.responseBody      = new StreamResponseBodyFeature(new MemoryStream());
            this.request           = new HttpRequestFeature();
            this.featureCollection = new FeatureCollection();

            this.httpContextFactory = new Mock <IHttpContextFactory>();
            this.httpContextFactory.Setup(f => f.Create(It.IsAny <FeatureCollection>())).Returns((FeatureCollection f) =>
            {
                DefaultHttpContext newHttpContext = new DefaultHttpContext();
                newHttpContext.Initialize(f);

                return(newHttpContext);
            });

            var nodeSettings = new NodeSettings(new StraxRegTest());

            this.rpcSettings = new RpcSettings(nodeSettings);

            this.middleware = new RPCMiddleware(this.delegateContext.Object, this.authorization.Object, this.LoggerFactory.Object, this.httpContextFactory.Object, new DataFolder(string.Empty), this.rpcSettings);
        }
        private static DefaultHttpContext SetupDefaultContextWithResponseBodyStream(Stream bodyStream)
        {
            var defaultContext    = new DefaultHttpContext();
            var response          = new StreamResponseBodyFeature(bodyStream);
            var featureCollection = new FeatureCollection();

            featureCollection.Set <IHttpResponseBodyFeature>(response);
            defaultContext.Initialize(featureCollection);
            return(defaultContext);
        }
Ejemplo n.º 4
0
        protected virtual void OverrideRequestDataFeatures(IFeatureCollection newFeatures, IFeatureCollection originalFeatures, IUntypedCall call, Encoding requestEncoding)
        {
            var itemsFeature = CreateItems(originalFeatures.Get <IItemsFeature>());

            itemsFeature.Items[JsonRpcConstants.RequestItemKey]        = call;
            itemsFeature.Items[JsonRpcConstants.NestedPipelineItemKey] = true;
            newFeatures.Set(itemsFeature);
            var requestFeature = CreateRequest(originalFeatures.Get <IHttpRequestFeature>(), call, requestEncoding);

            newFeatures.Set(requestFeature);
            var responseFeature = new StreamResponseBodyFeature(new MemoryStream());

            newFeatures.Set <IHttpResponseBodyFeature>(responseFeature);
        }
    public void DisableBufferingCallsInnerFeature()
    {
        // Arrange
        var stream = new MemoryStream();

        var innerFeature = new InnerDisableBufferingFeature(stream, null);
        var streamResponseBodyFeature = new StreamResponseBodyFeature(stream, innerFeature);

        // Act
        streamResponseBodyFeature.DisableBuffering();

        //Assert
        Assert.True(innerFeature.DisableBufferingCalled);
    }
Ejemplo n.º 6
0
        private async Task AssertExecution(IHttpRequestFeature requestFeature, IHttpResponseFeature responseFeature,
                                           Stream responseStream,
                                           BatchMiddlewareEvents batchMiddlewareEvents,
                                           params ResponseFeature[] responseFeatures)
        {
            var featureCollection = new FeatureCollection();

            featureCollection.Set(requestFeature);
            featureCollection.Set(responseFeature);
            IHttpResponseBodyFeature responseBodyFeature = new StreamResponseBodyFeature(responseStream);

            featureCollection.Set(responseBodyFeature);
            var defaultContext = new DefaultHttpContext(featureCollection);
            var middleware     = CreateMiddleware(CreateRequestDelegate(responseFeatures), batchMiddlewareEvents);
            await middleware.Invoke(defaultContext).ConfigureAwait(false);
        }
        public async Task GivenValidBodyInvokeCalledThenShouldReturnResult()
        {
            nextInvoked = false;
            var target  = NewMiddleware();
            var context = new DefaultHttpContext();

            var request = context.Features.Get <IHttpRequestFeature>();

            request.Method = HttpMethods.Post;
            request.Path   = "/efcore/testwidgetscontext/widgets";

            parseRoute(context, request.Path);

            var bytes         = Encoding.UTF8.GetBytes(queryJson());
            var requestStream = new MemoryStream(bytes);

            request.Body = requestStream;

            request.Headers.Add("Content-Type", "application/json");
            request.Headers.Add("Content-Length", requestStream.Length.ToString());

            var responseBody        = new MemoryStream();
            var responseBodyFeature = new StreamResponseBodyFeature(responseBody);

            context.Features.Set <IHttpResponseBodyFeature>(responseBodyFeature);

            await target.Invoke(context, GetServiceProvider());

            Assert.Equal((int)HttpStatusCode.OK, context.Response.StatusCode);

            context.Response.Body.Flush();
            context.Response.Body.Position = 0;

            using var reader = new StreamReader(context.Response.Body);
            var json = reader.ReadToEnd();

            Assert.False(string.IsNullOrWhiteSpace(json));
            var result = JsonSerializer.Deserialize <TestWidget[]>(json);

            Assert.NotNull(result);
            Assert.Equal(5, result.Length);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Invokes single request.
        /// </summary>
        /// <param name="httpContext">Source batch request context.</param>
        /// <param name="requestObj">Single request object.</param>
        /// <returns>Single response objects.</returns>
        private async Task <JObject> InvokeSingleAsync(HttpContext httpContext, JObject requestObj)
        {
            var contextFeatures = new FeatureCollection(httpContext.Features);

            var requestFeature = new HttpRequestFeature()
            {
                Body        = new MemoryStream(Encoding.UTF8.GetBytes(requestObj.ToString())),
                Headers     = httpContext.Request.Headers,
                Method      = httpContext.Request.Method,
                Protocol    = httpContext.Request.Protocol,
                Scheme      = httpContext.Request.Scheme,
                QueryString = httpContext.Request.QueryString.Value
            };

            contextFeatures.Set <IHttpRequestFeature>(requestFeature);

            var responseMemoryStream = new MemoryStream();
            var responseFeature      = new StreamResponseBodyFeature(responseMemoryStream);

            contextFeatures.Set <IHttpResponseFeature>(new HttpResponseFeature());
            contextFeatures.Set <IHttpResponseBodyFeature>(responseFeature);

            contextFeatures.Set <IHttpRequestLifetimeFeature>(new HttpRequestLifetimeFeature());

            var     context = this.httpContextFactory.Create(contextFeatures);
            JObject response;

            try
            {
                await this.next.Invoke(context).ConfigureAwait(false);

                if (responseMemoryStream.Length == 0)
                {
                    throw new Exception("Method not found");
                }

                responseMemoryStream.Position = 0;
                using (var streamReader = new StreamReader(responseMemoryStream))
                    using (var textReader = new JsonTextReader(streamReader))
                    {
                        // Ensure floats are parsed as decimals and not as doubles.
                        textReader.FloatParseHandling = FloatParseHandling.Decimal;
                        response = await JObject.LoadAsync(textReader);
                    }
            }
            catch (Exception ex)
            {
                await this.HandleRpcInvokeExceptionAsync(context, ex);

                context.Response.Body.Position = 0;
                using (var streamReader = new StreamReader(context.Response.Body, Encoding.Default, true, 1024, true))
                    using (var textReader = new JsonTextReader(streamReader))
                    {
                        // Ensure floats are parsed as decimals and not as doubles.
                        textReader.FloatParseHandling = FloatParseHandling.Decimal;

                        string val = streamReader.ReadToEnd();
                        context.Response.Body.Position = 0;
                        response = await JObject.LoadAsync(textReader);
                    }
            }

            if (requestObj.ContainsKey("id"))
            {
                response["id"] = requestObj["id"];
            }
            else
            {
                response.Remove("id");
            }

            return(response);
        }
Ejemplo n.º 9
0
        public async Task InvokeAsync(HttpContext context, IWebHostEnvironment webHostEnvironment)
        {
            var cancellationToken = context.RequestAborted;
            var requestEncoding   = _options.RequestEncoding ?? Encoding.UTF8;
            var excludeUrls       = _options.ExcludeUrls;
            var modifyResponse    = excludeUrls == null || !excludeUrls.Any(bl => context.Request.Path.Value != null &&
                                                                            context.Request.Path.Value.ToLowerInvariant().Contains(bl));

            if (!modifyResponse)
            {
                await _next(context);

                return;
            }

            var responseBodyPooledStream = new DisposablePooledStream(_pooledStreamManager, nameof(I18NMiddleware));

            context.Response.RegisterForDisposeAsync(responseBodyPooledStream);

            var httpResponseBodyFeature = context.Features.Get <IHttpResponseBodyFeature>();
            var httpResponseFeature     = context.Features.Get <IHttpResponseFeature>();

            var streamResponseBodyFeature = new StreamResponseBodyFeature(responseBodyPooledStream);

            context.Features.Set <IHttpResponseBodyFeature>(streamResponseBodyFeature);

            await _next(context).ConfigureAwait(false);

            // Force dynamic content type in order reset Content-Length header.
            httpResponseFeature.Headers.ContentLength = null;

            var httpResponseBodyStream = (Stream)responseBodyPooledStream;

            httpResponseBodyStream.Seek(0, SeekOrigin.Begin);

            var contentType       = GetRequestContentType(context);
            var validContentTypes = _options.ValidContentTypes;
            var replaceNuggets    = validContentTypes != null && validContentTypes.Contains(contentType);

            if (replaceNuggets)
            {
                var requestCultureInfo = GetRequestCultureInfo(context);
                var cultureDictionary  = _localizationManager.GetDictionary(requestCultureInfo, !_options.CacheEnabled);

                _logger?.LogDebug(
                    $"Request path: {context.Request.Path}. Culture name: {cultureDictionary.CultureName}. Translations: {cultureDictionary.Translations.Count}.");

                var responseBody = await ReadResponseBodyAsStringAsync(httpResponseBodyStream, requestEncoding);

                string responseBodyTranslated;
                if (webHostEnvironment.IsDevelopment())
                {
                    var sw = new Stopwatch();
                    sw.Restart();
                    responseBodyTranslated = _nuggetReplacer.Replace(cultureDictionary, responseBody);
                    sw.Stop();

                    _logger?.LogDebug($"Replaced body in {sw.ElapsedMilliseconds} ms.");
                    const string i18NMiddlewareName = "X-" + nameof(I18NMiddleware) + "-Ms";
                    httpResponseFeature.Headers[i18NMiddlewareName] = sw.ElapsedMilliseconds.ToString();
                }
                else
                {
                    responseBodyTranslated = _nuggetReplacer.Replace(cultureDictionary, responseBody);
                }

                var stringContent = new StringContent(responseBodyTranslated, requestEncoding, contentType);
#if NET50
                await stringContent.CopyToAsync(httpResponseBodyFeature.Stream, cancellationToke);
#else
                await stringContent.CopyToAsync(httpResponseBodyFeature.Stream);
#endif

                return;
            }

            await httpResponseBodyStream.CopyToAsync(httpResponseBodyFeature.Stream, cancellationToken).ConfigureAwait(false);
        }