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)); } }
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)); } }