michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef nsHttpRequestHead_h__ michael@0: #define nsHttpRequestHead_h__ michael@0: michael@0: #include "nsHttp.h" michael@0: #include "nsHttpHeaderArray.h" michael@0: #include "nsString.h" michael@0: michael@0: namespace mozilla { namespace net { michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // nsHttpRequestHead represents the request line and headers from an HTTP michael@0: // request. michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: class nsHttpRequestHead michael@0: { michael@0: public: michael@0: nsHttpRequestHead(); michael@0: michael@0: void SetMethod(const nsACString &method); michael@0: void SetVersion(nsHttpVersion version) { mVersion = version; } michael@0: void SetRequestURI(const nsCSubstring &s) { mRequestURI = s; } michael@0: michael@0: const nsHttpHeaderArray &Headers() const { return mHeaders; } michael@0: nsHttpHeaderArray & Headers() { return mHeaders; } michael@0: const nsCString &Method() const { return mMethod; } michael@0: nsHttpVersion Version() const { return mVersion; } michael@0: const nsCSubstring &RequestURI() const { return mRequestURI; } michael@0: michael@0: const char *PeekHeader(nsHttpAtom h) const michael@0: { michael@0: return mHeaders.PeekHeader(h); michael@0: } michael@0: nsresult SetHeader(nsHttpAtom h, const nsACString &v, bool m=false) { return mHeaders.SetHeader(h, v, m); } michael@0: nsresult GetHeader(nsHttpAtom h, nsACString &v) const michael@0: { michael@0: return mHeaders.GetHeader(h, v); michael@0: } michael@0: void ClearHeader(nsHttpAtom h) { mHeaders.ClearHeader(h); } michael@0: void ClearHeaders() { mHeaders.Clear(); } michael@0: michael@0: const char *FindHeaderValue(nsHttpAtom h, const char *v) const michael@0: { michael@0: return mHeaders.FindHeaderValue(h, v); michael@0: } michael@0: bool HasHeaderValue(nsHttpAtom h, const char *v) const michael@0: { michael@0: return mHeaders.HasHeaderValue(h, v); michael@0: } michael@0: michael@0: void Flatten(nsACString &, bool pruneProxyHeaders = false); michael@0: michael@0: // Don't allow duplicate values michael@0: nsresult SetHeaderOnce(nsHttpAtom h, const char *v, bool merge = false) michael@0: { michael@0: if (!merge || !HasHeaderValue(h, v)) michael@0: return mHeaders.SetHeader(h, nsDependentCString(v), merge); michael@0: return NS_OK; michael@0: } michael@0: michael@0: bool IsSafeMethod() const; michael@0: michael@0: enum ParsedMethodType michael@0: { michael@0: kMethod_Custom, michael@0: kMethod_Get, michael@0: kMethod_Post, michael@0: kMethod_Options, michael@0: kMethod_Connect, michael@0: kMethod_Head, michael@0: kMethod_Put, michael@0: kMethod_Trace michael@0: }; michael@0: michael@0: ParsedMethodType ParsedMethod() const { return mParsedMethod; } michael@0: bool EqualsMethod(ParsedMethodType aType) const { return mParsedMethod == aType; } michael@0: bool IsGet() const { return EqualsMethod(kMethod_Get); } michael@0: bool IsPost() const { return EqualsMethod(kMethod_Post); } michael@0: bool IsOptions() const { return EqualsMethod(kMethod_Options); } michael@0: bool IsConnect() const { return EqualsMethod(kMethod_Connect); } michael@0: bool IsHead() const { return EqualsMethod(kMethod_Head); } michael@0: bool IsPut() const { return EqualsMethod(kMethod_Put); } michael@0: bool IsTrace() const { return EqualsMethod(kMethod_Trace); } michael@0: michael@0: private: michael@0: // All members must be copy-constructable and assignable michael@0: nsHttpHeaderArray mHeaders; michael@0: nsCString mMethod; michael@0: nsHttpVersion mVersion; michael@0: nsCString mRequestURI; michael@0: ParsedMethodType mParsedMethod; michael@0: }; michael@0: michael@0: }} // namespace mozilla::net michael@0: michael@0: #endif // nsHttpRequestHead_h__