private void MergeUpdateCollections(CookieCollection destination, CookieCollection source, int port, bool isSecure, bool isPlainOnly) {
// we may change it
lock (source) {
//cannot use foreach as we going update 'source'
for (int idx = 0 ; idx < source.Count; ++idx) {
bool to_add = false;
Cookie cookie = source[idx];
if (cookie.Expired) {
//If expired, remove from container and don't add to the destination
source.RemoveAt(idx);
--m_count;
--idx;
}
else {
//Add only if port does match to this request URI
//or was not present in the original response
if(isPlainOnly && cookie.Variant != CookieVariant.Plain) {
;//don;t add
}
else if(cookie.PortList != null)
{
foreach (int p in cookie.PortList) {
if(p == port) {
to_add = true;
break;
}
}
}
else {
//it was implicit Port, always OK to add
to_add = true;
}
//refuse adding secure cookie into 'unsecure' destination
if (cookie.Secure && !isSecure) {
to_add = false;
}
if (to_add) {
// In 'source' are already orederd.
// If two same cookies come from dif 'source' then they
// will follow (not replace) each other.
destination.InternalAdd(cookie, false);
}
}
}
}
}