public static async Task ParseFiles(Stream data, string contentType, Action <string, Stream> fileProcessor) { var streamCotent = new StreamContent(data); streamCotent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); if (streamCotent.IsMimeMultipartContent()) { var provider = await streamCotent.ReadAsMultipartAsync(); foreach (var httpContent in provider.Contents) { var filename = httpContent.Headers.ContentDisposition.FileName; using (var fileContents = await httpContent.ReadAsStreamAsync()) { if (string.IsNullOrWhiteSpace(filename)) { fileProcessor(httpContent.Headers.ContentDisposition.Name.Trim('\"'), fileContents); continue; } fileProcessor(filename.Trim('\"'), fileContents); } } } else { var formdata = await streamCotent.ReadAsFormDataAsync(); var str = await streamCotent.ReadAsStringAsync(); var stream = await streamCotent.ReadAsStreamAsync(); } }
public override async Task Invoke(IOwinContext context) { var httpContent = new StreamContent(context.Request.Body); foreach (var kvp in context.Request.Headers) { httpContent.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value); } if (!httpContent.IsMimeMultipartContent("form-data")) { await context.Response.Error(415, new ErrorModel( "Unsupported Media Type", "You must upload nupkgs with multipart/form-data." )).ConfigureAwait(false); return; } var provider = await httpContent .ReadAsMultipartAsync(new MultipartFormDataStreamProvider(Path.GetTempPath())) .ConfigureAwait(false); var formData = provider.FormData; var hash = formData["hash"]; var method = formData["method"]; if (method == null) { await context.Response.Error(400, new ErrorModel( "Bad Request", "\"method\" parameter is required." )).ConfigureAwait(false); return; } var file = provider.FileData .FirstOrDefault(f => f.Headers.ContentDisposition.Name.Trim('"') == "file"); if (file != null && new FileInfo(file.LocalFileName).Length > 0) { hash = await NuGetUtility.ExtractUploadedFile(file).ConfigureAwait(false); } else if (string.IsNullOrEmpty(hash)) { await context.Response.Error(400, new ErrorModel( "Bad Request", "\"file\" parameter is required." )).ConfigureAwait(false); return; } var baseUriEnv = Environment.GetEnvironmentVariable("NUGETCALC_BASEURI"); var baseUri = baseUriEnv != null ? new Uri(new Uri(baseUriEnv), context.Request.Path.Value) : context.Request.Uri; var redirectUri = new UriBuilder(new Uri(baseUri, method)); redirectUri.Query = string.Join("&", Enumerable.Range(0, formData.Count) .Select(i => Tuple.Create(formData.GetKey(i), formData.Get(i))) .Where(t => t.Item1 != "method" && t.Item1 != "hash" && !string.IsNullOrEmpty(t.Item2)) .Concat(new[] { Tuple.Create("hash", hash) }) .Select(t => string.Concat(Uri.EscapeDataString(t.Item1), "=", Uri.EscapeDataString(t.Item2))) ); context.Response.StatusCode = 303; context.Response.Headers.Set("Location", redirectUri.ToString()); }