From 4ca8f1cd2c7ab01143e5266ea44aaba39bfae85d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 15 Apr 2024 15:28:10 +0100 Subject: [PATCH] fix: "zip" Content-Type resulting in null Stream for Artifacts on Blob Storage (#2905) --- Octokit.Tests/Http/HttpClientAdapterTests.cs | 21 ++++++++++++++++++++ Octokit/Http/HttpClientAdapter.cs | 11 ++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Octokit.Tests/Http/HttpClientAdapterTests.cs b/Octokit.Tests/Http/HttpClientAdapterTests.cs index 8d1c570b19..f5663b8fe0 100644 --- a/Octokit.Tests/Http/HttpClientAdapterTests.cs +++ b/Octokit.Tests/Http/HttpClientAdapterTests.cs @@ -177,6 +177,27 @@ public async Task SetsContentType() Assert.Equal("application/json", response.ContentType); } + + // See #2898 for why this is necessary + // Non standard MIME Content-Type coming from Blob Storage when downloading artifacts + [Fact] + public async Task SetsZipContentType() + { + var memoryStream = new MemoryStream(); + var streamContent = new StreamContent(memoryStream); + streamContent.Headers.TryAddWithoutValidation("Content-Type", "zip"); + + var responseMessage = new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = streamContent + }; + var tester = new HttpClientAdapterTester(); + + var response = await tester.BuildResponseTester(responseMessage); + + Assert.Equal("application/zip", response.ContentType); + } } sealed class HttpClientAdapterTester : HttpClientAdapter diff --git a/Octokit/Http/HttpClientAdapter.cs b/Octokit/Http/HttpClientAdapter.cs index 9cab75fc42..56c96cab88 100644 --- a/Octokit/Http/HttpClientAdapter.cs +++ b/Octokit/Http/HttpClientAdapter.cs @@ -81,7 +81,6 @@ protected virtual async Task BuildResponse(HttpResponseMessage respon AcceptHeaders.RawContentMediaType, "application/zip" , "application/x-gzip" , - "zip" , // Not a standard MIME type but see issue #2898 "application/octet-stream"}; var content = responseMessage.Content; @@ -169,10 +168,18 @@ protected virtual HttpRequestMessage BuildRequestMessage(IRequest request) static string GetContentMediaType(HttpContent httpContent) { - if (httpContent.Headers != null && httpContent.Headers.ContentType != null) + if (httpContent.Headers?.ContentType != null) { return httpContent.Headers.ContentType.MediaType; } + + // Issue #2898 - Bad "zip" Content-Type coming from Blob Storage for artifacts + if (httpContent.Headers?.TryGetValues("Content-Type", out var contentTypeValues) == true + && contentTypeValues.FirstOrDefault() == "zip") + { + return "application/zip"; + } + return null; }