Beispiel #1
0
        public async Task <Stream> Post(string operation, Stream contents)
        {
            // Get the process that is registered to this endpoint and execute it.
            var endpointSetting = _registeredEndpoints.FirstOrDefault(x =>
                                                                      (x.Value.Method == HttpMethod.Post) &&
                                                                      string.Equals(x.Value.Path, operation, StringComparison.InvariantCultureIgnoreCase));

            if (endpointSetting.Equals(default(KeyValuePair <Guid, HttpEndpoinConfiguration>)))
            {
                throw new Exception($"POST requests to operation '{operation}' are not allowed.");
            }

            var endpoint = endpointSetting.Value;

            var context = WebOperationContext.Current;

            if (context == null)
            {
                throw new Exception("Could not read HTTP context");
            }

            var headers        = context.IncomingRequest.Headers;
            var acceptHeader   = ParseAcceptHeader(headers);
            var acceptEncoding = ParseAcceptEncodingHeader(headers);
            var encoding       = ParseEncodingHeader(headers);

            // Authorize request if configured
            if ((endpoint.Authentication != null) && (endpoint.Authentication.Type != AuthenticationType.None))
            {
                var authorizationValue = headers.Get("Authorization");
                try
                {
                    AuthenticateRequest(authorizationValue, endpoint);
                }
                catch (AuthenticationException ex)
                {
                    context.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
                    return(BuildFailureResponse(ex.Message, acceptHeader, acceptEncoding));
                }
            }

            try
            {
                var request = new Request
                {
                    Method = "POST",
                    Url    = new Url
                    {
                        BaseUrl = context.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri,
                        Path    = context.IncomingRequest.UriTemplateMatch.RequestUri.AbsolutePath
                    }
                };

                // Parse the query parameters if they exist:
                if ((context.IncomingRequest.UriTemplateMatch.QueryParameters != null) &&
                    (context.IncomingRequest.UriTemplateMatch.QueryParameters.Count > 0))
                {
                    request.Url.Query = new List <Parameter>();
                    foreach (string key in context.IncomingRequest.UriTemplateMatch.QueryParameters)
                    {
                        request.Url.Query.Add(new Parameter
                        {
                            Name  = key,
                            Value = context.IncomingRequest.UriTemplateMatch.QueryParameters[key]
                        });
                    }
                }

                if (contents != null)
                {
                    request.Body = new Body
                    {
                        ContentType = headers.Get("Content-Type"),
                        Payload     = new Payload()
                    };

                    // Read the raw contents:
                    using (contents)
                        using (var memStream = new MemoryStream())
                        {
                            await contents.CopyToAsync(memStream);

                            request.Body.Payload.Data = encoding.GetString(memStream.ToArray());
                        }

                    // Try to serialize the request data:
                    try
                    {
                        switch (DetermineContentType(request.Body.ContentType))
                        {
                        case RequestContentType.Json:
                            request.Body.Payload.XmlData = Json.JsonConverter.ConvertToXml(request.Body.Payload.Data).DocumentElement;
                            break;

                        case RequestContentType.Xml:
                            var xmlDoc = new XmlDocument();
                            xmlDoc.LoadXml(request.Body.Payload.Data);
                            request.Body.Payload.XmlData = xmlDoc.DocumentElement;
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        // TODO: Log warning?
                        //status = InstanceStatus.Warning;
                        //stepInfo.AddWarningMessage(String.Format("Request serialization was unsuccessful: {0}", ExceptionHelper.GetMessage(ex)));
                    }
                }

                // Execute the process:
                var requestMessage  = Message.CreateFromObject(request);
                var responseMessage = await endpoint.Process.CallAsync(requestMessage);

                var response = responseMessage?.ContentStream != null
                    ? Message.ExtractObject <Response>(responseMessage)
                    : null;

                return(BuildSuccessResponse(response, acceptHeader, acceptEncoding));
            }
            catch (Exception ex)
            {
                context.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
                return(BuildFailureResponse(
                           string.Concat("An error occurred while executing the process.\n", ex.Message),
                           acceptHeader,
                           acceptEncoding));
            }
        }
Beispiel #2
0
        public async Task <Stream> Get(string operation)
        {
            // Get the process that is registered to this endpoint and execute it.
            var endpointSetting = _registeredEndpoints.FirstOrDefault(x =>
                                                                      (x.Value.Method == HttpMethod.Get) &&
                                                                      string.Equals(x.Value.Path, operation, StringComparison.InvariantCultureIgnoreCase));

            if (endpointSetting.Equals(default(KeyValuePair <Guid, HttpEndpoinConfiguration>)))
            {
                throw new Exception($"GET requests to operation '{operation}' are not allowed.");
            }

            var endpoint = endpointSetting.Value;

            var context = WebOperationContext.Current;

            if (context == null)
            {
                throw new Exception("Could not read HTTP context");
            }

            var headers        = context.IncomingRequest.Headers;
            var acceptHeader   = ParseAcceptHeader(headers);
            var acceptEncoding = ParseAcceptEncodingHeader(headers);

            // Authorize request if configured
            if ((endpoint.Authentication != null) && (endpoint.Authentication.Type != AuthenticationType.None))
            {
                var authorizationValue = headers.Get("Authorization");
                try
                {
                    AuthenticateRequest(authorizationValue, endpoint);
                }
                catch (AuthenticationException ex)
                {
                    context.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
                    return(BuildFailureResponse(ex.Message, acceptHeader, acceptEncoding));
                }
            }

            try
            {
                var request = new Request
                {
                    Method = "GET",
                    Url    = new Url
                    {
                        BaseUrl = context.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri,
                        Path    = context.IncomingRequest.UriTemplateMatch.RequestUri.AbsolutePath
                    }
                };

                // Parse the query parameters if they exist:
                if ((context.IncomingRequest.UriTemplateMatch.QueryParameters != null) &&
                    (context.IncomingRequest.UriTemplateMatch.QueryParameters.Count > 0))
                {
                    request.Url.Query = new List <Parameter>();
                    foreach (string key in context.IncomingRequest.UriTemplateMatch.QueryParameters)
                    {
                        request.Url.Query.Add(new Parameter
                        {
                            Name  = key,
                            Value = context.IncomingRequest.UriTemplateMatch.QueryParameters[key]
                        });
                    }
                }

                // Execute the process:
                var requestMessage  = Message.CreateFromObject(request);
                var responseMessage = await endpoint.Process.CallAsync(requestMessage);

                var response = Message.ExtractObject <Response>(responseMessage);

                return(BuildSuccessResponse(response, acceptHeader, acceptEncoding));
            }
            catch (Exception ex)
            {
                context.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
                return(BuildFailureResponse(
                           string.Concat("An error occurred while executing the process.\n", ex.Message),
                           acceptHeader,
                           acceptEncoding));
            }
        }