/src/mozilla-central/netwerk/protocol/http/nsHttpRequestHead.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | | |
6 | | #ifndef nsHttpRequestHead_h__ |
7 | | #define nsHttpRequestHead_h__ |
8 | | |
9 | | #include "nsHttp.h" |
10 | | #include "nsHttpHeaderArray.h" |
11 | | #include "nsString.h" |
12 | | #include "mozilla/RecursiveMutex.h" |
13 | | |
14 | | class nsIHttpHeaderVisitor; |
15 | | |
16 | | namespace mozilla { namespace net { |
17 | | |
18 | | //----------------------------------------------------------------------------- |
19 | | // nsHttpRequestHead represents the request line and headers from an HTTP |
20 | | // request. |
21 | | //----------------------------------------------------------------------------- |
22 | | |
23 | | class nsHttpRequestHead |
24 | | { |
25 | | public: |
26 | | nsHttpRequestHead(); |
27 | | ~nsHttpRequestHead(); |
28 | | |
29 | | // The following function is only used in HttpChannelParent to avoid |
30 | | // copying headers. If you use it be careful to do it only under |
31 | | // nsHttpRequestHead lock!!! |
32 | | const nsHttpHeaderArray &Headers() const; |
33 | 0 | void Enter() { mRecursiveMutex.Lock(); } |
34 | 0 | void Exit() { mRecursiveMutex.Unlock(); } |
35 | | |
36 | | void SetHeaders(const nsHttpHeaderArray& aHeaders); |
37 | | |
38 | | void SetMethod(const nsACString &method); |
39 | | void SetVersion(HttpVersion version); |
40 | | void SetRequestURI(const nsACString& s); |
41 | | void SetPath(const nsACString& s); |
42 | | uint32_t HeaderCount(); |
43 | | |
44 | | // Using this function it is possible to itereate through all headers |
45 | | // automatically under one lock. |
46 | | MOZ_MUST_USE nsresult |
47 | | VisitHeaders(nsIHttpHeaderVisitor *visitor, |
48 | | nsHttpHeaderArray::VisitorFilter filter = |
49 | | nsHttpHeaderArray::eFilterAll); |
50 | | void Method(nsACString &aMethod); |
51 | | HttpVersion Version(); |
52 | | void RequestURI(nsACString &RequestURI); |
53 | | void Path(nsACString &aPath); |
54 | | void SetHTTPS(bool val); |
55 | | bool IsHTTPS(); |
56 | | |
57 | | void SetOrigin(const nsACString &scheme, const nsACString &host, |
58 | | int32_t port); |
59 | | void Origin(nsACString &aOrigin); |
60 | | |
61 | | MOZ_MUST_USE nsresult SetHeader(const nsACString &h, const nsACString &v, |
62 | | bool m=false); |
63 | | MOZ_MUST_USE nsresult SetHeader(nsHttpAtom h, const nsACString &v, |
64 | | bool m=false); |
65 | | MOZ_MUST_USE nsresult SetHeader(nsHttpAtom h, const nsACString &v, bool m, |
66 | | nsHttpHeaderArray::HeaderVariety variety); |
67 | | MOZ_MUST_USE nsresult SetEmptyHeader(const nsACString &h); |
68 | | MOZ_MUST_USE nsresult GetHeader(nsHttpAtom h, nsACString &v); |
69 | | |
70 | | MOZ_MUST_USE nsresult ClearHeader(nsHttpAtom h); |
71 | | void ClearHeaders(); |
72 | | |
73 | | bool HasHeaderValue(nsHttpAtom h, const char *v); |
74 | | // This function returns true if header is set even if it is an empty |
75 | | // header. |
76 | | bool HasHeader(nsHttpAtom h); |
77 | | void Flatten(nsACString &, bool pruneProxyHeaders = false); |
78 | | |
79 | | // Don't allow duplicate values |
80 | | MOZ_MUST_USE nsresult SetHeaderOnce(nsHttpAtom h, const char *v, |
81 | | bool merge = false); |
82 | | |
83 | | bool IsSafeMethod(); |
84 | | |
85 | | enum ParsedMethodType |
86 | | { |
87 | | kMethod_Custom, |
88 | | kMethod_Get, |
89 | | kMethod_Post, |
90 | | kMethod_Options, |
91 | | kMethod_Connect, |
92 | | kMethod_Head, |
93 | | kMethod_Put, |
94 | | kMethod_Trace |
95 | | }; |
96 | | |
97 | | ParsedMethodType ParsedMethod(); |
98 | | bool EqualsMethod(ParsedMethodType aType); |
99 | 0 | bool IsGet() { return EqualsMethod(kMethod_Get); } |
100 | 0 | bool IsPost() { return EqualsMethod(kMethod_Post); } |
101 | 0 | bool IsOptions() { return EqualsMethod(kMethod_Options); } |
102 | 0 | bool IsConnect() { return EqualsMethod(kMethod_Connect); } |
103 | 0 | bool IsHead() { return EqualsMethod(kMethod_Head); } |
104 | 0 | bool IsPut() { return EqualsMethod(kMethod_Put); } |
105 | 0 | bool IsTrace() { return EqualsMethod(kMethod_Trace); } |
106 | | void ParseHeaderSet(const char *buffer); |
107 | | private: |
108 | | // All members must be copy-constructable and assignable |
109 | | nsHttpHeaderArray mHeaders; |
110 | | nsCString mMethod; |
111 | | HttpVersion mVersion; |
112 | | |
113 | | // mRequestURI and mPath are strings instead of an nsIURI |
114 | | // because this is used off the main thread |
115 | | nsCString mRequestURI; |
116 | | nsCString mPath; |
117 | | |
118 | | nsCString mOrigin; |
119 | | ParsedMethodType mParsedMethod; |
120 | | bool mHTTPS; |
121 | | |
122 | | // We are using RecursiveMutex instead of a Mutex because VisitHeader |
123 | | // function calls nsIHttpHeaderVisitor::VisitHeader while under lock. |
124 | | RecursiveMutex mRecursiveMutex; |
125 | | |
126 | | // During VisitHeader we sould not allow cal to SetHeader. |
127 | | bool mInVisitHeaders; |
128 | | }; |
129 | | |
130 | | } // namespace net |
131 | | } // namespace mozilla |
132 | | |
133 | | #endif // nsHttpRequestHead_h__ |