Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable AutoRedirect in FlurlClient

I am using FlurlHttp and I want to disable AllowAutoRedirect for some API calls. I know How can I get System.Net.Http.HttpClient to not follow 302 redirects?

WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
HttpClient httpClient = new HttpClient(webRequestHandler);
// Send a request using GetAsync or PostAsync
Task<HttpResponseMessage> response = httpClient.GetAsync("http://www.google.com")

But for Flurl I found only the way similar to described in C# Flurl - Add WebRequestHandler to FlurlClient (I haven't compiled yet the code below , so it may have some errors)

public class HttpClientFactoryWithWebRequestHandler : DefaultHttpClientFactory
{
    private readonly WebRequestHandler _webRequestHandler;

    public HttpClientFactoryWithWebRequestHandler (WebRequestHandler webRequestHandler ) 
    {
        _webRequestHandler = webRequestHandler ;
    }

    public override HttpMessageHandler CreateMessageHandler()
    {
        var handler =_webRequestHandler ;
//Or    var handler = new WebRequestHandler(_webRequestHandler );
        return handler;
    }
}

Then I can pass the setting for a new FlurlClient:

WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
var fc = new FlurlClient(url)
    .ConfigureClient(c => c.HttpClientFactory = 
                  new HttpClientFactoryWithWebRequestHandler (webRequestHandler));

It looks more complicated that it could be. Is it the right way to do or it can be done simplier?

UPDATE 2021: Flurl now supports out of the box

await url.WithAutoRedirect(false).GetAsync();

See more options in https://flurl.dev/docs/configuration/#redirects

like image 779
Michael Freidgeim Avatar asked Oct 07 '17 00:10

Michael Freidgeim


2 Answers

This answer is obsolete as of Flurl 3.0. Per the accepted answer, Flurl now supports a wealth of redirect features out the box.


It feels a little heavy because it's a scenario that Flurl doesn't support directly, so it requires tinkering under the hood a bit. You're on the right track but I think there's a few ways you could simplify it. First, I'd suggest creating the WebRequestHandler inside the factory. Creating it externally and passing it in seems unnecessary.

public class NoRedirectHttpClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new WebRequestHandler { AllowAutoRedirect = false };
    }
}

If you want this behavior app-wide by default, you could register it globally on startup. Then you don't need to do anything with individual FlurlClients.

FlurlHttp.Configure(settings =>
    settings.HttpClientFactory = new NoRedirectHttpClientFactory());

Otherwise, if you need the ability to pick and choose which FlurlClients you disable it for, an extension method would make it a little easier:

public static IFlurlClient WithoutRedirects(this IFlurlClient fc) {
    fc.Settings.HttpClientFactory = new NoRedirectHttpClientFactory();
    return fc;
}

Then use it like this:

new FlurlClient(url).WithoutRedirects()...
like image 118
Todd Menier Avatar answered Nov 05 '22 00:11

Todd Menier


Flurl now supports this natively:

"https://example.com"
  .WithAutoRedirect(false)
  [...]

Documentation: https://flurl.dev/docs/configuration/#redirects

like image 5
Eric Eskildsen Avatar answered Nov 05 '22 00:11

Eric Eskildsen