The good news is that the basics of URIs, HTTP connection handling and caching were not a problem; every implementation passed them with pretty much flying colours. When you send Cache-Control: no-cache or max-age, they’ll do the right thing, and generally they’ll parse the headers, forward them on, and return the response correctly.
The bad news is that more complex functionality is spottily supported, at best. I suspect this is because everyday browsing doesn’t exercise HTTP like more advanced uses like WebDAV, service APIs, etc.
See below for the details of the ups and downs. These are just the highlights; if you have more specific questions, raise them in comments and I’ll do my best to answer.
Excellent information on the quality of common proxy/caching implementations — even though no specific products are named, it’s excellent to know what one can rely on.