Bumping manifests a=b2g-bump
[gecko.git] / dom / fetch / InternalHeaders.h
blobccf5f79df493ac8c552beff4f2328e8c79889c8f
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/. */
7 #ifndef mozilla_dom_InternalHeaders_h
8 #define mozilla_dom_InternalHeaders_h
10 // needed for HeadersGuardEnum.
11 #include "mozilla/dom/HeadersBinding.h"
12 #include "mozilla/dom/UnionTypes.h"
14 #include "nsClassHashtable.h"
15 #include "nsWrapperCache.h"
17 class nsPIDOMWindow;
19 namespace mozilla {
21 class ErrorResult;
23 namespace dom {
25 template<typename T> class MozMap;
26 class HeadersOrByteStringSequenceSequenceOrByteStringMozMap;
28 class InternalHeaders MOZ_FINAL
30 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(InternalHeaders)
32 private:
33 struct Entry
35 Entry(const nsACString& aName, const nsACString& aValue)
36 : mName(aName)
37 , mValue(aValue)
38 { }
40 Entry() { }
42 nsCString mName;
43 nsCString mValue;
46 HeadersGuardEnum mGuard;
47 nsTArray<Entry> mList;
49 public:
50 explicit InternalHeaders(HeadersGuardEnum aGuard = HeadersGuardEnum::None)
51 : mGuard(aGuard)
55 explicit InternalHeaders(const InternalHeaders& aOther)
56 : mGuard(aOther.mGuard)
58 ErrorResult result;
59 Fill(aOther, result);
60 MOZ_ASSERT(!result.Failed());
63 void Append(const nsACString& aName, const nsACString& aValue,
64 ErrorResult& aRv);
65 void Delete(const nsACString& aName, ErrorResult& aRv);
66 void Get(const nsACString& aName, nsCString& aValue, ErrorResult& aRv) const;
67 void GetAll(const nsACString& aName, nsTArray<nsCString>& aResults,
68 ErrorResult& aRv) const;
69 bool Has(const nsACString& aName, ErrorResult& aRv) const;
70 void Set(const nsACString& aName, const nsACString& aValue, ErrorResult& aRv);
72 void Clear();
74 HeadersGuardEnum Guard() const { return mGuard; }
75 void SetGuard(HeadersGuardEnum aGuard, ErrorResult& aRv);
77 void Fill(const InternalHeaders& aInit, ErrorResult& aRv);
78 void Fill(const Sequence<Sequence<nsCString>>& aInit, ErrorResult& aRv);
79 void Fill(const MozMap<nsCString>& aInit, ErrorResult& aRv);
81 bool HasOnlySimpleHeaders() const;
83 static already_AddRefed<InternalHeaders>
84 BasicHeaders(InternalHeaders* aHeaders);
86 static already_AddRefed<InternalHeaders>
87 CORSHeaders(InternalHeaders* aHeaders);
88 private:
89 virtual ~InternalHeaders();
91 static bool IsSimpleHeader(const nsACString& aName,
92 const nsACString& aValue);
93 static bool IsInvalidName(const nsACString& aName, ErrorResult& aRv);
94 static bool IsInvalidValue(const nsACString& aValue, ErrorResult& aRv);
95 bool IsImmutable(ErrorResult& aRv) const;
96 bool IsForbiddenRequestHeader(const nsACString& aName) const;
97 bool IsForbiddenRequestNoCorsHeader(const nsACString& aName) const;
98 bool IsForbiddenRequestNoCorsHeader(const nsACString& aName,
99 const nsACString& aValue) const;
100 bool IsForbiddenResponseHeader(const nsACString& aName) const;
102 bool IsInvalidMutableHeader(const nsACString& aName,
103 ErrorResult& aRv) const
105 return IsInvalidMutableHeader(aName, EmptyCString(), aRv);
108 bool IsInvalidMutableHeader(const nsACString& aName,
109 const nsACString& aValue,
110 ErrorResult& aRv) const
112 return IsInvalidName(aName, aRv) ||
113 IsInvalidValue(aValue, aRv) ||
114 IsImmutable(aRv) ||
115 IsForbiddenRequestHeader(aName) ||
116 IsForbiddenRequestNoCorsHeader(aName, aValue) ||
117 IsForbiddenResponseHeader(aName);
121 } // namespace dom
122 } // namespace mozilla
124 #endif // mozilla_dom_InternalHeaders_h