Minor optimisation
- No need to call QSet::contains() before calling QSet::remove()
- Prevent QSet double-lookup (i.e. using QSet::contains() followed by insert()), instead use a std::set
- Don't iterate over a temporary container returned by QMap::keys(), rather iterate over the map itself; add a new method to get the EtagCache map