Skip to content

Commit 8c1f17e

Browse files
committed
Uploading large packages result in OutOfMemoryException
NuGet/NuGetGallery#3042
1 parent 4bd62ea commit 8c1f17e

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

src/NuGet.Server/Infrastructure/ServerPackageRepository.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ private void AddPackagesFromDropFolder()
186186
try
187187
{
188188
// Create package
189-
var package = new ZipPackage(_fileSystem.OpenFile(packageFile));
189+
var package = new OptimizedZipPackage(_fileSystem, packageFile);
190190

191191
// Is it a symbols package?
192192
if (IgnoreSymbolsPackages && package.IsSymbolsPackage())
@@ -235,6 +235,8 @@ private void AddPackagesFromDropFolder()
235235
}
236236
finally
237237
{
238+
OptimizedZipPackage.PurgeCache();
239+
238240
MonitorFileSystem(true);
239241
}
240242
}
@@ -552,6 +554,8 @@ public void ClearCache()
552554
{
553555
lock (_syncLock)
554556
{
557+
OptimizedZipPackage.PurgeCache();
558+
555559
_serverPackageStore.Clear();
556560
_serverPackageStore.Persist();
557561
_logger.Log(LogLevel.Info, "Cleared package cache.");

src/NuGet.Server/Publishing/PackageService.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,43 @@ public void CreatePackage(HttpContextBase context)
3232

3333
// Get the package from the request body
3434
// ReSharper disable once PossibleNullReferenceException
35-
var stream = request.Files.Count > 0 ? request.Files[0].InputStream : request.InputStream;
35+
var stream = request.Files.Count > 0
36+
? request.Files[0].InputStream
37+
: request.InputStream;
3638

37-
var package = new ZipPackage(stream);
39+
// Copy the package to a temporary file
40+
var temporaryFile = Path.GetTempFileName();
41+
using (var temporaryFileStream = File.Open(temporaryFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
42+
{
43+
stream.CopyTo(temporaryFileStream);
44+
}
45+
46+
var package = new OptimizedZipPackage(temporaryFile);
3847

39-
// Make sure they can access this package
48+
// Make sure the user can access this package
4049
if (Authenticate(context, apiKey, package.Id))
4150
{
4251
try
4352
{
4453
_serverRepository.AddPackage(package);
54+
4555
WriteStatus(context, HttpStatusCode.Created, "");
4656
}
4757
catch (InvalidOperationException ex)
4858
{
4959
WriteStatus(context, HttpStatusCode.InternalServerError, ex.Message);
5060
}
5161
}
62+
63+
package = null;
64+
try
65+
{
66+
File.Delete(temporaryFile);
67+
}
68+
catch (Exception)
69+
{
70+
WriteStatus(context, HttpStatusCode.InternalServerError, "Could not remove temporary upload file.");
71+
}
5272
}
5373

5474
public void PublishPackage(HttpContextBase context)

0 commit comments

Comments
 (0)