@@ -37,82 +37,105 @@ namespace httpserver
3737class webserver ;
3838class http_request ;
3939class 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>
4449class 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