From bc5e3c2eee7620227664d9d8f5f4c5131fa6133b Mon Sep 17 00:00:00 2001 From: SchlenkR Date: Tue, 5 Mar 2024 14:58:04 +0100 Subject: [PATCH] 14.5.0 - Added 'useBaseUrl' and 'transformUrl' to Config for better composability - Fixed some extension methods --- Directory.Build.props | 6 +++++- docs/Composability.fsx | 8 +++++++- src/FsHttp/Dsl.CE.fs | 8 ++++++++ src/FsHttp/Dsl.fs | 8 ++++++++ src/FsHttp/Extensions.fs | 30 +++++++++++++++++++----------- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 51392309..bd70870a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 14.4.2 + 14.5.0 Ronald Schlenker Copyright 2024 Ronald Schlenker @@ -16,6 +16,10 @@ https://www.nuget.org/packages/FsHttp#release-body-tab + 14.5.0 + - Added 'useBaseUrl' and 'transformUrl' to Config for better composability + - Fixed some extension methods + 14.4.2 - Thanks @bartelink Pinned FSharp.Core to 5.0.2 in all library projects diff --git a/docs/Composability.fsx b/docs/Composability.fsx index e3680a8e..59bfa4a4 100644 --- a/docs/Composability.fsx +++ b/docs/Composability.fsx @@ -27,7 +27,13 @@ let httpForMySpecialEnvironment = let baseUrl = "http://my-special-environment" http { // we would like to have a fixed URL prefix for all requests. - // So we define a new builder that actually transforms the header. + // So we define a new builder that actually uses a base url, like so: + config_useBaseUrl baseUrl + + // ...in case you need more control, you can also transform the URL: + config_transformUrl (fun url -> baseUrl url) + + // ...or you can transform the header in a similar way. // Since the description of method is a special thing, // we have to change the URL for any method using a header transformer, // like so: diff --git a/src/FsHttp/Dsl.CE.fs b/src/FsHttp/Dsl.CE.fs index 57394a8a..0ba01c8d 100644 --- a/src/FsHttp/Dsl.CE.fs +++ b/src/FsHttp/Dsl.CE.fs @@ -441,6 +441,14 @@ type IRequestContext<'self> with member this.TransformHeader(context: IRequestContext<#IUpdateConfig<_>>, transformer) = Config.transformHeader transformer context.Self + [] + member this.TransformUrl(context: IRequestContext<#IUpdateConfig<_>>, transformer) = + Config.transformUrl transformer context.Self + + [] + member this.UseBaseUrl(context: IRequestContext<#IUpdateConfig<_>>, baseUrl) = + Config.useBaseUrl baseUrl context.Self + [] member this.SetHttpClientFactory(context: IRequestContext<#IUpdateConfig<_>>, httpClientFactory) = Config.setHttpClientFactory httpClientFactory context.Self diff --git a/src/FsHttp/Dsl.fs b/src/FsHttp/Dsl.fs index a4e0d82a..6bc7b766 100644 --- a/src/FsHttp/Dsl.fs +++ b/src/FsHttp/Dsl.fs @@ -480,6 +480,14 @@ module Config = context.UpdateConfig(fun config -> { config with headerTransformers = config.headerTransformers @ [ transformer ] }) + let transformUrl transformer (context: IUpdateConfig<_>) = + context |> transformHeader (fun header -> + let address = transformer header.target.address.Value + { header with target.address = Some address }) + + let useBaseUrl (baseUrl: string) (context: IUpdateConfig<_>) = + context |> transformUrl (fun url -> Url.combine baseUrl url) + let setHttpClientFactory httpClientFactory (context: IUpdateConfig<_>) = context.UpdateConfig(fun config -> { config with httpClientFactory = httpClientFactory }) diff --git a/src/FsHttp/Extensions.fs b/src/FsHttp/Extensions.fs index 97c656da..1bd93fa9 100644 --- a/src/FsHttp/Extensions.fs +++ b/src/FsHttp/Extensions.fs @@ -454,47 +454,55 @@ type ConfigExtensions = [] static member TimeoutInSeconds(fluent: FluentConfig<_>, value) = - Config.timeoutInSeconds value + Config.timeoutInSeconds value fluent.Context [] static member TransformHeader(fluent: FluentConfig<_>, transformer) = - Config.transformHeader transformer + Config.transformHeader transformer fluent.Context + + [] + static member TransformUrl(fluent: FluentConfig<_>, transformer) = + Config.transformUrl transformer fluent.Context + + [] + static member UseBaseUrl(fluent: FluentConfig<_>, baseUrl) = + Config.useBaseUrl baseUrl fluent.Context [] static member SetHttpClientFactory(fluent: FluentConfig<_>, httpClientFactory) = - Config.setHttpClientFactory httpClientFactory + Config.setHttpClientFactory httpClientFactory fluent.Context [] static member TransformHttpClient(fluent: FluentConfig<_>, transformer) = - Config.transformHttpClient transformer + Config.transformHttpClient transformer fluent.Context [] static member TransformHttpRequestMessage(fluent: FluentConfig<_>, transformer) = - Config.transformHttpRequestMessage transformer + Config.transformHttpRequestMessage transformer fluent.Context [] static member TransformHttpClientHandler(fluent: FluentConfig<_>, transformer) = - Config.transformHttpClientHandler transformer + Config.transformHttpClientHandler transformer fluent.Context [] static member Proxy(fluent: FluentConfig<_>, url) = - Config.proxy url + Config.proxy url fluent.Context [] static member Proxy(fluent: FluentConfig<_>, url, credentials) = - Config.proxyWithCredentials url credentials + Config.proxyWithCredentials url credentials fluent.Context [] static member DecompressionMethods(fluent: FluentConfig<_>, decompressionMethods) = - Config.decompressionMethods decompressionMethods + Config.decompressionMethods decompressionMethods fluent.Context [] static member NoDecompression(fluent: FluentConfig<_>) = - Config.noDecompression + Config.noDecompression fluent.Context [] static member CancellationToken(fluent: FluentConfig<_>, cancellationToken) = - Config.cancellationToken cancellationToken + Config.cancellationToken cancellationToken fluent.Context // ---------