// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpRequest : HttpRequest, IFeatureCache { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpRequestFeature _request; private IQueryFeature _query; private IFormFeature _form; private IRequestCookiesFeature _cookies; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { _context = context; _features = features; } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { _request = null; _query = null; _form = null; _cookies = null; _cachedFeaturesRevision = _features.Revision; } } private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } private IQueryFeature QueryFeature { get { return FeatureHelpers.GetOrCreateAndCache( this, _features, (f) => new QueryFeature(f), ref _query); } } private IFormFeature FormFeature { get { return FeatureHelpers.GetOrCreateAndCache( this, _features, this, (r) => new FormFeature(r), ref _form); } } private IRequestCookiesFeature RequestCookiesFeature { get { return FeatureHelpers.GetOrCreateAndCache( this, _features, (f) => new RequestCookiesFeature(f), ref _cookies); } } public override HttpContext HttpContext { get { return _context; } } public override PathString PathBase { get { return new PathString(HttpRequestFeature.PathBase); } set { HttpRequestFeature.PathBase = value.Value; } } public override PathString Path { get { return new PathString(HttpRequestFeature.Path); } set { HttpRequestFeature.Path = value.Value; } } public override QueryString QueryString { get { return new QueryString(HttpRequestFeature.QueryString); } set { HttpRequestFeature.QueryString = value.Value; } } public override long? ContentLength { get { return ParsingHelpers.GetContentLength(Headers); } set { ParsingHelpers.SetContentLength(Headers, value); } } public override Stream Body { get { return HttpRequestFeature.Body; } set { HttpRequestFeature.Body = value; } } public override string Method { get { return HttpRequestFeature.Method; } set { HttpRequestFeature.Method = value; } } public override string Scheme { get { return HttpRequestFeature.Scheme; } set { HttpRequestFeature.Scheme = value; } } public override bool IsHttps { get { return string.Equals(Constants.Https, Scheme, StringComparison.OrdinalIgnoreCase); } set { Scheme = value ? Constants.Https : Constants.Http; } } public override HostString Host { get { return HostString.FromUriComponent(Headers["Host"].ToString()); } set { Headers["Host"] = value.ToUriComponent(); } } public override IQueryCollection Query { get { return QueryFeature.Query; } set { QueryFeature.Query = value; } } public override string Protocol { get { return HttpRequestFeature.Protocol; } set { HttpRequestFeature.Protocol = value; } } public override IHeaderDictionary Headers { get { return HttpRequestFeature.Headers; } } public override IRequestCookieCollection Cookies { get { return RequestCookiesFeature.Cookies; } set { RequestCookiesFeature.Cookies = value; } } public override string ContentType { get { return Headers[HeaderNames.ContentType]; } set { Headers[HeaderNames.ContentType] = value; } } public override bool HasFormContentType { get { return FormFeature.HasFormContentType; } } public override IFormCollection Form { get { return FormFeature.ReadForm(); } set { FormFeature.Form = value; } } public override Task ReadFormAsync(CancellationToken cancellationToken) { return FormFeature.ReadFormAsync(cancellationToken); } } }