From 782d000dd5815fd4ee102939d86bd3b425273510 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 14 Oct 2023 00:36:18 +0200 Subject: [PATCH] Adjust serializer selection fallback procedure In summary: 1. Choose by request type only when the server didn't provide a content type and it wasn't possible to detect it 2. If the server did provide a content type but we don't have a deserializer for it, try detection as a fallback --- src/RestSharp/Serializers/RestSerializers.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/RestSharp/Serializers/RestSerializers.cs b/src/RestSharp/Serializers/RestSerializers.cs index 0133db6cf..93aa464ba 100644 --- a/src/RestSharp/Serializers/RestSerializers.cs +++ b/src/RestSharp/Serializers/RestSerializers.cs @@ -87,13 +87,24 @@ internal RestResponse Deserialize(RestRequest request, RestResponse raw, R if (string.IsNullOrWhiteSpace(response.Content)) return null; var contentType = response.ContentType ?? DetectContentType()?.Value; - if (contentType == null) return null; + + if (contentType == null) { + Serializers.TryGetValue(response.Request.RequestFormat, out var serializerByRequestFormat); + return serializerByRequestFormat?.GetSerializer().Deserializer; + } var serializer = Serializers.Values.FirstOrDefault(x => x.SupportsContentType(contentType)); - var factory = serializer ?? - (Serializers.ContainsKey(response.Request.RequestFormat) ? Serializers[response.Request.RequestFormat] : null); - return factory?.GetSerializer().Deserializer; + if (serializer == null) { + var detectedType = DetectContentType()?.Value; + + if (detectedType != null && detectedType != contentType) + { + serializer = Serializers.Values.FirstOrDefault(x => x.SupportsContentType(detectedType)); + } + } + + return serializer?.GetSerializer().Deserializer; ContentType? DetectContentType() => response.Content![0] switch {