1717using System . Web ;
1818using System . Web . Caching ;
1919using System . Web . Mvc ;
20+ using System . Windows . Forms ;
2021using NuGet . Packaging ;
2122using NuGet . Services . Entities ;
2223using NuGet . Services . Licenses ;
@@ -343,6 +344,8 @@ private async Task<ActionResult> UploadPackageInternal(SubmitPackageRequest mode
343344 verifyRequest . IsSymbolsPackage = false ;
344345 verifyRequest . LicenseFileContents = await GetLicenseFileContentsOrNullAsync ( packageMetadata , packageArchiveReader ) ;
345346 verifyRequest . LicenseExpressionSegments = GetLicenseExpressionSegmentsOrNull ( packageMetadata . LicenseMetadata ) ;
347+ verifyRequest . ReadmeFileContents = await GetReadmeFileContentsOrNullAsync ( packageMetadata , packageArchiveReader ) ;
348+
346349 model . InProgressUpload = verifyRequest ;
347350 return View ( model ) ;
348351 }
@@ -613,6 +616,7 @@ private async Task<JsonResult> GetVerifyPackageView(User currentUser,
613616 model . Warnings . AddRange ( packageContentData . Warnings . Select ( w => new JsonValidationMessage ( w ) ) ) ;
614617 model . LicenseFileContents = packageContentData . LicenseFileContents ;
615618 model . LicenseExpressionSegments = packageContentData . LicenseExpressionSegments ;
619+ model . ReadmeFileContents = packageContentData . ReadmeFileContents ;
616620
617621 if ( packageContentData . EmbeddedIconInformation != null )
618622 {
@@ -635,13 +639,15 @@ public PackageContentData(
635639 IReadOnlyList < IValidationMessage > warnings ,
636640 string licenseFileContents ,
637641 IReadOnlyCollection < CompositeLicenseExpressionSegmentViewModel > licenseExpressionSegments ,
638- EmbeddedIconInformation embeddedIconInformation )
642+ EmbeddedIconInformation embeddedIconInformation ,
643+ string readmeFileContents )
639644 {
640645 PackageMetadata = packageMetadata ;
641646 Warnings = warnings ;
642647 LicenseFileContents = licenseFileContents ;
643648 LicenseExpressionSegments = licenseExpressionSegments ;
644649 EmbeddedIconInformation = embeddedIconInformation ;
650+ ReadmeFileContents = readmeFileContents ;
645651 }
646652
647653 public JsonResult ErrorResult { get ; }
@@ -650,6 +656,7 @@ public PackageContentData(
650656 public string LicenseFileContents { get ; }
651657 public IReadOnlyCollection < CompositeLicenseExpressionSegmentViewModel > LicenseExpressionSegments { get ; }
652658 public EmbeddedIconInformation EmbeddedIconInformation { get ; }
659+ public string ReadmeFileContents { get ; }
653660 }
654661
655662 private class EmbeddedIconInformation
@@ -673,6 +680,7 @@ private async Task<PackageContentData> ValidateAndProcessPackageContents(User cu
673680 IReadOnlyCollection < CompositeLicenseExpressionSegmentViewModel > licenseExpressionSegments = null ;
674681 PackageMetadata packageMetadata = null ;
675682 EmbeddedIconInformation embeddedIconInformation = null ;
683+ string readmeFileContents = null ;
676684
677685 using ( Stream uploadedFile = await _uploadFileService . GetUploadFileAsync ( currentUser . Key ) )
678686 {
@@ -720,6 +728,7 @@ private async Task<PackageContentData> ValidateAndProcessPackageContents(User cu
720728 licenseFileContents = await GetLicenseFileContentsOrNullAsync ( packageMetadata , packageArchiveReader ) ;
721729 licenseExpressionSegments = GetLicenseExpressionSegmentsOrNull ( packageMetadata . LicenseMetadata ) ;
722730 embeddedIconInformation = await GetEmbeddedIconOrNullAsync ( packageMetadata , packageArchiveReader ) ;
731+ readmeFileContents = await GetReadmeFileContentsOrNullAsync ( packageMetadata , packageArchiveReader ) ;
723732 }
724733 catch ( Exception ex )
725734 {
@@ -730,7 +739,7 @@ private async Task<PackageContentData> ValidateAndProcessPackageContents(User cu
730739 }
731740 }
732741
733- return new PackageContentData ( packageMetadata , warnings , licenseFileContents , licenseExpressionSegments , embeddedIconInformation ) ;
742+ return new PackageContentData ( packageMetadata , warnings , licenseFileContents , licenseExpressionSegments , embeddedIconInformation , readmeFileContents ) ;
734743 }
735744
736745 private IReadOnlyCollection < CompositeLicenseExpressionSegmentViewModel > GetLicenseExpressionSegmentsOrNull ( LicenseMetadata licenseMetadata )
@@ -788,6 +797,18 @@ private static async Task<EmbeddedIconInformation> GetEmbeddedIconOrNullAsync(Pa
788797 return new EmbeddedIconInformation ( imageContentType , imageData ) ;
789798 }
790799
800+ private async Task < string > GetReadmeFileContentsOrNullAsync ( PackageMetadata packageMetadata , PackageArchiveReader packageArchiveReader )
801+ {
802+ if ( string . IsNullOrWhiteSpace ( packageMetadata . ReadmeFile ) )
803+ {
804+ return null ;
805+ }
806+
807+ var readmeFilename = FileNameHelper . GetZipEntryPath ( packageMetadata . ReadmeFile ) ;
808+ var readmeResult = await _readMeService . GetReadMeHtmlAsync ( readmeFilename , packageArchiveReader , Encoding . UTF8 ) ;
809+ return readmeResult ? . Content ;
810+ }
811+
791812 private static async Task < byte [ ] > ReadPackageFile ( PackageArchiveReader packageArchiveReader , string filename )
792813 {
793814 using ( var packageFileStream = packageArchiveReader . GetStream ( filename ) )
@@ -2600,9 +2621,14 @@ protected virtual async Task<JsonResult> VerifyPackageInternal(
26002621 {
26012622 return afterValidationJsonResult ;
26022623 }
2603-
2624+
26042625 if ( formData . Edit != null )
26052626 {
2627+ if ( package . HasReadMe && package . EmbeddedReadmeType != EmbeddedReadmeFileType . Absent )
2628+ {
2629+ return Json ( HttpStatusCode . BadRequest , new [ ] { new JsonValidationMessage ( Strings . ReadmeNotEditableWithEmbeddedReadme ) } ) ;
2630+ }
2631+
26062632 try
26072633 {
26082634 if ( await _readMeService . SaveReadMeMdIfChanged (
0 commit comments