diff --git a/src/libs/Serper/Generated/Serper.Exceptions.g.cs b/src/libs/Serper/Generated/Serper.Exceptions.g.cs index e47493c..10d333d 100644 --- a/src/libs/Serper/Generated/Serper.Exceptions.g.cs +++ b/src/libs/Serper/Generated/Serper.Exceptions.g.cs @@ -12,16 +12,19 @@ public partial class ApiException : global::System.Exception /// The HTTP status code of the response. /// public global::System.Net.HttpStatusCode StatusCode { get; } + /// /// The response body as a string, or null if the body could not be read. /// This is always populated for error responses regardless of the ReadResponseAsString setting. /// For success-path failures (e.g. deserialization errors), the client attempts a best-effort read. /// public string? ResponseBody { get; set; } + /// /// The response headers. /// public global::System.Collections.Generic.Dictionary>? ResponseHeaders { get; set; } + /// /// Initializes a new instance of the class. /// @@ -49,6 +52,103 @@ public ApiException(string message, global::System.Exception? innerException, gl { StatusCode = statusCode; } + + /// + /// Constructs an instance whose runtime type matches the response status code when the typed exception hierarchy is enabled. Always returns a plain when the hierarchy is disabled. + /// + /// The HTTP status code of the response. + /// The error message. + /// An inner exception, when one is available. + /// The response headers; consulted for 429 Retry-After parsing when present. + public static global::Serper.ApiException Create( + global::System.Net.HttpStatusCode statusCode, + string message, + global::System.Exception? innerException = null, + global::System.Collections.Generic.IDictionary>? responseHeaders = null) + { + return new global::Serper.ApiException(message, innerException, statusCode); + } + + /// + /// Convenience overload that constructs an with response body and headers populated. + /// + public static global::Serper.ApiException Create( + global::System.Net.HttpStatusCode statusCode, + string message, + global::System.Exception? innerException, + string? responseBody, + global::System.Collections.Generic.Dictionary>? responseHeaders) + { + var exception = global::Serper.ApiException.Create(statusCode, message, innerException, responseHeaders); + exception.ResponseBody = responseBody; + exception.ResponseHeaders = responseHeaders; + return exception; + } + + /// + /// Parses a Retry-After response header (delta-seconds or HTTP-date) into a . + /// Returns null when the header is missing or unparseable. Public so consumer code that observes + /// directly can recover the value without re-implementing the parser. + /// + public static global::System.TimeSpan? TryParseRetryAfter( + global::System.Collections.Generic.IDictionary>? headers) + { + if (headers == null) + { + return null; + } + + global::System.Collections.Generic.IEnumerable? values = null; + foreach (var entry in headers) + { + if (string.Equals(entry.Key, "Retry-After", global::System.StringComparison.OrdinalIgnoreCase)) + { + values = entry.Value; + break; + } + } + + if (values == null) + { + return null; + } + + string? raw = null; + foreach (var value in values) + { + if (!string.IsNullOrWhiteSpace(value)) + { + raw = value.Trim(); + break; + } + } + + if (string.IsNullOrEmpty(raw)) + { + return null; + } + + if (int.TryParse( + raw, + global::System.Globalization.NumberStyles.Integer, + global::System.Globalization.CultureInfo.InvariantCulture, + out var seconds) && seconds >= 0) + { + return global::System.TimeSpan.FromSeconds(seconds); + } + + if (global::System.DateTimeOffset.TryParse( + raw, + global::System.Globalization.CultureInfo.InvariantCulture, + global::System.Globalization.DateTimeStyles.AssumeUniversal | global::System.Globalization.DateTimeStyles.AdjustToUniversal, + out var when)) + { + var delta = when - global::System.DateTimeOffset.UtcNow; + return delta > global::System.TimeSpan.Zero ? delta : global::System.TimeSpan.Zero; + } + + return null; + } } /// @@ -88,5 +188,39 @@ public ApiException(string message, global::System.Net.HttpStatusCode statusCode public ApiException(string message, global::System.Exception? innerException, global::System.Net.HttpStatusCode statusCode) : base(message, innerException, statusCode) { } + + /// + /// Constructs an whose runtime type matches the response status code when the typed exception hierarchy is enabled. + /// + /// The HTTP status code of the response. + /// The error message. + /// An inner exception, when one is available. + /// The response headers; consulted for 429 Retry-After parsing when present. + public static new global::Serper.ApiException Create( + global::System.Net.HttpStatusCode statusCode, + string message, + global::System.Exception? innerException = null, + global::System.Collections.Generic.IDictionary>? responseHeaders = null) + { + return new global::Serper.ApiException(message, innerException, statusCode); + } + + /// + /// Convenience overload that constructs an with response body, object, and headers populated. + /// + public static global::Serper.ApiException Create( + global::System.Net.HttpStatusCode statusCode, + string message, + global::System.Exception? innerException, + string? responseBody, + T? responseObject, + global::System.Collections.Generic.Dictionary>? responseHeaders) + { + var exception = global::Serper.ApiException.Create(statusCode, message, innerException, responseHeaders); + exception.ResponseBody = responseBody; + exception.ResponseObject = responseObject; + exception.ResponseHeaders = responseHeaders; + return exception; + } } } \ No newline at end of file diff --git a/src/libs/Serper/Generated/Serper.OptionsSupport.g.cs b/src/libs/Serper/Generated/Serper.OptionsSupport.g.cs index 7e32e2e..6b43160 100644 --- a/src/libs/Serper/Generated/Serper.OptionsSupport.g.cs +++ b/src/libs/Serper/Generated/Serper.OptionsSupport.g.cs @@ -150,6 +150,84 @@ public interface IAutoSDKAuthorizationProvider global::Serper.AutoSDKHookContext context); } + /// + /// Marker keys stamped onto outgoing + /// instances so consumer s — and any + /// other transport-layer code that runs after AutoSDK's send pipeline — can observe whether + /// the resolved Authorization is call-scoped and opt out of overwriting it with a + /// rotation-aware account-level credential. + /// + public static class AutoSDKHttpRequestOptions + { + /// + /// Key under which records the marker. Exposed + /// for handlers that target frameworks older than .NET 5 and need to read the value + /// through the legacy HttpRequestMessage.Properties bag. + /// + public const string AuthorizationOverrideKey = "AutoSDK.AuthorizationOverride"; + +#if NET5_0_OR_GREATER + /// + /// Strongly-typed for + /// the call-scoped Authorization marker on .NET 5+ targets. Consumers should prefer this + /// over the legacy HttpRequestMessage.Properties bag where available. + /// + public static readonly global::System.Net.Http.HttpRequestOptionsKey AuthorizationOverride = + new global::System.Net.Http.HttpRequestOptionsKey(AuthorizationOverrideKey); +#endif + + /// + /// Stamps the call-scoped Authorization marker on . AutoSDK's + /// built-in calls this whenever the + /// resolved auth came from a per-request override or a client-level + /// . Hand-written SDK extensions that set a + /// non-default Authorization header (e.g. a session-scoped bearer returned by an + /// upstream poll) should call this too so downstream rotation handlers know to skip the + /// overwrite. + /// + /// + public static void StampAuthorizationOverride( + global::System.Net.Http.HttpRequestMessage? request) + { + if (request is null) + { + return; + } + +#if NET5_0_OR_GREATER + request.Options.Set(AuthorizationOverride, true); +#else +#pragma warning disable CS0618 // HttpRequestMessage.Properties is obsolete in NET5+, but the only option below it. + request.Properties[AuthorizationOverrideKey] = true; +#pragma warning restore CS0618 +#endif + } + + /// + /// Returns true when previously marked the + /// request as carrying a call-scoped Authorization. + /// + /// + public static bool HasAuthorizationOverride( + global::System.Net.Http.HttpRequestMessage? request) + { + if (request is null) + { + return false; + } + +#if NET5_0_OR_GREATER + return request.Options.TryGetValue(AuthorizationOverride, out var value) && value; +#else +#pragma warning disable CS0618 + return request.Properties.TryGetValue(AuthorizationOverrideKey, out var raw) && + raw is bool flag && + flag; +#pragma warning restore CS0618 +#endif + } + } + /// /// Built-in that consults /// before every outgoing @@ -176,6 +254,7 @@ public sealed class AutoSDKAuthorizationProviderHook : global::Serper.AutoSDKHoo ApplyAuthorization(context.Request, perRequest[index]); } + global::Serper.AutoSDKHttpRequestOptions.StampAuthorizationOverride(context.Request); return; } @@ -195,6 +274,8 @@ public sealed class AutoSDKAuthorizationProviderHook : global::Serper.AutoSDKHoo { ApplyAuthorization(context.Request, resolved[index]); } + + global::Serper.AutoSDKHttpRequestOptions.StampAuthorizationOverride(context.Request); } private static void ApplyAuthorization( diff --git a/src/libs/Serper/Generated/Serper.SerperClient.Autocomplete.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.Autocomplete.g.cs index 4b11a91..1a1aec7 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.Autocomplete.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.Autocomplete.g.cs @@ -369,17 +369,15 @@ partial void ProcessAutocompleteResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -416,17 +414,15 @@ partial void ProcessAutocompleteResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.ImageSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.ImageSearch.g.cs index 2c3f3c7..bc16b05 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.ImageSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.ImageSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessImageSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessImageSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.NewsSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.NewsSearch.g.cs index cb35d25..0aa3280 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.NewsSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.NewsSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessNewsSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessNewsSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.PatentSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.PatentSearch.g.cs index 1e4f8fa..10b39e3 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.PatentSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.PatentSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessPatentSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessPatentSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.PlacesSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.PlacesSearch.g.cs index 5741ce4..50dc397 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.PlacesSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.PlacesSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessPlacesSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessPlacesSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.ScholarSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.ScholarSearch.g.cs index e072795..9478965 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.ScholarSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.ScholarSearch.g.cs @@ -369,17 +369,15 @@ partial void ProcessScholarSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -416,17 +414,15 @@ partial void ProcessScholarSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.Search.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.Search.g.cs index 240f6b3..df04797 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.Search.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.Search.g.cs @@ -369,17 +369,15 @@ partial void ProcessSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -416,17 +414,15 @@ partial void ProcessSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.ShoppingSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.ShoppingSearch.g.cs index 1ba714a..688ece0 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.ShoppingSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.ShoppingSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessShoppingSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessShoppingSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } diff --git a/src/libs/Serper/Generated/Serper.SerperClient.VideoSearch.g.cs b/src/libs/Serper/Generated/Serper.SerperClient.VideoSearch.g.cs index 93a3bd2..7bf8fb0 100644 --- a/src/libs/Serper/Generated/Serper.SerperClient.VideoSearch.g.cs +++ b/src/libs/Serper/Generated/Serper.SerperClient.VideoSearch.g.cs @@ -367,17 +367,15 @@ partial void ProcessVideoSearchResponseContent( } catch (global::System.Exception __ex) { - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } } else @@ -414,17 +412,15 @@ partial void ProcessVideoSearchResponseContent( { } - throw new global::Serper.ApiException( + throw global::Serper.ApiException.Create( + statusCode: __response.StatusCode, message: __content ?? __response.ReasonPhrase ?? string.Empty, innerException: __ex, - statusCode: __response.StatusCode) - { - ResponseBody = __content, - ResponseHeaders = global::System.Linq.Enumerable.ToDictionary( + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( __response.Headers, h => h.Key, - h => h.Value), - }; + h => h.Value)); } }