Skip to content

Commit eea93bd

Browse files
author
Sebastiano Merlino
committed
Moified in order to create the new async version
1 parent 3b1b9c6 commit eea93bd

File tree

5 files changed

+170
-34
lines changed

5 files changed

+170
-34
lines changed

examples/Test.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,24 @@ http_response Test::render_POST(const http_request& r)
5959
cout << vv[i] << endl;
6060
}
6161
return http_string_response("OK",200);*/
62-
http_string_response s("OK",200);
62+
http_string_response s("OK",100);
6363
s.set_header(http_utils::http_header_location, "B");
64+
s.set_cookie("Ciccio", "Puppo");
65+
s.set_cookie("Peppe", "Puppo");
66+
cout << s.get_cookie("Ciccio") << endl;
6467
return s;
6568
// return long_polling_send_response("<script type=\"text/javascript\">alert(\"ciao\")</script>\n", "prova");
6669
}
6770

6871
http_response Test2::render_GET(const http_request& r)
6972
{
7073
cout << "D2" << endl;
74+
typedef std::map<std::string, std::string,
75+
httpserver::http::header_comparator> c_type;
76+
c_type c;
77+
r.get_cookies(c);
78+
for(c_type::const_iterator it = c.begin(); it != c.end(); ++it)
79+
cout << (*it).first << " -> " << (*it).second << endl;
7180
return http_string_response("{\" var1 \" : \" "+r.get_arg("var1")+" \", \" var2 \" : \" "+r.get_arg("var2")+" \", \" var3 \" : \" "+r.get_arg("var3")+" \"}", 200);
7281
}
7382

@@ -79,7 +88,7 @@ http_response Test::render_PUT(const http_request& r)
7988
int main()
8089
{
8190
// signal(SIGINT, &signal_callback_handler);
82-
webserver ws = create_webserver(8080);
91+
webserver ws = create_webserver(8080).start_method(http_utils::INTERNAL_REMANAGED).max_threads(5);
8392
ws_ptr = &ws;
8493
Test dt = Test();
8594
Test2 dt2 = Test2();

src/http_response.cpp

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
1919
*/
2020
#include <cstdio>
21+
#include <functional>
22+
#include <iostream>
23+
#include <sstream>
2124
#include "http_utils.hpp"
2225
#include "webserver.hpp"
2326
#include "http_response.hpp"
2427

25-
#include <iostream>
26-
#include <sstream>
27-
2828
using namespace std;
2929

3030
namespace httpserver
@@ -111,6 +111,11 @@ shoutCAST_response::shoutCAST_response
111111
{
112112
}
113113

114+
ssize_t deferred_response::cycle_callback(const std::string& buf)
115+
{
116+
return -1;
117+
}
118+
114119
void http_response::get_raw_response(MHD_Response** response, webserver* ws)
115120
{
116121
size_t size = &(*content.end()) - &(*content.begin());
@@ -171,6 +176,33 @@ void cache_response::get_raw_response(MHD_Response** response, webserver* ws)
171176
//TODO: Check if element is not in cache and throw exception
172177
}
173178

179+
namespace details
180+
{
181+
182+
ssize_t cb(void* cls, uint64_t pos, char* buf, size_t max)
183+
{
184+
int val = static_cast<deferred_response*>(cls)->cycle_callback(buf);
185+
if(val == -1)
186+
static_cast<deferred_response*>(cls)->completed = true;
187+
return val;
188+
}
189+
190+
}
191+
192+
void deferred_response::get_raw_response(MHD_Response** response, webserver* ws)
193+
{
194+
if(!completed)
195+
*response = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN, 1024, &details::cb, this, NULL);
196+
else
197+
static_cast<http_response*>(this)->get_raw_response(response, ws);
198+
}
199+
200+
void deferred_response::decorate_response(MHD_Response* response)
201+
{
202+
if(completed)
203+
static_cast<http_response*>(this)->decorate_response(response);
204+
}
205+
174206
void long_polling_receive_response::get_raw_response(MHD_Response** response, webserver* ws)
175207
{
176208
#ifdef USE_COMET
@@ -241,6 +273,9 @@ void clone_response(const http_response& hr, http_response** dhrs)
241273
case(http_response::CACHED_CONTENT):
242274
*dhrs = new cache_response(hr);
243275
return;
276+
case(http_response::DEFERRED):
277+
*dhrs = new deferred_response(hr);
278+
return;
244279
}
245280
}
246281

src/httpserver/http_response.hpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ namespace http
4646
namespace details
4747
{
4848
struct http_response_ptr;
49+
ssize_t cb(void*, uint64_t, char*, size_t);
4950
};
5051

