moebius#140: Fix: Fetch - headers should sort and combine

https://github.com/MoonchildProductions/moebius/pull/140
This commit is contained in:
janekptacijarabaci 2018-04-14 22:18:47 +02:00 committed by Roy Tam
commit f70e3223fb
4 changed files with 86 additions and 27 deletions

View file

@ -21,12 +21,14 @@ InternalHeaders::InternalHeaders(const nsTArray<Entry>&& aHeaders,
HeadersGuardEnum aGuard)
: mGuard(aGuard)
, mList(aHeaders)
, mListDirty(true)
{
}
InternalHeaders::InternalHeaders(const nsTArray<HeadersEntry>& aHeadersEntryList,
HeadersGuardEnum aGuard)
: mGuard(aGuard)
, mListDirty(true)
{
for (const HeadersEntry& headersEntry : aHeadersEntryList) {
mList.AppendElement(Entry(headersEntry.name(), headersEntry.value()));
@ -56,6 +58,8 @@ InternalHeaders::Append(const nsACString& aName, const nsACString& aValue,
return;
}
SetListDirty();
mList.AppendElement(Entry(lowerName, aValue));
}
@ -69,6 +73,8 @@ InternalHeaders::Delete(const nsACString& aName, ErrorResult& aRv)
return;
}
SetListDirty();
// remove in reverse order to minimize copying
for (int32_t i = mList.Length() - 1; i >= 0; --i) {
if (lowerName == mList[i].mName) {
@ -155,6 +161,8 @@ InternalHeaders::Set(const nsACString& aName, const nsACString& aValue, ErrorRes
return;
}
SetListDirty();
int32_t firstIndex = INT32_MAX;
// remove in reverse order to minimize copying
@ -177,6 +185,7 @@ InternalHeaders::Set(const nsACString& aName, const nsACString& aValue, ErrorRes
void
InternalHeaders::Clear()
{
SetListDirty();
mList.Clear();
}
@ -419,5 +428,54 @@ InternalHeaders::GetUnsafeHeaders(nsTArray<nsCString>& aNames) const
}
}
void
InternalHeaders::MaybeSortList()
{
class Comparator {
public:
bool Equals(const Entry& aA, const Entry& aB) const
{
return aA.mName == aB.mName;
}
bool LessThan(const Entry& aA, const Entry& aB) const
{
return aA.mName < aB.mName;
}
};
if (!mListDirty) {
return;
}
mListDirty = false;
Comparator comparator;
mSortedList.Clear();
for (const Entry& entry : mList) {
bool found = false;
for (Entry& sortedEntry : mSortedList) {
if (sortedEntry.mName == entry.mName) {
sortedEntry.mValue += ", ";
sortedEntry.mValue += entry.mValue;
found = true;
break;
}
}
if (!found) {
mSortedList.InsertElementSorted(entry, comparator);
}
}
}
void
InternalHeaders::SetListDirty()
{
mSortedList.Clear();
mListDirty = true;
}
} // namespace dom
} // namespace mozilla