/// <summary>
        /// Instantiates a new <see cref="WebHookSingleEventMapperConstraint"/> instance with the given
        /// <paramref name="loggerFactory"/> and <paramref name="eventMetadata"/>.
        /// </summary>
        /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
        /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/>.</param>
        public WebHookSingleEventMapperConstraint(ILoggerFactory loggerFactory, IWebHookEventMetadata eventMetadata)
            : base(loggerFactory)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            if (eventMetadata == null)
            {
                throw new ArgumentNullException(nameof(eventMetadata));
            }

            _eventMetadata = eventMetadata;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Instantiates a new <see cref="WebHookEventNameMapperConstraint"/> instance to verify the given
        /// <paramref name="eventMetadata"/>.
        /// </summary>
        /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
        /// <param name="eventMetadata">The receiver's <see cref="IWebHookEventMetadata"/>.</param>
        public WebHookEventNameMapperConstraint(
            ILoggerFactory loggerFactory,
            IWebHookEventMetadata eventMetadata)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }
            if (eventMetadata == null)
            {
                throw new ArgumentNullException(nameof(eventMetadata));
            }

            _eventMetadata = eventMetadata;
            _logger        = loggerFactory.CreateLogger <WebHookEventNameMapperConstraint>();
        }
    /// <summary>
    /// Ensure given <paramref name="eventMetadata"/> is not <see langword="null"/>. An
    /// <see cref="IWebHookEventMetadata"/> service is mandatory for receivers with an attribute that implements
    /// <see cref="IWebHookEventSelectorMetadata"/>.
    /// </summary>
    /// <param name="eventMetadata">
    /// The <paramref name="receiverName"/> receiver's <see cref="IWebHookEventMetadata"/>, if any.
    /// </param>
    /// <param name="receiverName">The name of an available <see cref="IWebHookReceiver"/>.</param>
    protected void EnsureValidEventMetadata(IWebHookEventMetadata eventMetadata, string receiverName)
    {
        if (receiverName == null)
        {
            // Unusual case likely involves a GeneralWebHookAttribute subclass that implements
            // IWebHookEventSelectorMetadata. Assume developer adds runtime checks for IWebHookEventMetadata.
            return;
        }

        if (eventMetadata == null)
        {
            // IWebHookEventMetadata is mandatory when performing action selection using event names.
            var message = string.Format(
                CultureInfo.CurrentCulture,
                Resources.PropertyProvider_MissingMetadataServices,
                receiverName,
                typeof(IWebHookEventSelectorMetadata),
                typeof(IWebHookEventMetadata));
            throw new InvalidOperationException(message);
        }
    }
        /// <summary>
        /// Gets an indication whether the expected event names are available in the request. Maps the event names into
        /// route values.
        /// </summary>
        /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/> for this receiver.</param>
        /// <param name="routeContext">The <see cref="RouteContext"/> for this constraint and request.</param>
        /// <returns>
        /// <see langword="true"/> if event names are available in the request; <see langword="false"/> otherwise.
        /// </returns>
        protected virtual bool Accept(IWebHookEventMetadata eventMetadata, RouteContext routeContext)
        {
            if (eventMetadata == null)
            {
                throw new ArgumentNullException(nameof(eventMetadata));
            }

            if (routeContext == null)
            {
                throw new ArgumentNullException(nameof(routeContext));
            }

            var request   = routeContext.HttpContext.Request;
            var routeData = routeContext.RouteData;

            if (eventMetadata.HeaderName != null)
            {
                var headers = request.Headers;

                var events = headers.GetCommaSeparatedValues(eventMetadata.HeaderName);
                if (events.Length > 0)
                {
                    routeData.SetWebHookEventNames(events);
                    return(true);
                }
            }

            if (eventMetadata.QueryParameterName != null)
            {
                var query = request.Query;
                if (query.TryGetValue(eventMetadata.QueryParameterName, out var events) &&
                    events.Count > 0)
                {
                    routeData.SetWebHookEventNames(events);
                    return(true);
                }
            }

            if (eventMetadata.ConstantValue != null)
            {
                routeData.Values[WebHookConstants.EventKeyName] = eventMetadata.ConstantValue;
                return(true);
            }

            routeData.TryGetWebHookReceiverName(out var receiverName);
            if (eventMetadata.QueryParameterName == null)
            {
                _logger.LogError(
                    500,
                    "A '{ReceiverName}' WebHook request must contain a '{HeaderName}' HTTP header " +
                    "indicating the type of event.",
                    receiverName,
                    eventMetadata.HeaderName);
            }
            else if (eventMetadata.HeaderName == null)
            {
                _logger.LogError(
                    501,
                    "A '{ReceiverName}' WebHook request must contain a '{QueryParameterKey}' query " +
                    "parameter indicating the type of event.",
                    receiverName,
                    eventMetadata.QueryParameterName);
            }
            else
            {
                _logger.LogError(
                    502,
                    "A '{ReceiverName}' WebHook request must contain a '{HeaderName}' HTTP header or a " +
                    "'{QueryParameterKey}' query parameter indicating the type of event.",
                    receiverName,
                    eventMetadata.HeaderName,
                    eventMetadata.QueryParameterName);
            }

            return(false);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Gets an indication whether the expected event names are available in the request. Maps the event names into
        /// route values.
        /// </summary>
        /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/> for this receiver.</param>
        /// <param name="routeContext">The <see cref="RouteContext"/> for this constraint and request.</param>
        /// <returns>
        /// <see langword="true"/> if event names are available in the request; <see langword="false"/> otherwise.
        /// </returns>
        protected virtual bool Accept(IWebHookEventMetadata eventMetadata, RouteContext routeContext)
        {
            if (eventMetadata == null)
            {
                throw new ArgumentNullException(nameof(eventMetadata));
            }

            if (routeContext == null)
            {
                throw new ArgumentNullException(nameof(routeContext));
            }

            var request   = routeContext.HttpContext.Request;
            var routeData = routeContext.RouteData;

            if (eventMetadata.HeaderName != null)
            {
                var headers = request.Headers;

                // ??? Is GetCommaSeparatedValues() overkill?
                var events = headers.GetCommaSeparatedValues(eventMetadata.HeaderName);
                if (events.Length == 0)
                {
                    if (eventMetadata.ConstantValue == null && eventMetadata.QueryParameterName != null)
                    {
                        // An error because we have no fallback.
                        routeData.TryGetWebHookReceiverName(out var receiverName);
                        _logger.LogError(
                            500,
                            "A {ReceiverName} WebHook request must contain a '{HeaderName}' HTTP header indicating " +
                            "the type of event.",
                            receiverName,
                            eventMetadata.HeaderName);
                    }
                }
                else
                {
                    routeData.SetWebHookEventNames(events);
                    return(true);
                }
            }

            if (eventMetadata.QueryParameterName != null)
            {
                var query = request.Query;
                if (!query.TryGetValue(eventMetadata.QueryParameterName, out var events) ||
                    events.Count == 0)
                {
                    if (eventMetadata.ConstantValue == null)
                    {
                        // An error because we have no fallback.
                        routeData.TryGetWebHookReceiverName(out var receiverName);
                        _logger.LogError(
                            501,
                            "A {ReceiverName} WebHook request must contain a '{QueryParameterKey}' query parameter " +
                            "indicating the type of event.",
                            receiverName,
                            eventMetadata.QueryParameterName);
                    }
                }
                else
                {
                    routeData.SetWebHookEventNames(events);
                    return(true);
                }
            }

            if (eventMetadata.ConstantValue != null)
            {
                routeData.Values[WebHookConstants.EventKeyName] = eventMetadata.ConstantValue;
                return(true);
            }

            return(false);
        }
 public TestMetadataProvider(IWebHookEventMetadata eventMetadata)
 {
     _eventMetadata = eventMetadata;
 }