Fix Invoke-RestMethod to support read-only files in multipart form data (#26454)

This commit is contained in:
yotsuda
2025-11-18 17:49:38 +05:00
committed by GitHub
parent 015b5cd801
commit d486365b24
2 changed files with 40 additions and 1 deletions
@@ -1995,7 +1995,7 @@ namespace Microsoft.PowerShell.Commands
/// <param name="file">The file to use for the <see cref="StreamContent"/></param>
private static StreamContent GetMultipartFileContent(object fieldName, FileInfo file)
{
StreamContent result = GetMultipartStreamContent(fieldName: fieldName, stream: new FileStream(file.FullName, FileMode.Open));
StreamContent result = GetMultipartStreamContent(fieldName: fieldName, stream: new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read));
result.Headers.ContentDisposition.FileName = file.Name;
result.Headers.ContentDisposition.FileNameStar = file.Name;
@@ -1727,6 +1727,26 @@ Describe "Invoke-WebRequest tests" -Tags "Feature", "RequireAdminOnWindows" {
$result.Files[0].Content | Should -Match $file1Contents
}
It "Verifies Invoke-WebRequest -Form supports read-only file values" {
# Create a read-only test file
$readOnlyFile = Join-Path $TestDrive "readonly-test.txt"
"ReadOnly test content" | Out-File -FilePath $readOnlyFile -Encoding utf8
Set-ItemProperty -Path $readOnlyFile -Name IsReadOnly -Value $true
$form = @{TestFile = [System.IO.FileInfo]$readOnlyFile}
$uri = Get-WebListenerUrl -Test 'Multipart'
$response = Invoke-WebRequest -Uri $uri -Form $form -Method 'POST'
$result = $response.Content | ConvertFrom-Json
$result.Headers.'Content-Type' | Should -Match 'multipart/form-data'
$result.Files.Count | Should -Be 1
$result.Files[0].Name | Should -BeExactly "TestFile"
$result.Files[0].FileName | Should -BeExactly "readonly-test.txt"
$result.Files[0].ContentType | Should -BeExactly 'application/octet-stream'
$result.Files[0].Content | Should -Match "ReadOnly test content"
}
It "Verifies Invoke-WebRequest -Form sets Content-Disposition FileName and FileNameStar." {
$ContentDisposition = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("attachment")
$ContentDisposition.FileName = $fileName
@@ -3568,6 +3588,25 @@ Describe "Invoke-RestMethod tests" -Tags "Feature", "RequireAdminOnWindows" {
$result.Files[0].Content | Should -Match $file1Contents
}
It "Verifies Invoke-RestMethod -Form supports read-only file values" {
# Create a read-only test file
$readOnlyFile = Join-Path $TestDrive "readonly-test.txt"
"ReadOnly test content" | Out-File -FilePath $readOnlyFile -Encoding utf8
Set-ItemProperty -Path $readOnlyFile -Name IsReadOnly -Value $true
$form = @{TestFile = [System.IO.FileInfo]$readOnlyFile}
$uri = Get-WebListenerUrl -Test 'Multipart'
$result = Invoke-RestMethod -Uri $uri -Form $form -Method 'POST'
$result.Headers.'Content-Type' | Should -Match 'multipart/form-data'
$result.Files.Count | Should -Be 1
$result.Files[0].Name | Should -Be "TestFile"
$result.Files[0].FileName | Should -Be "readonly-test.txt"
$result.Files[0].ContentType | Should -Be 'application/octet-stream'
$result.Files[0].Content | Should -Match "ReadOnly test content"
}
It "Verifies Invoke-RestMethod -Form sets Content-Disposition FileName and FileNameStar." {
$ContentDisposition = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("attachment")
$ContentDisposition.FileName = $fileName