Bug 1173439 P2 Parse Response URL query as a separate field. r=ehsan

This commit is contained in:
Ben Kelly 2015-06-16 17:39:05 -07:00
parent 18e16a0fa2
commit 2a2c3fa17d
5 changed files with 36 additions and 15 deletions

2
dom/cache/Cache.cpp vendored
View File

@ -41,7 +41,7 @@ IsValidPutRequestURL(const nsAString& aUrl, ErrorResult& aRv)
// make a copy because ProcessURL strips the fragmet
NS_ConvertUTF16toUTF8 url(aUrl);
TypeUtils::ProcessURL(url, &validScheme, nullptr, aRv);
TypeUtils::ProcessURL(url, &validScheme, nullptr, nullptr, aRv);
if (aRv.Failed()) {
return false;
}

View File

@ -55,6 +55,7 @@ struct CacheRequest
nsCString method;
nsCString url;
nsCString urlWithoutQuery;
nsCString urlQuery;
HeadersEntry[] headers;
HeadersGuardEnum headersGuard;
nsString referrer;

View File

@ -263,6 +263,7 @@ CreateSchema(mozIStorageConnection* aConn)
"request_method TEXT NOT NULL, "
"request_url TEXT NOT NULL, "
"request_url_no_query TEXT NOT NULL, "
"request_url_query TEXT NOT NULL, "
"request_referrer TEXT NOT NULL, "
"request_headers_guard INTEGER NOT NULL, "
"request_mode INTEGER NOT NULL, "
@ -1433,6 +1434,7 @@ InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
"request_method, "
"request_url, "
"request_url_no_query, "
"request_url_query, "
"request_referrer, "
"request_headers_guard, "
"request_mode, "
@ -1454,6 +1456,7 @@ InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
":request_method, "
":request_url, "
":request_url_no_query, "
":request_url_query, "
":request_referrer, "
":request_headers_guard, "
":request_mode, "
@ -1487,6 +1490,10 @@ InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
aRequest.urlWithoutQuery());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
rv = state->BindUTF8StringByName(NS_LITERAL_CSTRING("request_url_query"),
aRequest.urlQuery());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
rv = state->BindStringByName(NS_LITERAL_CSTRING("request_referrer"),
aRequest.referrer());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
@ -1745,6 +1752,7 @@ ReadRequest(mozIStorageConnection* aConn, EntryId aEntryId,
"request_method, "
"request_url, "
"request_url_no_query, "
"request_url_query, "
"request_referrer, "
"request_headers_guard, "
"request_mode, "
@ -1773,45 +1781,48 @@ ReadRequest(mozIStorageConnection* aConn, EntryId aEntryId,
rv = state->GetUTF8String(2, aSavedRequestOut->mValue.urlWithoutQuery());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
rv = state->GetString(3, aSavedRequestOut->mValue.referrer());
rv = state->GetUTF8String(3, aSavedRequestOut->mValue.urlQuery());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
rv = state->GetString(4, aSavedRequestOut->mValue.referrer());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
int32_t guard;
rv = state->GetInt32(4, &guard);
rv = state->GetInt32(5, &guard);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.headersGuard() =
static_cast<HeadersGuardEnum>(guard);
int32_t mode;
rv = state->GetInt32(5, &mode);
rv = state->GetInt32(6, &mode);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.mode() = static_cast<RequestMode>(mode);
int32_t credentials;
rv = state->GetInt32(6, &credentials);
rv = state->GetInt32(7, &credentials);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.credentials() =
static_cast<RequestCredentials>(credentials);
int32_t requestContentPolicyType;
rv = state->GetInt32(7, &requestContentPolicyType);
rv = state->GetInt32(8, &requestContentPolicyType);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.contentPolicyType() =
static_cast<nsContentPolicyType>(requestContentPolicyType);
int32_t requestCache;
rv = state->GetInt32(8, &requestCache);
rv = state->GetInt32(9, &requestCache);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.requestCache() =
static_cast<RequestCache>(requestCache);
bool nullBody = false;
rv = state->GetIsNull(9, &nullBody);
rv = state->GetIsNull(10, &nullBody);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mHasBodyId = !nullBody;
if (aSavedRequestOut->mHasBodyId) {
rv = ExtractId(state, 9, &aSavedRequestOut->mBodyId);
rv = ExtractId(state, 10, &aSavedRequestOut->mBodyId);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
}

View File

@ -154,7 +154,8 @@ TypeUtils::ToCacheRequest(CacheRequest& aOut, InternalRequest* aIn,
aIn->GetURL(aOut.url());
bool schemeValid;
ProcessURL(aOut.url(), &schemeValid, &aOut.urlWithoutQuery(), aRv);
ProcessURL(aOut.url(), &schemeValid, &aOut.urlWithoutQuery(),
&aOut.urlQuery(), aRv);
if (aRv.Failed()) {
return;
}
@ -205,7 +206,7 @@ TypeUtils::ToCacheResponseWithoutBody(CacheResponse& aOut,
if (aOut.url() != EmptyCString()) {
// Pass all Response URL schemes through... The spec only requires we take
// action on invalid schemes for Request objects.
ProcessURL(aOut.url(), nullptr, nullptr, aRv);
ProcessURL(aOut.url(), nullptr, nullptr, nullptr, aRv);
if (aRv.Failed()) {
return;
}
@ -373,7 +374,8 @@ TypeUtils::ToInternalHeaders(const nsTArray<HeadersEntry>& aHeadersEntryList,
// static
void
TypeUtils::ProcessURL(nsACString& aUrl, bool* aSchemeValidOut,
nsACString* aUrlWithoutQueryOut, ErrorResult& aRv)
nsACString* aUrlWithoutQueryOut,nsACString* aUrlQueryOut,
ErrorResult& aRv)
{
const nsAFlatCString& flatURL = PromiseFlatCString(aUrl);
const char* url = flatURL.get();
@ -422,17 +424,19 @@ TypeUtils::ProcessURL(nsACString& aUrl, bool* aSchemeValidOut,
return;
}
MOZ_ASSERT(aUrlQueryOut);
if (queryLen < 0) {
*aUrlWithoutQueryOut = aUrl;
*aUrlQueryOut = EmptyCString();
return;
}
// ParsePath gives us query position relative to the start of the path
queryPos += pathPos;
// We want everything before the query sine we already removed the trailing
// fragment
*aUrlWithoutQueryOut = Substring(aUrl, 0, queryPos - 1);
*aUrlQueryOut = Substring(aUrl, queryPos - 1, queryLen + 1);
}
void

View File

@ -108,11 +108,16 @@ public:
// if the aUrl's scheme is valid or not for storing in the cache.
// 3) If aUrlWithoutQueryOut is set, then a url string is provided without
// the search section.
// 4) If aUrlQueryOut is set then its populated with the search section
// of the URL. Note, this parameter must be set if aUrlWithoutQueryOut
// is set. They must either both be nullptr or set to valid string
// pointers.
//
// Any errors are thrown on ErrorResult.
static void
ProcessURL(nsACString& aUrl, bool* aSchemeValidOut,
nsACString* aUrlWithoutQueryOut, ErrorResult& aRv);
nsACString* aUrlWithoutQueryOut, nsACString* aUrlQueryOut,
ErrorResult& aRv);
private:
void