1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// --------------------------------------------------------------------------
//
// File
// Name: HTTPRequest.h
// Purpose: Request object for HTTP connections
// Created: 26/3/04
//
// --------------------------------------------------------------------------
#ifndef HTTPREQUEST__H
#define HTTPREQUEST__H
#include <string>
#include <map>
class IOStream;
class IOStreamGetLine;
// --------------------------------------------------------------------------
//
// Class
// Name: HTTPRequest
// Purpose: Request object for HTTP connections
// Created: 26/3/04
//
// --------------------------------------------------------------------------
class HTTPRequest
{
public:
HTTPRequest();
~HTTPRequest();
private:
// no copying
HTTPRequest(const HTTPRequest &);
HTTPRequest &operator=(const HTTPRequest &);
public:
typedef std::multimap<std::string, std::string> Query_t;
typedef std::pair<std::string, std::string> QueryEn_t;
enum
{
Method_UNINITIALISED = -1,
Method_UNKNOWN = 0,
Method_GET = 1,
Method_HEAD = 2,
Method_POST = 3
};
enum
{
HTTPVersion__MajorMultiplier = 1000,
HTTPVersion_0_9 = 9,
HTTPVersion_1_0 = 1000,
HTTPVersion_1_1 = 1001
};
bool Read(IOStreamGetLine &rGetLine, int Timeout);
typedef std::map<std::string, std::string> CookieJar_t;
// --------------------------------------------------------------------------
//
// Function
// Name: HTTPResponse::Get*()
// Purpose: Various Get accessors
// Created: 26/3/04
//
// --------------------------------------------------------------------------
int GetMethod() const {return mMethod;}
const std::string &GetRequestURI() const {return mRequestURI;}
const std::string &GetHostName() const {return mHostName;} // note: request does splitting of Host: header
const int GetHostPort() const {return mHostPort;} // into host name and port number
const std::string &GetQueryString() const {return mQueryString;}
int GetHTTPVersion() const {return mHTTPVersion;}
const Query_t &GetQuery() const {return mQuery;}
int GetContentLength() const {return mContentLength;}
const std::string &GetContentType() const {return mContentType;}
const CookieJar_t *GetCookies() const {return mpCookies;} // WARNING: May return NULL
bool GetCookie(const char *CookieName, std::string &rValueOut) const;
const std::string &GetCookie(const char *CookieName) const;
// --------------------------------------------------------------------------
//
// Function
// Name: HTTPRequest::GetClientKeepAliveRequested()
// Purpose: Returns true if the client requested that the connection
// should be kept open for further requests.
// Created: 22/12/04
//
// --------------------------------------------------------------------------
bool GetClientKeepAliveRequested() const {return mClientKeepAliveRequested;}
private:
void ParseHeaders(IOStreamGetLine &rGetLine, int Timeout);
void ParseCookies(const std::string &rHeader, int DataStarts);
private:
int mMethod;
std::string mRequestURI;
std::string mHostName;
int mHostPort;
std::string mQueryString;
int mHTTPVersion;
Query_t mQuery;
int mContentLength;
std::string mContentType;
CookieJar_t *mpCookies;
bool mClientKeepAliveRequested;
};
#endif // HTTPREQUEST__H
|