Bug 1349921 - don't prefetch is there's a query string
--- a/netwerk/base/Predictor.cpp
+++ b/netwerk/base/Predictor.cpp
@@ -2636,32 +2636,38 @@ Predictor::CacheabilityAction::OnCacheEn
PREDICTOR_LOG((" VisitMetaData returned %" PRIx32, static_cast<uint32_t>(rv)));
return NS_OK;
}
nsTArray<nsCString> keysToCheck, valuesToCheck;
keysToCheck.SwapElements(mKeysToCheck);
valuesToCheck.SwapElements(mValuesToCheck);
+ bool hasQueryString = false;
+ nsAutoCString query;
+ if (NS_SUCCEEDED(mTargetURI->GetQuery(query)) && !query.IsEmpty()) {
+ hasQueryString = true;
+ }
+
MOZ_ASSERT(keysToCheck.Length() == valuesToCheck.Length());
for (size_t i = 0; i < keysToCheck.Length(); ++i) {
const char *key = keysToCheck[i].BeginReading();
const char *value = valuesToCheck[i].BeginReading();
nsCOMPtr<nsIURI> uri;
uint32_t hitCount, lastHit, flags;
if (!mPredictor->ParseMetaDataEntry(key, value, getter_AddRefs(uri),
hitCount, lastHit, flags)) {
PREDICTOR_LOG((" failed to parse key=%s value=%s", key, value));
continue;
}
bool eq = false;
if (NS_SUCCEEDED(uri->Equals(mTargetURI, &eq)) && eq) {
- if (mHttpStatus == 200 && mMethod.EqualsLiteral("GET")) {
+ if (mHttpStatus == 200 && mMethod.EqualsLiteral("GET") && !hasQueryString) {
PREDICTOR_LOG((" marking %s cacheable", key));
flags |= FLAG_PREFETCHABLE;
} else {
PREDICTOR_LOG((" marking %s uncacheable", key));
flags &= ~FLAG_PREFETCHABLE;
}
nsCString newValue;
MakeMetadataEntry(hitCount, lastHit, flags, newValue);