From 3a091a0ea1c46ff574834078e7c8aca054aaecb7 Mon Sep 17 00:00:00 2001 From: Almis90 Date: Mon, 3 Jul 2023 16:23:59 +0300 Subject: [PATCH 1/2] Add fallback method for HttpClient.Send on unsupported platforms --- OpenAI.SDK/Extensions/HttpclientExtensions.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/OpenAI.SDK/Extensions/HttpclientExtensions.cs b/OpenAI.SDK/Extensions/HttpclientExtensions.cs index 4b184962..6f105d1a 100644 --- a/OpenAI.SDK/Extensions/HttpclientExtensions.cs +++ b/OpenAI.SDK/Extensions/HttpclientExtensions.cs @@ -30,12 +30,24 @@ public static HttpResponseMessage PostAsStreamAsync(this HttpClient client, stri request.Content = content; #if NET6_0_OR_GREATER - return client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); + try + { + return client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); + } + catch (PlatformNotSupportedException) + { + return SendRequestPreNet6(client, request, cancellationToken); + } #else + return SendRequestPreNet6(client, request, cancellationToken); +#endif + } + + public static HttpResponseMessage SendRequestPreNet6(HttpClient client, HttpRequestMessage request, CancellationToken cancellationToken) + { var responseTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); var response = responseTask.GetAwaiter().GetResult(); return response; -#endif } public static async Task PostFileAndReadAsAsync(this HttpClient client, string uri, HttpContent content, CancellationToken cancellationToken = default) From 493865f8e343cfb112f2f63bb555c0059eadac64 Mon Sep 17 00:00:00 2001 From: Almis90 Date: Wed, 5 Jul 2023 19:23:23 +0300 Subject: [PATCH 2/2] Refactored http request creation and disposal Addressed an issue related to the using statement that was trying to send a disposed HttpRequestMessage in the catch block --- OpenAI.SDK/Extensions/HttpclientExtensions.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/OpenAI.SDK/Extensions/HttpclientExtensions.cs b/OpenAI.SDK/Extensions/HttpclientExtensions.cs index 6f105d1a..054ed940 100644 --- a/OpenAI.SDK/Extensions/HttpclientExtensions.cs +++ b/OpenAI.SDK/Extensions/HttpclientExtensions.cs @@ -25,9 +25,7 @@ public static HttpResponseMessage PostAsStreamAsync(this HttpClient client, stri var content = JsonContent.Create(requestModel, null, settings); - using var request = new HttpRequestMessage(HttpMethod.Post, uri); - request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream")); - request.Content = content; + using var request = CreatePostEventStreamRequest(uri, content); #if NET6_0_OR_GREATER try @@ -36,20 +34,31 @@ public static HttpResponseMessage PostAsStreamAsync(this HttpClient client, stri } catch (PlatformNotSupportedException) { - return SendRequestPreNet6(client, request, cancellationToken); + using var newRequest = CreatePostEventStreamRequest(uri, content); + + return SendRequestPreNet6(client, newRequest, cancellationToken); } #else return SendRequestPreNet6(client, request, cancellationToken); #endif } - public static HttpResponseMessage SendRequestPreNet6(HttpClient client, HttpRequestMessage request, CancellationToken cancellationToken) + private static HttpResponseMessage SendRequestPreNet6(HttpClient client, HttpRequestMessage request, CancellationToken cancellationToken) { var responseTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); var response = responseTask.GetAwaiter().GetResult(); return response; } + private static HttpRequestMessage CreatePostEventStreamRequest(string uri, HttpContent content) + { + var request = new HttpRequestMessage(HttpMethod.Post, uri); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream")); + request.Content = content; + + return request; + } + public static async Task PostFileAndReadAsAsync(this HttpClient client, string uri, HttpContent content, CancellationToken cancellationToken = default) { var response = await client.PostAsync(uri, content, cancellationToken);