public Yield PostImport(DreamContext context, DreamMessage request, Result<DreamMessage> response) { string uri = context.GetParam("uri", null); string reltopath = context.GetParam("reltopatch", "/"); DreamMessage packageMessage = request; if(!string.IsNullOrEmpty(uri)) { Result<DreamMessage> packageResult; yield return packageResult = Plug.New(uri).InvokeEx("GET", DreamMessage.Ok(), new Result<DreamMessage>()); packageMessage = packageResult.Value; if(!packageMessage.IsSuccessful) { throw new DreamAbortException(DreamMessage.BadRequest(string.Format("Unable to retrieve package from Uri '{0}': {1}", uri, packageMessage.Status))); } } string tempFile = Path.GetTempFileName(); Stream tempStream = File.Create(tempFile); Result<long> copyResult; // TODO (steveb): use WithCleanup() to dispose of resources in case of failure yield return copyResult = packageMessage.ToStream().CopyTo(tempStream, packageMessage.ContentLength, new Result<long>()).Catch(); tempStream.Dispose(); if(copyResult.HasException) { response.Throw(copyResult.Exception); yield break; } ArchivePackageReader archivePackageReader = new ArchivePackageReader(File.OpenRead(tempFile)); Result<ImportManager> importerResult; Plug authorizedDekiApi = _dekiApi.WithHeaders(request.Headers); // TODO (steveb): use WithCleanup() to dispose of resources in case of failure yield return importerResult = ImportManager.CreateAsync(authorizedDekiApi, reltopath, archivePackageReader, new Result<ImportManager>()).Catch(); if(importerResult.HasException) { archivePackageReader.Dispose(); File.Delete(tempFile); response.Throw(importerResult.Exception); yield break; } ImportManager importManager = importerResult.Value; Result importResult; yield return importResult = importManager.ImportAsync(new Result()).Catch(); archivePackageReader.Dispose(); File.Delete(tempFile); if(importResult.HasException) { response.Throw(importResult.Exception); yield break; } response.Return(DreamMessage.Ok()); yield break; }