forked from RamseyK/httpserver
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHTTPMessage.h
More file actions
executable file
·152 lines (118 loc) · 2.87 KB
/
HTTPMessage.h
File metadata and controls
executable file
·152 lines (118 loc) · 2.87 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
ByteBuffer
HTTPMessage.h
Copyright 2011-2021 Ramsey Kant
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef _HTTPMESSAGE_H_
#define _HTTPMESSAGE_H_
#include <map>
#include <string>
#include <sstream>
#include "ByteBuffer.h"
// Constants
#define HTTP_VERSION_10 "HTTP/1.0"
#define HTTP_VERSION_11 "HTTP/1.1"
#define DEFAULT_HTTP_VERSION HTTP_VERSION_11
#define NUM_METHODS 9
// HTTP Methods (Requests)
enum Method {
HEAD = 0,
GET = 1,
POST = 2,
PUT = 3,
DEL = 4, // DELETE is taken, use DEL instead
TRACE = 5,
OPTIONS = 6,
CONNECT = 7,
PATCH = 8
};
const static char* const requestMethodStr[NUM_METHODS] = {
"HEAD", // 0
"GET", // 1
"POST", // 2
"PUT", // 3
"DELETE", // 4
"TRACE", // 5
"OPTIONS", // 6
"CONNECT", // 7
"PATCH" // 8
};
// HTTP Response Status codes
enum Status {
// 1xx Informational
CONTINUE = 100,
// 2xx Success
OK = 200,
// 3xx Redirection
// 4xx Client Error
BAD_REQUEST = 400,
NOT_FOUND = 404,
// 5xx Server Error
SERVER_ERROR = 500,
NOT_IMPLEMENTED = 501
};
class HTTPMessage : public ByteBuffer {
private:
std::map<std::string, std::string> *headers;
protected:
std::string parseErrorStr;
std::string version;
// Message Body Data (Resource in the case of a response, extra parameters in the case of a request)
byte* data;
unsigned int dataLen;
protected:
virtual void init();
public:
HTTPMessage();
HTTPMessage(std::string sData);
HTTPMessage(byte *pData, unsigned int len);
virtual ~HTTPMessage();
virtual byte* create() = 0;
virtual bool parse() = 0;
// Create helpers
void putLine(std::string str = "", bool crlf_end = true);
void putHeaders();
// Parse helpers
std::string getLine();
std::string getStrElement(char delim = 0x20); // 0x20 = "space"
void parseHeaders();
bool parseBody();
// Header Map manipulation
void addHeader(std::string line);
void addHeader(std::string key, std::string value);
void addHeader(std::string key, int value);
std::string getHeaderValue(std::string key);
std::string getHeaderStr(int index);
int getNumHeaders();
void clearHeaders();
// Getters & Setters
std::string getParseError() {
return parseErrorStr;
}
void setVersion(std::string v) {
version = v;
}
std::string getVersion() {
return version;
}
void setData(byte* d, unsigned int len) {
data = d;
dataLen = len;
}
byte* getData() {
return data;
}
unsigned int getDataLength() {
return dataLen;
}
};
#endif