5152
using namespace http;
@@ -100,7 +101,8 @@ class http_response
100101
SWITCH_PROTOCOL,
101102
LONG_POLLING_RECEIVE,
102103
LONG_POLLING_SEND,
103-
CACHED_CONTENT
104+
CACHED_CONTENT,
105+
DEFERRED
104106
};
105107

106108
/**
@@ -439,6 +441,7 @@ class http_response
439441
friend struct details::http_response_ptr;
440442
friend void clone_response(const http_response& hr, http_response** dhr);
441443
friend class cache_response;
444+
friend class deferred_response;
442445
};
443446

444447
class http_string_response : public http_response
@@ -642,6 +645,26 @@ class cache_response : public http_response
642645
friend class webserver;
643646
};
644647

648+
class deferred_response : public http_response
649+
{
650+
public:
651+
deferred_response
652+
(
653+
) : http_response(http_response::DEFERRED), completed(false)
654+
{
655+
}
656+
deferred_response(const http_response& b) : http_response(b) { }
657+
~deferred_response() { }
658+
virtual ssize_t cycle_callback(const std::string& buf);
659+
protected:
660+
virtual void get_raw_response(MHD_Response** res, webserver* ws = 0x0);
661+
virtual void decorate_response(MHD_Response* res);
662+
private:
663+
bool completed;
664+
friend class webserver;
665+
friend ssize_t details::cb(void*, uint64_t, char*, size_t);
666+
};
667+
645668
void clone_response(http_response* hr, http_response** dhr);
646669

647670
};

src/httpserver/webserver.hpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ namespace details
6161
{
6262
class http_endpoint;
6363
struct modded_request;
64-
struct cache_manager;
6564
struct daemon_item;
6665
}
6766

@@ -140,18 +139,24 @@ class unescaper
140139
virtual void unescape(char* s) const;
141140
};
142141

143-
/*
144-
class cache_object
142+
class event_supplier
145143
{
146144
public:
147-
enum mode_T { WRITE, READ };
148-
~cache_object();
149-
private:
150-
cache_entry* elem;
151-
mode_T mode;
152-
cache_object(const modeT& mode);
145+
event_supplier();
146+
147+
virtual ~event_supplier();
148+
149+
virtual void supply_events(
150+
fd_set* read_fdset,
151+
fd_set* write_fdset,
152+
fd_set* exc_fdset,
153+
int* max
154+
) const ;
155+
156+
virtual long get_timeout() const;
157+
158+
virtual void dispatch_events() const;
153159
};
154-
*/
155160

156161
class create_webserver;
157162

@@ -284,6 +289,10 @@ class webserver
284289

285290
void set_unescaper(unescaper* unescaper_pointer, bool delete_old = false);
286291

292+
void register_event_supplier(const std::string& id, event_supplier* ev_supplier);
293+
294+
void run();
295+
287296
/**
288297
* Method used to kill the webserver waiting for it to terminate
289298
**/
@@ -322,7 +331,7 @@ class webserver
322331
bool post_process_enabled;
323332
bool single_resource;
324333
pthread_mutex_t mutexwait;
325-
pthread_mutex_t runguard;
334+
pthread_rwlock_t runguard;
326335
pthread_mutex_t cleanmux;
327336
pthread_cond_t mutexcond;
328337
pthread_cond_t cleancond;
@@ -334,6 +343,7 @@ class webserver
334343
std::map<details::http_endpoint, http_resource* > registered_resources;
335344

336345
std::map<std::string, cache_entry*> response_cache;
346+
int next_to_choose;
337347
pthread_rwlock_t cache_guard;
338348
#ifdef USE_CPP_ZEROX
339349
std::unordered_set<ip_representation> bans;
@@ -343,7 +353,6 @@ class webserver
343353
std::set<ip_representation> allowances;
344354
#endif
345355

346-
// std::map<std::string, std::string> q_messages;
347356
std::map<int, std::deque<std::string> > q_messages;
348357
std::map<std::string, std::set<int> > q_waitings;
349358
std::map<int, std::pair<pthread_mutex_t, pthread_cond_t> > q_blocks;
@@ -355,6 +364,8 @@ class webserver
355364
std::vector<details::daemon_item*> daemons;
356365
std::vector<pthread_t> threads;
357366

367+
std::map<std::string, event_supplier*> event_suppliers;
368+
358369
void init(http_resource* single_resource);
359370
static void* select(void* self);
360371
void schedule_fd(int fd, fd_set* schedule_list, int* max);

0 commit comments

Comments
 (0)