14#define HTTPD_MAX_HEADER 8192
19#define HTTPD_ERR_WRITE -1
20#define HTTPD_ERR_FOPEN -2
21#define HTTPD_ERR_FREAD -3
29struct ci_less :
public std::function<bool (std::string, std::string)>
31 bool operator() (
const std::string& lhs,
const std::string& rhs)
const
33 return _stricmp (lhs.c_str (), rhs.c_str ()) < 0;
39typedef std::map<std::string, std::string, ci_less>
str_pairs;
53 void add_ohdr (
const char* hdr,
const char* value);
54 const char*
get_ihdr (
const char* hdr)
const;
55 const char*
get_ohdr (
const char* hdr)
const;
59 const std::string&
get_qparam (
const char* key);
61 const std::string&
get_bparam (
const char* key);
65 void respond (
unsigned int code,
const char* reason = 0);
66 void redirect (
const char* uri,
unsigned int code = 303);
67 void serve404 (
const char* text = 0);
73 void respond_part (
const char* part_type,
const char* bound);
79 void term ()
override;
86 bool parse_headers ();
89 void process_valid_request ();
90 void process_ssi (
const char* request);
92 void serve401 (
const char* realm);
101 std::string part_boundary;
108 bool query_parsed, body_parsed;
115 std::multimap<std::string, user> auth;
122 explicit httpd (
unsigned short port = 0,
unsigned int maxconn = 0);
125 void add_ohdr (
const char* hdr,
const char* value);
128 bool add_user (
const char* realm,
const char* username,
const char* pwd);
129 bool remove_user (
const char* realm,
const char* username);
130 void add_realm (
const char* realm,
const char* uri);
131 void add_var (
const char*
name,
const char* fmt,
void* addr,
double multiplier = 1.);
137 void name (
const char* nam);
138 void docroot (
const char* path);
140 void add_alias (
const char* uri,
const char* path);
142 void default_uri (
const char*
name)
146 const char* default_uri ()
148 return defuri.c_str ();
151 void add_mime_type (
const char* ext,
const char* type,
bool shtml =
false);
154 bool is_protected (
const char* uri, std::string& realm);
155 bool authenticate (
const char* realm,
const char* user,
const char* pwd);
157 friend class http_connection;
161 bool find_alias (
const char* uri,
char* path);
176 std::shared_ptr<mlib::criticalsection> in_use;
178 std::map<std::string, handle_info> handlers;
180 std::map<std::string, std::string> aliases;
188 std::map<std::string, var_info> variables;
196 std::multimap<std::string, user> credentials;
204 std::deque<mimetype> types;
233 return query ? query :
"";
257 return root.c_str ();
278 return varlock.try_enter ();
281inline httpd::handle_info::handle_info (
uri_handler h_,
void* info_)
287void parse_urlparams (
const char* par_str, str_pairs& params);
Lightweight inter-thread synchronization.
Definition critsect.h:25
Representation of a HTTP client connection request.
Definition httpd.h:46
const char * get_method() const
Return HTTP method (GET, POST, etc.)
Definition httpd.h:219
const char * get_ohdr(const char *hdr) const
Returns the value of a response header.
Definition httpd.cpp:1009
const char * get_query() const
Return URI query string (everything after '?' and before '#')
Definition httpd.h:231
const std::string & get_bparam(const char *key)
Return the value of a form parameter or the empty string if the body doesn't have the parameter.
Definition httpd.cpp:500
http_connection(sock &socket, httpd &server)
Protected constructor used by httpd class to create a new connection thread.
Definition httpd.cpp:104
void respond_next(bool last)
Send subsequent parts of a multi-part response.
Definition httpd.cpp:1046
sockstream & out()
Return socket object associated with this connection.
Definition httpd.h:249
int serve_buffer(const BYTE *buffer, size_t sz)
Send the content of a buffer.
Definition httpd.cpp:679
bool has_bparam(const char *key)
Return true if the body contains the given parameter.
Definition httpd.cpp:513
void term() override
Finalization function called after run.
Definition httpd.cpp:250
const char * get_ihdr(const char *hdr) const
Returns the value of a request header.
Definition httpd.cpp:990
const char * get_uri() const
Return URI of this connection.
Definition httpd.h:213
int serve_shtml(const std::string &full_path)
Send the content of a file, processing any SSI directives.
Definition httpd.cpp:533
const char * get_all_ihdr() const
Return all incoming headers.
Definition httpd.h:225
int get_content_length() const
Return request body.
Definition httpd.h:243
void respond(unsigned int code, const char *reason=0)
Send the beginning of HTTP response.
Definition httpd.cpp:902
void run() override
Thread run loop.
Definition httpd.cpp:125
void serve404(const char *text=0)
Sends a 404 (page not found) response.
Definition httpd.cpp:387
bool has_qparam(const char *key)
Return true if the query contains the given parameter.
Definition httpd.cpp:488
int serve_file(const std::string &full_path)
Send the content of a file.
Definition httpd.cpp:737
void respond_part(const char *part_type, const char *bound)
Send first part of a multi-part response.
Definition httpd.cpp:1028
const std::string & get_qparam(const char *key)
Return the value of a query parameter or the empty string if the query doesn't have the parameter.
Definition httpd.cpp:475
void add_ohdr(const char *hdr, const char *value)
Add or modify a response header.
Definition httpd.cpp:854
const char * get_body() const
Return request body.
Definition httpd.h:237
void redirect(const char *uri, unsigned int code=303)
Generate a HTTP redirect response to a new uri.
Definition httpd.cpp:865
void aquire_varlock()
Acquire lock on server's variables.
Definition httpd.h:261
bool is_protected(const char *uri, std::string &realm)
Find the longest match realm that covers an uri.
Definition httpd.cpp:1303
bool add_user(const char *realm, const char *username, const char *pwd)
Add a new user to a relm or modifies password for an existing user.
Definition httpd.cpp:1244
void add_mime_type(const char *ext, const char *type, bool shtml=false)
Add/change content of table matching MIME types to file extensions.
Definition httpd.cpp:1183
const char * guess_mimetype(const char *file, bool &shtml)
Guess MIME type of a file and if SSI replacement should be enabled based on file extension.
Definition httpd.cpp:1487
http_connection * make_thread(sock &connection)
Create an new http_connection object for a new incoming connection.
Definition httpd.cpp:1130
bool authenticate(const char *realm, const char *user, const char *pwd)
Verify user credentials for a realm.
Definition httpd.cpp:1326
int invoke_handler(const char *uri, http_connection &client)
Invoke a user defined URI handler.
Definition httpd.cpp:1349
bool try_varlock()
Try to acquire lock on server's variables.
Definition httpd.h:276
void add_realm(const char *realm, const char *uri)
Add a new access realm.
Definition httpd.cpp:1230
void release_varlock()
Release lock on server's variables.
Definition httpd.h:267
void name(const char *nam)
Change server name.
Definition httpd.cpp:1115
void add_ohdr(const char *hdr, const char *value)
Add or modify a server response header.
Definition httpd.cpp:1143
void add_var(const char *name, const char *fmt, void *addr, double multiplier=1.)
Add or modify a user variable.
Definition httpd.cpp:1420
void remove_ohdr(const char *hdr)
Remove a server response header.
Definition httpd.cpp:1153
void add_handler(const char *uri, uri_handler func, void *info=0)
Add or modify an URI handler function.
Definition httpd.cpp:1171
const char * docroot() const
Return current file origin.
Definition httpd.h:255
httpd(unsigned short port=0, unsigned int maxconn=0)
Constructor.
Definition httpd.cpp:1090
void add_alias(const char *uri, const char *path)
Maps a local file path to a path in the URI space.
Definition httpd.cpp:1369
void delete_mime_type(const char *ext)
Remove a file type from the MIME type table.
Definition httpd.cpp:1209
std::string get_var(const char *name)
Return the current string representation of a variable.
Definition httpd.cpp:1431
~httpd()
Destructor.
Definition httpd.cpp:1106
bool find_alias(const char *uri, char *path)
Retrieve the local file path mapped to an URI.
Definition httpd.cpp:1387
Encapsulation of a Windows socket.
Definition wsockstream.h:27
tcpserver(unsigned short port, const std::string &name=std::string(), unsigned int max_conn=0)
Opens the socket and initializes the connections table.
Definition tcpserver.cpp:70
void maxconn(unsigned int new_max)
Set maximum number of connections accepted.
Definition tcpserver.cpp:386
thread(std::function< unsigned int()> func)
Make a thread with the given function body.
Definition thread.cpp:71
virtual void name(const std::string &nam)
Set thread's name.
Definition thread.cpp:160
virtual const std::string & name() const
Return object's name.
Definition syncbase.h:60
#define HTTPD_MAX_HEADER
Maximum size of HTTP header.
Definition httpd.h:14
int(* uri_handler)(const char *uri, http_connection &client, void *info)
User defined URL handler function.
Definition httpd.h:42
std::map< std::string, std::string, ci_less > str_pairs
Definition httpd.h:39
Case insensitive comparison function.
Definition httpd.h:30
Definition of tcpserver class.
generic_sockstream< std::iostream > sockstream
Bidirectional socket stream.
Definition wsockstream.h:261