예제 #1
0
        // TODO: CloudEvent.ToHttpRequestMessage?

        // TODO: What does this (web hook validation) have to do with CloudEvents?
        // Well, it's specced in the same repo: https://github.com/cloudevents/spec/blob/v1.0.1/http-webhook.md

        /// <summary>
        /// Handle the request as WebHook validation request
        /// </summary>
        /// <param name="httpRequestMessage">Request</param>
        /// <param name="validateOrigin">Callback that returns whether the given origin may push events. If 'null', all origins are acceptable.</param>
        /// <param name="validateRate">Callback that returns the acceptable request rate. If 'null', the rate is not limited.</param>
        /// <returns>Response</returns>
        public static async Task <HttpResponseMessage> HandleAsWebHookValidationRequest(
            this HttpRequestMessage httpRequestMessage, Func <string, bool> validateOrigin,
            Func <string, string> validateRate)
        {
            if (!IsWebHookValidationRequest(httpRequestMessage))
            {
                return(new HttpResponseMessage(HttpStatusCode.MethodNotAllowed));
            }
            var(statusCode, allowedOrigin, allowedRate) = await HttpUtilities.HandleWebHookValidationAsync(httpRequestMessage,
                                                                                                           (request, headerName) => request.Headers.TryGetValues(headerName, out var values)?values.FirstOrDefault() : null,
                                                                                                               validateOrigin, validateRate);

            var message = new HttpResponseMessage(statusCode);

            if (allowedOrigin is object)
            {
                message.Headers.Add("Allow", "POST");
                message.Headers.Add("WebHook-Allowed-Origin", allowedOrigin);
                if (allowedRate is object)
                {
                    message.Headers.Add("WebHook-Allowed-Rate", allowedRate);
                }
            }
            return(message);
        }
예제 #2
0
        // TODO: Do we want this? It's not about CloudEvents...

        /// <summary>
        /// Handle the request as WebHook validation request
        /// </summary>
        /// <param name="context">Request context</param>
        /// <param name="validateOrigin">Callback that returns whether the given origin may push events. If 'null', all origins are acceptable.</param>
        /// <param name="validateRate">Callback that returns the acceptable request rate. If 'null', the rate is not limited.</param>
        /// <returns>Task</returns>
        public static async Task HandleAsWebHookValidationRequest(this HttpListenerContext context,
                                                                  Func <string, bool> validateOrigin, Func <string, string> validateRate)
        {
            if (!IsWebHookValidationRequest(context.Request))
            {
                context.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed;
                context.Response.Close();
            }

            var(statusCode, allowedOrigin, allowedRate) = await HttpUtilities.HandleWebHookValidationAsync(context.Request,
                                                                                                           (request, headerName) => request.Headers.Get(headerName), validateOrigin, validateRate);

            context.Response.StatusCode = (int)statusCode;
            if (allowedOrigin is object)
            {
                context.Response.Headers.Add("Allow", "POST");
                context.Response.Headers.Add("WebHook-Allowed-Origin", allowedOrigin);
                if (allowedRate is object)
                {
                    context.Response.Headers.Add("WebHook-Allowed-Rate", allowedRate);
                }
            }
            context.Response.Close();
        }