Coverity sees in the following code that the messageHandler going out of scope, leaks the resource it refers to.
"System.Net.Http" Version="4.3.4" .net 6.0
Could you please suggest what I can do here?
1. "new System.Net.Http.HttpClientHandler(){UseCookies = false}" creates a new resource.
2. Assigning: "messageHandler" = resource returned from "new System.Net.Http.HttpClientHandler(){UseCookies = false}".
var messageHandler = config.MessageHandler ?? new HttpClientHandler() { UseCookies = false };
3. Condition "config.UseOAuth", taking false branch.
if (config.UseOAuth)
{
…
4. Resource "messageHandler" is not closed or saved in "HttpClient".
var client = new HttpClient(messageHandler, messageHandler != config.MessageHandler) { BaseAddress = new Uri(config.Url) };
5. Condition "!config.UseOAuth", taking true branch.
if (!config.UseOAuth)
{
//add request headers
}
6. Variable "messageHandler" going out of scope leaks the resource it refers to.
return RestService.For<AClass>(client, AClass.RefitSettings);
});
}
Thank you!
It looks like Coverity lack some information how
HttpClientlooks inside.It says:
4. Resource "messageHandler" is not closed or saved in "HttpClient".Internally
HttpClientis forwarding yourmessageHandlerto it's one base class calledHttpMessageInvoker, then store it in variable_handlerand there we can findDisposemethodSo
messageHandleris saved insideHttpClientIn .NET 6 you don't need to reference package
System.Net.Httpat all as it's available without anything with version6.0.0Note: What I wrote here is based on version
6.0.0I see other issue, if this code is called multiple times and if
HttpClienttakes argumentmessageHandlerfromconfig.MessageHandler, then if one of thoseHttpClientget disposed other one will contained disposed object, so when you are creatingHttpClientyou have passfalseas second argument if it'sconfig.MessageHandler, or just usemessageHandler != config.MessageHandler