Skip to content

Commit e9dd2cf

Browse files
author
Sebastiano Merlino
committed
Created mirrors classes to avoid virtuality
1 parent c0d60ee commit e9dd2cf

File tree

6 files changed

+493
-252
lines changed

6 files changed

+493
-252
lines changed

src/http_resource.cpp

Lines changed: 10 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -29,149 +29,16 @@ using namespace std;
2929
namespace httpserver
3030
{
3131
//RESOURCE
32-
http_resource::http_resource()
33-
{
34-
this->allowed_methods[MHD_HTTP_METHOD_GET] = true;
35-
this->allowed_methods[MHD_HTTP_METHOD_POST] = true;
36-
this->allowed_methods[MHD_HTTP_METHOD_PUT] = true;
37-
this->allowed_methods[MHD_HTTP_METHOD_HEAD] = true;
38-
this->allowed_methods[MHD_HTTP_METHOD_DELETE] = true;
39-
this->allowed_methods[MHD_HTTP_METHOD_TRACE] = true;
40-
this->allowed_methods[MHD_HTTP_METHOD_CONNECT] = true;
41-
this->allowed_methods[MHD_HTTP_METHOD_OPTIONS] = true;
42-
#ifdef DEBUG
43-
std::map<std::string, bool>::iterator it;
44-
for(it = allowed_methods.begin(); it != allowed_methods.end(); ++it)
45-
{
46-
std::cout << (*it).first << " -> " << (*it).second << std::endl;
47-
}
48-
#endif //DEBUG
49-
50-
}
51-
52-
http_resource::~http_resource()
53-
{
54-
}
55-
56-
http_response http_resource::render(const http_request& r)
57-
{
58-
return http_string_response("", http_utils::http_ok);
59-
}
60-
61-
void http_resource::render(const http_request& r, http_response** res)
62-
{
63-
route_request(r, res);
64-
}
65-
66-
http_response http_resource::route_request(const http_request& r)
67-
{
68-
string method;
69-
r.get_method(method);
70-
string_utilities::to_upper(method);
71-
if(method == MHD_HTTP_METHOD_GET)
72-
return this->render_GET(r);
73-
else if (method == MHD_HTTP_METHOD_POST)
74-
return this->render_POST(r);
75-
else if (method == MHD_HTTP_METHOD_PUT)
76-
return this->render_PUT(r);
77-
else if (method == MHD_HTTP_METHOD_DELETE)
78-
return this->render_DELETE(r);
79-
else if (method == MHD_HTTP_METHOD_HEAD)
80-
return this->render_HEAD(r);
81-
else if (method == MHD_HTTP_METHOD_TRACE)
82-
return this->render_TRACE(r);
83-
else if (method == MHD_HTTP_METHOD_OPTIONS)
84-
return this->render_OPTIONS(r);
85-
else if (method == MHD_HTTP_METHOD_CONNECT)
86-
return this->render_CONNECT(r);
87-
else
88-
return this->render(r);
89-
}
90-
91-
void http_resource::route_request(const http_request& r, http_response** res)
92-
{
93-
http_response hr(this->route_request(r));
94-
clone_response(hr, res);
95-
}
96-
97-
http_response http_resource::render_GET(const http_request& r)
98-
{
99-
return this->render(r);
100-
}
101-
102-
void http_resource::render_GET(const http_request& r, http_response** res)
103-
{
104-
render(r, res);
105-
}
106-
107-
http_response http_resource::render_POST(const http_request& r)
108-
{
109-
return this->render(r);
110-
}
111-
112-
void http_resource::render_POST(const http_request& r, http_response** res)
113-
{
114-
render(r, res);
115-
}
116-
117-
http_response http_resource::render_PUT(const http_request& r)
118-
{
119-
return this->render(r);
120-
}
121-
122-
void http_resource::render_PUT(const http_request& r, http_response** res)
123-
{
124-
render(r, res);
125-
}
126-
127-
http_response http_resource::render_DELETE(const http_request& r)
128-
{
129-
return this->render(r);
130-
}
131-
132-
void http_resource::render_DELETE(const http_request& r, http_response** res)
133-
{
134-
render(r, res);
135-
}
136-
137-
http_response http_resource::render_HEAD(const http_request& r)
138-
{
139-
return this->render(r);
140-
}
141-
142-
void http_resource::render_HEAD(const http_request& r, http_response** res)
143-
{
144-
render(r, res);
145-
}
146-
147-
http_response http_resource::render_TRACE(const http_request& r)
148-
{
149-
return this->render(r);
150-
}
151-
152-
void http_resource::render_TRACE(const http_request& r, http_response** res)
153-
{
154-
render(r, res);
155-
}
156-
157-
http_response http_resource::render_OPTIONS(const http_request& r)
158-
{
159-
return this->render(r);
160-
}
161-
162-
void http_resource::render_OPTIONS(const http_request& r, http_response** res)
163-
{
164-
render(r, res);
165-
}
166-
167-
http_response http_resource::render_CONNECT(const http_request& r)
168-
{
169-
return this->render(r);
170-
}
171-
172-
void http_resource::render_CONNECT(const http_request& r, http_response** res)
173-
{
174-
render(r, res);
32+
void resource_init(map<string, bool>& allowed_methods)
33+
{
34+
allowed_methods[MHD_HTTP_METHOD_GET] = true;
35+
allowed_methods[MHD_HTTP_METHOD_POST] = true;
36+
allowed_methods[MHD_HTTP_METHOD_PUT] = true;
37+
allowed_methods[MHD_HTTP_METHOD_HEAD] = true;
38+
allowed_methods[MHD_HTTP_METHOD_DELETE] = true;
39+
allowed_methods[MHD_HTTP_METHOD_TRACE] = true;
40+
allowed_methods[MHD_HTTP_METHOD_CONNECT] = true;
41+
allowed_methods[MHD_HTTP_METHOD_OPTIONS] = true;
17542
}
17643

17744
};

src/httpserver/http_endpoint.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class webserver;
3838
namespace details
3939
{
4040

41+
struct http_resource_mirror;
42+
4143
/**
4244
* Exception class throwed when a bad formatted http url is used
4345
**/
@@ -228,6 +230,7 @@ class http_endpoint
228230
**/
229231
bool reg_compiled;
230232
friend class httpserver::webserver;
233+
friend void _register_resource(webserver*, const std::string&, details::http_resource_mirror&, bool);
231234
template<typename, typename> friend struct std::pair;
232235
template<typename> friend struct std::less;
233236
};

src/httpserver/http_resource.hpp

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,82 +37,105 @@ namespace httpserver
3737
class webserver;
3838
class http_request;
3939
class http_response;
40+
typedef void(*render_ptr)(const http_request&, http_response**);
4041

4142
/**
4243
* Class representing a callable http resource.
4344
**/
45+
46+
void resource_init(std::map<std::string, bool>& res);
47+
48+
template<typename CHILD>
4449
class http_resource
4550
{
4651
public:
4752
/**
4853
* Class destructor
4954
**/
50-
virtual ~http_resource();
55+
~http_resource()
56+
{
57+
}
5158
/**
5259
* Method used to answer to a generic request
5360
* @param req Request passed through http
5461
* @return A http_response object
5562
**/
56-
virtual http_response render(const http_request& req);
57-
virtual void render(const http_request& r, http_response** res);
58-
virtual http_response route_request(const http_request& r);
59-
virtual void route_request(const http_request& r, http_response** res);
63+
void render(const http_request& r, http_response** res)
64+
{
65+
static_cast<CHILD*>(this)->render(r, res);
66+
}
6067
/**
6168
* Method used to answer to a GET request
6269
* @param req Request passed through http
6370
* @return A http_response object
6471
**/
65-
virtual http_response render_GET(const http_request& req);
66-
virtual void render_GET(const http_request& req, http_response** res);
72+
void render_GET(const http_request& req, http_response** res)
73+
{
74+
static_cast<CHILD*>(this)->render_GET(req, res);
75+
}
6776
/**
6877
* Method used to answer to a POST request
6978
* @param req Request passed through http
7079
* @return A http_response object
7180
**/
72-
virtual http_response render_POST(const http_request& req);
73-
virtual void render_POST(const http_request& req, http_response** res);
81+
void render_POST(const http_request& req, http_response** res)
82+
{
83+
static_cast<CHILD*>(this)->render_POST(req, res);
84+
}
7485
/**
7586
* Method used to answer to a PUT request
7687
* @param req Request passed through http
7788
* @return A http_response object
7889
**/
79-
virtual http_response render_PUT(const http_request& req);
80-
virtual void render_PUT(const http_request& req, http_response** res);
90+
void render_PUT(const http_request& req, http_response** res)
91+
{
92+
static_cast<CHILD*>(this)->render_PUT(req, res);
93+
}
8194
/**
8295
* Method used to answer to a HEAD request
8396
* @param req Request passed through http
8497
* @return A http_response object
8598
**/
86-
virtual http_response render_HEAD(const http_request& req);
87-
virtual void render_HEAD(const http_request& req, http_response** res);
99+
void render_HEAD(const http_request& req, http_response** res)
100+
{
101+
static_cast<CHILD*>(this)->render_HEAD(req, res);
102+
}
88103
/**
89104
* Method used to answer to a DELETE request
90105
* @param req Request passed through http
91106
* @return A http_response object
92107
**/
93-
virtual http_response render_DELETE(const http_request& req);
94-
virtual void render_DELETE(const http_request& req, http_response** res);
108+
void render_DELETE(const http_request& req, http_response** res)
109+
{
110+
static_cast<CHILD*>(this)->render_DELETE(req, res);
111+
}
95112
/**
96113
* Method used to answer to a TRACE request
97114
* @param req Request passed through http
98115
* @return A http_response object
99116
**/
100-
virtual http_response render_TRACE(const http_request& req);
101-
virtual void render_TRACE(const http_request& req, http_response** res);
117+
void render_TRACE(const http_request& req, http_response** res)
118+
{
119+
static_cast<CHILD*>(this)->render_TRACE(req, res);
120+
}
102121
/**
103122
* Method used to answer to a OPTIONS request
104123
* @param req Request passed through http
105124
* @return A http_response object
106125
**/
107-
virtual http_response render_OPTIONS(const http_request& req);
108-
virtual void render_OPTIONS(const http_request& req, http_response** res);
126+
void render_OPTIONS(const http_request& req, http_response** res)
127+
{
128+
static_cast<CHILD*>(this)->render_OPTIONS(req, res);
129+
}
109130
/**
110131
* Method used to answer to a CONNECT request
111132
* @param req Request passed through http
112133
* @return A http_response object
113134
**/
114-
virtual http_response render_CONNECT(const http_request& req);
115-
virtual void render_CONNECT(const http_request& req, http_response** res);
135+
void render_CONNECT(const http_request& req, http_response** res)
136+
{
137+
static_cast<CHILD*>(this)->render_CONNECT(req, res);
138+
}
116139
/**
117140
* Method used to set if a specific method is allowed or not on this request
118141
* @param method method to set permission on
@@ -170,7 +193,10 @@ class http_resource
170193
/**
171194
* Constructor of the class
172195
**/
173-
http_resource();
196+
http_resource()
197+
{
198+
resource_init(allowed_methods);
199+
}
174200
/**
175201
* Copy constructor
176202
**/
@@ -184,14 +210,8 @@ class http_resource
184210

185211
private:
186212
friend class webserver;
213+
friend void resource_init(std::map<std::string, bool>& res);
187214
std::map<std::string, bool> allowed_methods;
188-
http_resource* method_not_acceptable_resource;
189-
190-
void render_not_acceptable(const http_request& req, http_response** res)
191-
{
192-
if(method_not_acceptable_resource)
193-
method_not_acceptable_resource->render(req, res);
194-
}
195215
};
196216

197217
};

0 commit comments

Comments
 (0)