Skip to content
This repository has been archived by the owner on Apr 27, 2019. It is now read-only.

Set Proxy and Timeouts #42

Closed
robertmircea opened this issue Feb 28, 2016 · 5 comments
Closed

Set Proxy and Timeouts #42

robertmircea opened this issue Feb 28, 2016 · 5 comments

Comments

@robertmircea
Copy link

What is the best method to set proxy settings and timeouts for the underlying httpclient used by consuldotnet?

@highlyunavailable
Copy link
Contributor

You know, I don't think there is a way. I'd be happy to add one, probably via a constructor that just lets you pass your own httpclient (not sure who would be responsible for disposing though), but I'm travelling this week so I can't do it quickly. I'd be happy to accept a PR or do it when I'm home again.

@highlyunavailable
Copy link
Contributor

I've added a constructor that takes an HttpClient, @robertmircea .

https://github.com/PlayFab/consuldotnet/blob/develop/Consul/Client.cs#L417-L444

Use it with something like:

            var hc = new HttpClient();
            hc.Timeout = TimeSpan.FromDays(10);
            using (var client = new ConsulClient(new ConsulClientConfiguration(), hc))
            {
                await client.KV.Put(new KVPair("kv/customhttpclient"));
            }

The ConsulClient will modify and will dispose of the HttpClient when the ConsulClient is disposed, though I'm not sure if this is the behavior you'd expect or not. Please let me know. You should be able to grab nuget packages from https://ci.appveyor.com/project/highlyunavailable/consuldotnet/build/0.6.3.211-develop/artifacts if you want to try this out.

@robertmircea
Copy link
Author

Thanks for making this available. I favor the pattern where external dependencies are not managed from lifecycle point of view by the components using them. So, in our case, if I pass in ConsulClient's class constructor a HttpClient object, I would like to be responsible for the moment when is the right time to dispose it. This prevents of unwanted and unexpected side effects.

I would appreciate, if you could remove the disposal step from library.

@highlyunavailable
Copy link
Contributor

Fair enough, will do. I've also removed any mutation of the passed HttpClient. You are responsible for creating one that accepts application/json and the constructor will throw an ArgumentException if an HttpClient that does not accept application/json is passed in. No validation of the Timeout parameter is done, either, but if the Timeout parameter is too low (under about 10 minutes) blocking queries will fail with timeout errors rather than return as expected. This also means you can make a single HttpClient and pass it around to multiple ConsulClients if you wish.

The pattern now looks like:

using (var hc = new HttpClient())
{
    hc.Timeout = TimeSpan.FromDays(10);
    hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    using (var client = new ConsulClient(new ConsulClientConfiguration(), hc))
    {
        await client.KV.Put(new KVPair("customhttpclient") { Value = System.Text.Encoding.UTF8.GetBytes("hello world") });
    }
}

I'll merge this in and release a build.

@highlyunavailable
Copy link
Contributor

And released: https://www.nuget.org/packages/Consul/0.6.3.4 Have fun!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants