private Stream GetNonFileStream( Uri uri, ICredentials credentials ) {
WebRequest req = WebRequest.Create( uri );
if ( credentials != null ) {
req.Credentials = credentials;
}
WebResponse resp = req.GetResponse();
HttpWebRequest webReq = req as HttpWebRequest;
if ( webReq != null ) {
lock ( this ) {
if ( connections == null ) {
connections = new Hashtable();
}
OpenedHost openedHost = (OpenedHost)connections[webReq.Address.Host];
if ( openedHost == null ) {
openedHost = new OpenedHost();
}
if ( openedHost.nonCachedConnectionsCount < webReq.ServicePoint.ConnectionLimit - 1 ) {
// we are not close to connection limit -> don't cache the stream
if ( openedHost.nonCachedConnectionsCount == 0 ) {
connections.Add( webReq.Address.Host, openedHost );
}
openedHost.nonCachedConnectionsCount++;
return new XmlRegisteredNonCachedStream( resp.GetResponseStream(), this, webReq.Address.Host );
}
else {
// cache the stream and save the connection for the next request
return new XmlCachedStream( resp.ResponseUri, resp.GetResponseStream() );
}
}
}
else {
return resp.GetResponseStream();
}
}