private Response HandleApiRequest(ApiRequest apiRequest, string requestData) { var parameters = apiRequest.Parameters; // If this was a POST request, the request data itself contains parameters. if (!string.IsNullOrWhiteSpace(requestData)) { var paramStrings = requestData.Split('&'); foreach (var parts in paramStrings.Select(p => p.Split('='))) { parameters[parts[0]] = Uri.UnescapeDataString(parts[1].Replace('+', ' ')); } } var rawResult = _operationRegistry.InvokeCommand(apiRequest.CommandName, parameters); if (rawResult == null) { return new Response(new JsonString("")); } else { if (rawResult is Image) // Image generates a png { var memoryStream = new MemoryStream(); ((Image)rawResult).SaveBmp(memoryStream); memoryStream.Position = 0; return new Response(new TypedStream(memoryStream, "image/png")); } else if (rawResult is ITypedStream) { return new Response((ITypedStream)rawResult); } else // Otherwise, return a json-serialized version { string result = JsonSerializer.Serialize(rawResult); return new Response(new JsonString(result)); } } }
private ApiRequest ParseApiUrl(Uri url) { var result = new ApiRequest { Parameters = new Dictionary<string, string>(), CommandName = url.AbsolutePath.Substring("/api/".Length) }; if (!string.IsNullOrEmpty(url.Query)) { var paramStrings = url.Query.Substring(1).Split('&'); foreach (var parts in paramStrings.Select(p => p.Split('='))) { result.Parameters[parts[0]] = Uri.UnescapeDataString(parts[1].Replace('+', ' ')); } } return result; }