1/*
2 * Copyright 2010 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _B_NETWORK_COOKIE_H_
6#define _B_NETWORK_COOKIE_H_
7
8
9#include <Archivable.h>
10#include <DateTime.h>
11#include <Message.h>
12#include <String.h>
13#include <Url.h>
14
15
16namespace BPrivate {
17
18namespace Network {
19
20
21class BNetworkCookie : public BArchivable {
22public:
23								BNetworkCookie(const char* name,
24									const char* value, const BUrl& url);
25								BNetworkCookie(const BString& cookieString,
26									const BUrl& url);
27								BNetworkCookie(BMessage* archive);
28								BNetworkCookie();
29	virtual						~BNetworkCookie();
30
31	// Parse a "SetCookie" string
32
33			status_t			ParseCookieString(const BString& string,
34									const BUrl& url);
35
36	// Modify the cookie fields
37			BNetworkCookie&		SetName(const BString& name);
38			BNetworkCookie&		SetValue(const BString& value);
39			status_t			SetDomain(const BString& domain);
40			status_t			SetPath(const BString& path);
41			BNetworkCookie&		SetMaxAge(int32 maxAge);
42			BNetworkCookie&		SetExpirationDate(time_t expireDate);
43			BNetworkCookie&		SetExpirationDate(BDateTime& expireDate);
44			BNetworkCookie& 	SetSecure(bool secure);
45			BNetworkCookie&		SetHttpOnly(bool httpOnly);
46
47	// Access the cookie fields
48			const BString&		Name() const;
49			const BString&		Value() const;
50			const BString&		Domain() const;
51			const BString&		Path() const;
52			time_t				ExpirationDate() const;
53			const BString&		ExpirationString() const;
54			bool				Secure() const;
55			bool				HttpOnly() const;
56			const BString&		RawCookie(bool full) const;
57
58			bool				IsHostOnly() const;
59			bool				IsSessionCookie() const;
60			bool				IsValid() const;
61			bool				IsValidForUrl(const BUrl& url) const;
62			bool				IsValidForDomain(const BString& domain) const;
63			bool				IsValidForPath(const BString& path) const;
64
65	// Test if cookie fields are defined
66			bool				HasName() const;
67			bool				HasValue() const;
68			bool				HasDomain() const;
69			bool				HasPath() const;
70			bool				HasExpirationDate() const;
71
72	// Test if cookie could be deleted
73			bool				ShouldDeleteAtExit() const;
74			bool				ShouldDeleteNow() const;
75
76	// BArchivable members
77	virtual	status_t			Archive(BMessage* into,
78									bool deep = true) const;
79	static	BArchivable*		Instantiate(BMessage* archive);
80
81	// Overloaded operators
82			bool				operator==(const BNetworkCookie& other);
83			bool				operator!=(const BNetworkCookie& other);
84private:
85			void				_Reset();
86			int32				_ExtractNameValuePair(const BString& string,
87									BString& name, BString& value,
88									int32 index);
89			int32				_ExtractAttributeValuePair(
90									const BString& string, BString& name,
91									BString& value,	int32 index);
92			BString				_DefaultPathForUrl(const BUrl& url);
93
94			bool				_CanBeSetFromUrl(const BUrl& url) const;
95			bool				_CanBeSetFromDomain(const BString& path) const;
96			bool				_CanBeSetFromPath(const BString& path) const;
97
98private:
99	mutable	BString				fRawCookie;
100	mutable	bool				fRawCookieValid;
101	mutable	BString				fRawFullCookie;
102	mutable	bool				fRawFullCookieValid;
103	mutable	BString				fExpirationString;
104	mutable	bool				fExpirationStringValid;
105
106			BString				fName;
107			BString				fValue;
108			BString				fDomain;
109			BString				fPath;
110			BDateTime			fExpiration;
111			status_t			fInitStatus;
112			bool				fSecure;
113			bool				fHttpOnly;
114			bool				fHostOnly;
115			bool				fSessionCookie;
116};
117
118
119} // namespace Network
120
121} // namespace BPrivate
122
123#endif // _B_NETWORK_COOKIE_H_
124
125