summaryrefslogtreecommitdiff
path: root/includes/HttpServer.h
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2011-11-17 18:41:23 -0800
committerPixel <pixel@nobis-crew.org>2011-11-17 18:41:51 -0800
commit1b7a57d7f88cab0a1968e8c886eac3629dc74617 (patch)
tree3d60366ee3caa2ec3061a42abd2a61c78a1fa5d2 /includes/HttpServer.h
parente617d26a9291c69988321a812dc5e1f3578e743b (diff)
HTTP server's first real test, alongside multiple taskmanager threads.
I'm not really sure I fully like the way I'm designing this, but I guess it could be solved with an HTTP/HTML helper class around the Action class. However, the HTTP server awfully need reference counting, so it doesn't go away before all of the workers disappear, which means a bit of a redesign of the Listener template.
Diffstat (limited to 'includes/HttpServer.h')
-rw-r--r--includes/HttpServer.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/includes/HttpServer.h b/includes/HttpServer.h
index 7ae0dc1..2226d23 100644
--- a/includes/HttpServer.h
+++ b/includes/HttpServer.h
@@ -1,7 +1,14 @@
#pragma once
+#include <map>
+#include <list>
+
+#include <Atomic.h>
#include <BString.h>
+#include <BRegex.h>
#include <Exceptions.h>
+#include <Threads.h>
+#include <Handle.h>
namespace Balau {
@@ -9,17 +16,43 @@ class HttpWorker;
class HttpServer {
public:
+
+ typedef std::map<String, String> StringMap;
+ typedef std::map<String, IO<Handle> > FileList;
+
+ class Action {
+ public:
+ Action(Regex & regex, Regex & host = Regexes::any) : m_regex(regex), m_host(host), m_refCount(0) { }
+ ~Action() { Assert(m_refCount == 0); }
+ typedef std::pair<Regex::Captures, Regex::Captures> ActionMatches;
+ ActionMatches matches(const char * uri, const char * host);
+ void unref() { if (Atomic::Prefetch::Decrement(&m_refCount) == 0) delete this; }
+ void ref() { Atomic::Increment(&m_refCount); }
+ void registerMe(HttpServer * server) { server->registerAction(this); }
+ virtual bool Do(HttpServer * server, ActionMatches & m, IO<Handle> out, StringMap & vars, StringMap & headers, FileList & files) = 0;
+ private:
+ Regex m_regex, m_host;
+ volatile int m_refCount;
+ };
+
HttpServer() : m_started(false), m_listenerPtr(NULL), m_port(80) { }
~HttpServer() { if (!m_started) stop(); }
void start();
void stop();
void setPort(int port) { Assert(!m_started); m_port = port; }
void setLocal(const char * local) { Assert(!m_started); m_local = local; }
+ void registerAction(Action * action);
+ void flushAllActions();
+ typedef std::pair<Action *, Action::ActionMatches> ActionFound;
+ ActionFound findAction(const char * uri, const char * host);
private:
bool m_started;
void * m_listenerPtr;
int m_port;
String m_local;
+ typedef std::list<Action *> ActionList;
+ ActionList m_actions;
+ Lock m_actionsLock;
friend class HttpWorker;
};