using (WebResponse response = request.GetResponse())
{
    response.GetResponseStream().CopyTo(destination);
}

Keep each legacy HttpWebRequest response in a scope that finishes consuming and releases it. Here destination is the application's writable output stream; the using block releases the WebResponse even if copying fails, without taking over ownership of that output.

One proxied request succeeding and later ones waiting can indicate unfinished responses occupying connection resources. Merely receiving WebResponse does not finish its body. The request timeout limits a wait, not the lifetime of every response already obtained.

Apply the same ownership to errors. A WebException can carry a response that your code inspects; close it after inspection. A transport failure can have no response at all.

Disposal releases the response's resources but does not promise reusable connections in every case. Protocol, server and body consumption still matter.

This concerns maintenance of the legacy WebRequest stack. Follow the response/stream ownership of the actual client in newer code; for HttpClient, keep responses in their disposal scope, and identify this cleanup failure separately from proxy authentication or route selection.

Winndannde jowitiiɗe heen