Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef mozilla_dom_InternalHeaders_h
8 : #define mozilla_dom_InternalHeaders_h
9 :
10 : // needed for HeadersGuardEnum.
11 : #include "mozilla/dom/HeadersBinding.h"
12 : #include "mozilla/dom/UnionTypes.h"
13 :
14 : #include "nsClassHashtable.h"
15 : #include "nsWrapperCache.h"
16 :
17 : namespace mozilla {
18 :
19 : class ErrorResult;
20 :
21 : namespace dom {
22 :
23 : template<typename K, typename V> class Record;
24 : class HeadersEntry;
25 :
26 : class InternalHeaders final
27 : {
28 14 : NS_INLINE_DECL_THREADSAFE_REFCOUNTING(InternalHeaders)
29 :
30 : public:
31 8 : struct Entry
32 : {
33 4 : Entry(const nsACString& aName, const nsACString& aValue)
34 4 : : mName(aName)
35 4 : , mValue(aValue)
36 4 : { }
37 :
38 0 : Entry() { }
39 :
40 : nsCString mName;
41 : nsCString mValue;
42 : };
43 :
44 : private:
45 : HeadersGuardEnum mGuard;
46 : nsTArray<Entry> mList;
47 :
48 : public:
49 4 : explicit InternalHeaders(HeadersGuardEnum aGuard = HeadersGuardEnum::None)
50 4 : : mGuard(aGuard)
51 : {
52 4 : }
53 :
54 3 : explicit InternalHeaders(const InternalHeaders& aOther)
55 3 : : mGuard(HeadersGuardEnum::None)
56 : {
57 6 : ErrorResult result;
58 3 : Fill(aOther, result);
59 3 : MOZ_ASSERT(!result.Failed());
60 : // Note that it's important to set the guard after Fill(), to make sure
61 : // that Fill() doesn't fail if aOther is immutable.
62 3 : mGuard = aOther.mGuard;
63 3 : }
64 :
65 : explicit InternalHeaders(const nsTArray<Entry>&& aHeaders,
66 : HeadersGuardEnum aGuard = HeadersGuardEnum::None);
67 :
68 : InternalHeaders(const nsTArray<HeadersEntry>& aHeadersEntryList,
69 : HeadersGuardEnum aGuard);
70 :
71 : void ToIPC(nsTArray<HeadersEntry>& aIPCHeaders,
72 : HeadersGuardEnum& aGuard);
73 :
74 : void Append(const nsACString& aName, const nsACString& aValue,
75 : ErrorResult& aRv);
76 : void Delete(const nsACString& aName, ErrorResult& aRv);
77 : void Get(const nsACString& aName, nsACString& aValue, ErrorResult& aRv) const;
78 : void GetFirst(const nsACString& aName, nsACString& aValue, ErrorResult& aRv) const;
79 : bool Has(const nsACString& aName, ErrorResult& aRv) const;
80 : void Set(const nsACString& aName, const nsACString& aValue, ErrorResult& aRv);
81 :
82 0 : uint32_t GetIterableLength() const
83 : {
84 0 : return mList.Length();
85 : }
86 0 : const NS_ConvertASCIItoUTF16 GetKeyAtIndex(unsigned aIndex) const
87 : {
88 0 : MOZ_ASSERT(aIndex < mList.Length());
89 0 : return NS_ConvertASCIItoUTF16(mList[aIndex].mName);
90 : }
91 0 : const NS_ConvertASCIItoUTF16 GetValueAtIndex(unsigned aIndex) const
92 : {
93 0 : MOZ_ASSERT(aIndex < mList.Length());
94 0 : return NS_ConvertASCIItoUTF16(mList[aIndex].mValue);
95 : }
96 :
97 : void Clear();
98 :
99 4 : HeadersGuardEnum Guard() const { return mGuard; }
100 : void SetGuard(HeadersGuardEnum aGuard, ErrorResult& aRv);
101 :
102 : void Fill(const InternalHeaders& aInit, ErrorResult& aRv);
103 : void Fill(const Sequence<Sequence<nsCString>>& aInit, ErrorResult& aRv);
104 : void Fill(const Record<nsCString, nsCString>& aInit, ErrorResult& aRv);
105 : void FillResponseHeaders(nsIRequest* aRequest);
106 :
107 : bool HasOnlySimpleHeaders() const;
108 :
109 : bool HasRevalidationHeaders() const;
110 :
111 : static already_AddRefed<InternalHeaders>
112 : BasicHeaders(InternalHeaders* aHeaders);
113 :
114 : static already_AddRefed<InternalHeaders>
115 : CORSHeaders(InternalHeaders* aHeaders);
116 :
117 : void
118 : GetEntries(nsTArray<InternalHeaders::Entry>& aEntries) const;
119 :
120 : void
121 : GetUnsafeHeaders(nsTArray<nsCString>& aNames) const;
122 : private:
123 : virtual ~InternalHeaders();
124 :
125 : static bool IsInvalidName(const nsACString& aName, ErrorResult& aRv);
126 : static bool IsInvalidValue(const nsACString& aValue, ErrorResult& aRv);
127 : bool IsImmutable(ErrorResult& aRv) const;
128 : bool IsForbiddenRequestHeader(const nsACString& aName) const;
129 : bool IsForbiddenRequestNoCorsHeader(const nsACString& aName) const;
130 : bool IsForbiddenRequestNoCorsHeader(const nsACString& aName,
131 : const nsACString& aValue) const;
132 : bool IsForbiddenResponseHeader(const nsACString& aName) const;
133 :
134 2 : bool IsInvalidMutableHeader(const nsACString& aName,
135 : ErrorResult& aRv) const
136 : {
137 2 : return IsInvalidMutableHeader(aName, EmptyCString(), aRv);
138 : }
139 :
140 6 : bool IsInvalidMutableHeader(const nsACString& aName,
141 : const nsACString& aValue,
142 : ErrorResult& aRv) const
143 : {
144 12 : return IsInvalidName(aName, aRv) ||
145 12 : IsInvalidValue(aValue, aRv) ||
146 12 : IsImmutable(aRv) ||
147 12 : IsForbiddenRequestHeader(aName) ||
148 18 : IsForbiddenRequestNoCorsHeader(aName, aValue) ||
149 12 : IsForbiddenResponseHeader(aName);
150 : }
151 :
152 : static bool IsSimpleHeader(const nsACString& aName,
153 : const nsACString& aValue);
154 :
155 : static bool IsRevalidationHeader(const nsACString& aName);
156 : };
157 :
158 : } // namespace dom
159 : } // namespace mozilla
160 :
161 : #endif // mozilla_dom_InternalHeaders_h
|