mirror of
https://github.com/lammertb/libhttp.git
synced 2025-09-03 01:21:16 +03:00
Autoformat all source files using clang-format
This commit is contained in:
@@ -20,25 +20,21 @@ class CivetServer;
|
|||||||
/**
|
/**
|
||||||
* Exception class for thrown exceptions within the CivetHandler object.
|
* Exception class for thrown exceptions within the CivetHandler object.
|
||||||
*/
|
*/
|
||||||
class CIVETWEB_API CivetException : public std::runtime_error
|
class CIVETWEB_API CivetException : public std::runtime_error {
|
||||||
{
|
public:
|
||||||
public:
|
CivetException(const std::string &msg) : std::runtime_error(msg) {}
|
||||||
CivetException(const std::string& msg) : std::runtime_error(msg) {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic interface for a URI request handler. Handlers implementations
|
* Basic interface for a URI request handler. Handlers implementations
|
||||||
* must be reentrant.
|
* must be reentrant.
|
||||||
*/
|
*/
|
||||||
class CIVETWEB_API CivetHandler
|
class CIVETWEB_API CivetHandler {
|
||||||
{
|
public:
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
virtual ~CivetHandler() {
|
virtual ~CivetHandler() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback method for GET request.
|
* Callback method for GET request.
|
||||||
@@ -91,10 +87,8 @@ public:
|
|||||||
*
|
*
|
||||||
* Basic class for embedded web server. This has an URL mapping built-in.
|
* Basic class for embedded web server. This has an URL mapping built-in.
|
||||||
*/
|
*/
|
||||||
class CIVETWEB_API CivetServer
|
class CIVETWEB_API CivetServer {
|
||||||
{
|
public:
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
@@ -126,9 +120,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return the context or 0 if not running.
|
* @return the context or 0 if not running.
|
||||||
*/
|
*/
|
||||||
const struct mg_context *getContext() const {
|
const struct mg_context *getContext() const { return context; }
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* addHandler(const std::string &, CivetHandler *)
|
* addHandler(const std::string &, CivetHandler *)
|
||||||
@@ -167,16 +159,20 @@ public:
|
|||||||
std::vector<int> getListeningPorts();
|
std::vector<int> getListeningPorts();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getCookie(struct mg_connection *conn, const std::string &cookieName, std::string &cookieValue)
|
* getCookie(struct mg_connection *conn, const std::string &cookieName,
|
||||||
|
*std::string &cookieValue)
|
||||||
*
|
*
|
||||||
* Puts the cookie value string that matches the cookie name in the cookieValue destinaton string.
|
* Puts the cookie value string that matches the cookie name in the
|
||||||
|
*cookieValue destinaton string.
|
||||||
*
|
*
|
||||||
* @param conn - the connection information
|
* @param conn - the connection information
|
||||||
* @param cookieName - cookie name to get the value from
|
* @param cookieName - cookie name to get the value from
|
||||||
* @param cookieValue - cookie value is returned using thiis reference
|
* @param cookieValue - cookie value is returned using thiis reference
|
||||||
* @returns the size of the cookie value string read.
|
* @returns the size of the cookie value string read.
|
||||||
*/
|
*/
|
||||||
static int getCookie(struct mg_connection *conn, const std::string &cookieName, std::string &cookieValue);
|
static int getCookie(struct mg_connection *conn,
|
||||||
|
const std::string &cookieName,
|
||||||
|
std::string &cookieValue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getHeader(struct mg_connection *conn, const std::string &headerName)
|
* getHeader(struct mg_connection *conn, const std::string &headerName)
|
||||||
@@ -184,28 +180,34 @@ public:
|
|||||||
* @param headerName - header name to get the value from
|
* @param headerName - header name to get the value from
|
||||||
* @returns a char array whcih contains the header value as string
|
* @returns a char array whcih contains the header value as string
|
||||||
*/
|
*/
|
||||||
static const char* getHeader(struct mg_connection *conn, const std::string &headerName);
|
static const char *getHeader(struct mg_connection *conn,
|
||||||
|
const std::string &headerName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getParam(struct mg_connection *conn, const char *, std::string &, size_t)
|
* getParam(struct mg_connection *conn, const char *, std::string &, size_t)
|
||||||
*
|
*
|
||||||
* Returns a query paramter contained in the supplied buffer. The
|
* Returns a query paramter contained in the supplied buffer. The
|
||||||
* occurance value is a zero-based index of a particular key name. This
|
* occurance value is a zero-based index of a particular key name. This
|
||||||
* should not be confused with the index over all of the keys. Note that this
|
* should not be confused with the index over all of the keys. Note that
|
||||||
|
*this
|
||||||
* function assumes that parameters are sent as text in http query string
|
* function assumes that parameters are sent as text in http query string
|
||||||
* format, which is the default for web forms. This function will work for
|
* format, which is the default for web forms. This function will work for
|
||||||
* html forms with method="GET" and method="POST" attributes. In other cases,
|
* html forms with method="GET" and method="POST" attributes. In other
|
||||||
* you may use a getParam version that directly takes the data instead of the
|
*cases,
|
||||||
|
* you may use a getParam version that directly takes the data instead of
|
||||||
|
*the
|
||||||
* connection as a first argument.
|
* connection as a first argument.
|
||||||
*
|
*
|
||||||
* @param conn - parameters are read from the data sent through this connection
|
* @param conn - parameters are read from the data sent through this
|
||||||
|
*connection
|
||||||
* @param name - the key to search for
|
* @param name - the key to search for
|
||||||
* @param dst - the destination string
|
* @param dst - the destination string
|
||||||
* @param occurrence - the occurrence of the selected name in the query (0 based).
|
* @param occurrence - the occurrence of the selected name in the query (0
|
||||||
|
*based).
|
||||||
* @return true if key was found
|
* @return true if key was found
|
||||||
*/
|
*/
|
||||||
static bool getParam(struct mg_connection *conn, const char *name,
|
static bool getParam(struct mg_connection *conn, const char *name,
|
||||||
std::string &dst, size_t occurrence=0);
|
std::string &dst, size_t occurrence = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getParam(const std::string &, const char *, std::string &, size_t)
|
* getParam(const std::string &, const char *, std::string &, size_t)
|
||||||
@@ -217,11 +219,12 @@ public:
|
|||||||
* @param data - the query string (text)
|
* @param data - the query string (text)
|
||||||
* @param name - the key to search for
|
* @param name - the key to search for
|
||||||
* @param dst - the destination string
|
* @param dst - the destination string
|
||||||
* @param occurrence - the occurrence of the selected name in the query (0 based).
|
* @param occurrence - the occurrence of the selected name in the query (0
|
||||||
|
*based).
|
||||||
* @return true if key was found
|
* @return true if key was found
|
||||||
*/
|
*/
|
||||||
static bool getParam(const std::string &data, const char *name,
|
static bool getParam(const std::string &data, const char *name,
|
||||||
std::string &dst, size_t occurrence=0) {
|
std::string &dst, size_t occurrence = 0) {
|
||||||
return getParam(data.c_str(), data.length(), name, dst, occurrence);
|
return getParam(data.c_str(), data.length(), name, dst, occurrence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,12 +239,12 @@ public:
|
|||||||
* @param data_len - length of the query string
|
* @param data_len - length of the query string
|
||||||
* @param name - the key to search for
|
* @param name - the key to search for
|
||||||
* @param dst - the destination string
|
* @param dst - the destination string
|
||||||
* @param occurrence - the occurrence of the selected name in the query (0 based).
|
* @param occurrence - the occurrence of the selected name in the query (0
|
||||||
|
*based).
|
||||||
* @return true if key was found
|
* @return true if key was found
|
||||||
*/
|
*/
|
||||||
static bool getParam(const char *data, size_t data_len, const char *name,
|
static bool getParam(const char *data, size_t data_len, const char *name,
|
||||||
std::string &dst, size_t occurrence=0);
|
std::string &dst, size_t occurrence = 0);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* urlDecode(const std::string &, std::string &, bool)
|
* urlDecode(const std::string &, std::string &, bool)
|
||||||
@@ -253,7 +256,8 @@ public:
|
|||||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||||
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
||||||
*/
|
*/
|
||||||
static void urlDecode(const std::string &src, std::string &dst, bool is_form_url_encoded=true) {
|
static void urlDecode(const std::string &src, std::string &dst,
|
||||||
|
bool is_form_url_encoded = true) {
|
||||||
urlDecode(src.c_str(), src.length(), dst, is_form_url_encoded);
|
urlDecode(src.c_str(), src.length(), dst, is_form_url_encoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +272,8 @@ public:
|
|||||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||||
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
||||||
*/
|
*/
|
||||||
static void urlDecode(const char *src, size_t src_len, std::string &dst, bool is_form_url_encoded=true);
|
static void urlDecode(const char *src, size_t src_len, std::string &dst,
|
||||||
|
bool is_form_url_encoded = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* urlDecode(const char *, std::string &, bool)
|
* urlDecode(const char *, std::string &, bool)
|
||||||
@@ -280,7 +285,8 @@ public:
|
|||||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||||
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
* http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
|
||||||
*/
|
*/
|
||||||
static void urlDecode(const char *src, std::string &dst, bool is_form_url_encoded=true);
|
static void urlDecode(const char *src, std::string &dst,
|
||||||
|
bool is_form_url_encoded = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* urlEncode(const std::string &, std::string &, bool)
|
* urlEncode(const std::string &, std::string &, bool)
|
||||||
@@ -289,7 +295,8 @@ public:
|
|||||||
* @param dst - destination string
|
* @param dst - destination string
|
||||||
* @param append - true if string should not be cleared before encoding.
|
* @param append - true if string should not be cleared before encoding.
|
||||||
*/
|
*/
|
||||||
static void urlEncode(const std::string &src, std::string &dst, bool append=false) {
|
static void urlEncode(const std::string &src, std::string &dst,
|
||||||
|
bool append = false) {
|
||||||
urlEncode(src.c_str(), src.length(), dst, append);
|
urlEncode(src.c_str(), src.length(), dst, append);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,7 +307,8 @@ public:
|
|||||||
* @param dst - destination string
|
* @param dst - destination string
|
||||||
* @param append - true if string should not be cleared before encoding.
|
* @param append - true if string should not be cleared before encoding.
|
||||||
*/
|
*/
|
||||||
static void urlEncode(const char *src, std::string &dst, bool append=false);
|
static void urlEncode(const char *src, std::string &dst,
|
||||||
|
bool append = false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* urlEncode(const char *, size_t, std::string &, bool)
|
* urlEncode(const char *, size_t, std::string &, bool)
|
||||||
@@ -310,12 +318,13 @@ public:
|
|||||||
* @param dst - destination string
|
* @param dst - destination string
|
||||||
* @param append - true if string should not be cleared before encoding.
|
* @param append - true if string should not be cleared before encoding.
|
||||||
*/
|
*/
|
||||||
static void urlEncode(const char *src, size_t src_len, std::string &dst, bool append=false);
|
static void urlEncode(const char *src, size_t src_len, std::string &dst,
|
||||||
|
bool append = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
class CivetConnection {
|
class CivetConnection {
|
||||||
public:
|
public:
|
||||||
char * postData;
|
char *postData;
|
||||||
unsigned long postDataLen;
|
unsigned long postDataLen;
|
||||||
|
|
||||||
CivetConnection();
|
CivetConnection();
|
||||||
@@ -325,7 +334,7 @@ protected:
|
|||||||
struct mg_context *context;
|
struct mg_context *context;
|
||||||
std::map<struct mg_connection *, class CivetConnection> connections;
|
std::map<struct mg_connection *, class CivetConnection> connections;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* requestHandler(struct mg_connection *, void *cbdata)
|
* requestHandler(struct mg_connection *, void *cbdata)
|
||||||
*
|
*
|
||||||
@@ -350,7 +359,6 @@ private:
|
|||||||
* Stores the user provided close handler
|
* Stores the user provided close handler
|
||||||
*/
|
*/
|
||||||
void (*userCloseHandler)(const struct mg_connection *conn);
|
void (*userCloseHandler)(const struct mg_connection *conn);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
@@ -26,17 +26,17 @@
|
|||||||
#define CIVETWEB_VERSION "1.7"
|
#define CIVETWEB_VERSION "1.7"
|
||||||
|
|
||||||
#ifndef CIVETWEB_API
|
#ifndef CIVETWEB_API
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#if defined(CIVETWEB_DLL_EXPORTS)
|
#if defined(CIVETWEB_DLL_EXPORTS)
|
||||||
#define CIVETWEB_API __declspec(dllexport)
|
#define CIVETWEB_API __declspec(dllexport)
|
||||||
#elif defined(CIVETWEB_DLL_IMPORTS)
|
#elif defined(CIVETWEB_DLL_IMPORTS)
|
||||||
#define CIVETWEB_API __declspec(dllimport)
|
#define CIVETWEB_API __declspec(dllimport)
|
||||||
#else
|
#else
|
||||||
#define CIVETWEB_API
|
#define CIVETWEB_API
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define CIVETWEB_API
|
#define CIVETWEB_API
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -46,9 +46,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
struct mg_context; /* Handle for the HTTP service itself */
|
struct mg_context; /* Handle for the HTTP service itself */
|
||||||
struct mg_connection; /* Handle for the individual connection */
|
struct mg_connection; /* Handle for the individual connection */
|
||||||
|
|
||||||
|
|
||||||
/* This structure contains information about the HTTP request. */
|
/* This structure contains information about the HTTP request. */
|
||||||
struct mg_request_info {
|
struct mg_request_info {
|
||||||
@@ -60,23 +59,24 @@ struct mg_request_info {
|
|||||||
const char *remote_user; /* Authenticated user, or NULL if no auth
|
const char *remote_user; /* Authenticated user, or NULL if no auth
|
||||||
used */
|
used */
|
||||||
char remote_addr[48]; /* Client's IP address as a string. */
|
char remote_addr[48]; /* Client's IP address as a string. */
|
||||||
long remote_ip; /* Client's IP address. Deprecated: use remote_addr instead */
|
long
|
||||||
|
remote_ip; /* Client's IP address. Deprecated: use remote_addr instead
|
||||||
|
*/
|
||||||
|
|
||||||
long long content_length; /* Length (in bytes) of the request body,
|
long long content_length; /* Length (in bytes) of the request body,
|
||||||
can be -1 if no length was given. */
|
can be -1 if no length was given. */
|
||||||
int remote_port; /* Client's port */
|
int remote_port; /* Client's port */
|
||||||
int is_ssl; /* 1 if SSL-ed, 0 if not */
|
int is_ssl; /* 1 if SSL-ed, 0 if not */
|
||||||
void *user_data; /* User data pointer passed to mg_start() */
|
void *user_data; /* User data pointer passed to mg_start() */
|
||||||
void *conn_data; /* Connection-specific user data */
|
void *conn_data; /* Connection-specific user data */
|
||||||
|
|
||||||
int num_headers; /* Number of HTTP headers */
|
int num_headers; /* Number of HTTP headers */
|
||||||
struct mg_header {
|
struct mg_header {
|
||||||
const char *name; /* HTTP header name */
|
const char *name; /* HTTP header name */
|
||||||
const char *value; /* HTTP header value */
|
const char *value; /* HTTP header value */
|
||||||
} http_headers[64]; /* Maximum 64 headers */
|
} http_headers[64]; /* Maximum 64 headers */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* This structure needs to be passed to mg_start(), to let civetweb know
|
/* This structure needs to be passed to mg_start(), to let civetweb know
|
||||||
which callbacks to invoke. For a detailed description, see
|
which callbacks to invoke. For a detailed description, see
|
||||||
https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md */
|
https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md */
|
||||||
@@ -93,18 +93,18 @@ struct mg_callbacks {
|
|||||||
the callback must not send any data to the client.
|
the callback must not send any data to the client.
|
||||||
1: callback already processed the request. Civetweb will
|
1: callback already processed the request. Civetweb will
|
||||||
not send any data after the callback returned. */
|
not send any data after the callback returned. */
|
||||||
int (*begin_request)(struct mg_connection *);
|
int (*begin_request)(struct mg_connection *);
|
||||||
|
|
||||||
/* Called when civetweb has finished processing request. */
|
/* Called when civetweb has finished processing request. */
|
||||||
void (*end_request)(const struct mg_connection *, int reply_status_code);
|
void (*end_request)(const struct mg_connection *, int reply_status_code);
|
||||||
|
|
||||||
/* Called when civetweb is about to log a message. If callback returns
|
/* Called when civetweb is about to log a message. If callback returns
|
||||||
non-zero, civetweb does not log anything. */
|
non-zero, civetweb does not log anything. */
|
||||||
int (*log_message)(const struct mg_connection *, const char *message);
|
int (*log_message)(const struct mg_connection *, const char *message);
|
||||||
|
|
||||||
/* Called when civetweb is about to log access. If callback returns
|
/* Called when civetweb is about to log access. If callback returns
|
||||||
non-zero, civetweb does not log anything. */
|
non-zero, civetweb does not log anything. */
|
||||||
int (*log_access)(const struct mg_connection *, const char *message);
|
int (*log_access)(const struct mg_connection *, const char *message);
|
||||||
|
|
||||||
/* Called when civetweb initializes SSL library.
|
/* Called when civetweb initializes SSL library.
|
||||||
Parameters:
|
Parameters:
|
||||||
@@ -113,7 +113,7 @@ struct mg_callbacks {
|
|||||||
0: civetweb will set up the SSL certificate.
|
0: civetweb will set up the SSL certificate.
|
||||||
1: civetweb assumes the callback already set up the certificate.
|
1: civetweb assumes the callback already set up the certificate.
|
||||||
-1: initializing ssl fails. */
|
-1: initializing ssl fails. */
|
||||||
int (*init_ssl)(void *ssl_context, void *user_data);
|
int (*init_ssl)(void *ssl_context, void *user_data);
|
||||||
|
|
||||||
/* Called when websocket request is received, before websocket handshake.
|
/* Called when websocket request is received, before websocket handshake.
|
||||||
Return value:
|
Return value:
|
||||||
@@ -136,8 +136,8 @@ struct mg_callbacks {
|
|||||||
1: keep this websocket connection open.
|
1: keep this websocket connection open.
|
||||||
0: close this websocket connection.
|
0: close this websocket connection.
|
||||||
This callback is deprecated, use mg_set_websocket_handler instead. */
|
This callback is deprecated, use mg_set_websocket_handler instead. */
|
||||||
int (*websocket_data)(struct mg_connection *, int bits,
|
int (*websocket_data)(struct mg_connection *, int bits, char *data,
|
||||||
char *data, size_t data_len);
|
size_t data_len);
|
||||||
|
|
||||||
/* Called when civetweb is closing a connection. The per-context mutex is
|
/* Called when civetweb is closing a connection. The per-context mutex is
|
||||||
locked when this is invoked. This is primarily useful for noting when
|
locked when this is invoked. This is primarily useful for noting when
|
||||||
@@ -157,8 +157,8 @@ struct mg_callbacks {
|
|||||||
NULL: do not serve file from memory, proceed with normal file open.
|
NULL: do not serve file from memory, proceed with normal file open.
|
||||||
non-NULL: pointer to the file contents in memory. data_len must be
|
non-NULL: pointer to the file contents in memory. data_len must be
|
||||||
initilized with the size of the memory block. */
|
initilized with the size of the memory block. */
|
||||||
const char * (*open_file)(const struct mg_connection *,
|
const char *(*open_file)(const struct mg_connection *, const char *path,
|
||||||
const char *path, size_t *data_len);
|
size_t *data_len);
|
||||||
|
|
||||||
/* Called when civetweb is about to serve Lua server page, if
|
/* Called when civetweb is about to serve Lua server page, if
|
||||||
Lua support is enabled.
|
Lua support is enabled.
|
||||||
@@ -179,21 +179,20 @@ struct mg_callbacks {
|
|||||||
Return value:
|
Return value:
|
||||||
1: run civetweb error handler.
|
1: run civetweb error handler.
|
||||||
0: callback already handled the error. */
|
0: callback already handled the error. */
|
||||||
int (*http_error)(struct mg_connection *, int status);
|
int (*http_error)(struct mg_connection *, int status);
|
||||||
|
|
||||||
/* Called after civetweb context has been created, before requests
|
/* Called after civetweb context has been created, before requests
|
||||||
are processed.
|
are processed.
|
||||||
Parameters:
|
Parameters:
|
||||||
ctx: context handle */
|
ctx: context handle */
|
||||||
void (*init_context)(const struct mg_context * ctx);
|
void (*init_context)(const struct mg_context *ctx);
|
||||||
|
|
||||||
/* Called when civetweb context is deleted.
|
/* Called when civetweb context is deleted.
|
||||||
Parameters:
|
Parameters:
|
||||||
ctx: context handle */
|
ctx: context handle */
|
||||||
void (*exit_context)(const struct mg_context * ctx);
|
void (*exit_context)(const struct mg_context *ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Start web server.
|
/* Start web server.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
@@ -220,9 +219,8 @@ struct mg_callbacks {
|
|||||||
Return:
|
Return:
|
||||||
web server context, or NULL on error. */
|
web server context, or NULL on error. */
|
||||||
CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
||||||
void *user_data,
|
void *user_data,
|
||||||
const char **configuration_options);
|
const char **configuration_options);
|
||||||
|
|
||||||
|
|
||||||
/* Stop the web server.
|
/* Stop the web server.
|
||||||
|
|
||||||
@@ -231,7 +229,6 @@ CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
|||||||
threads are stopped. Context pointer becomes invalid. */
|
threads are stopped. Context pointer becomes invalid. */
|
||||||
CIVETWEB_API void mg_stop(struct mg_context *);
|
CIVETWEB_API void mg_stop(struct mg_context *);
|
||||||
|
|
||||||
|
|
||||||
/* mg_request_handler
|
/* mg_request_handler
|
||||||
|
|
||||||
Called when a new request comes in. This callback is URI based
|
Called when a new request comes in. This callback is URI based
|
||||||
@@ -243,8 +240,7 @@ CIVETWEB_API void mg_stop(struct mg_context *);
|
|||||||
Returns:
|
Returns:
|
||||||
0: the handler could not handle the request, so fall through.
|
0: the handler could not handle the request, so fall through.
|
||||||
1: the handler processed the request. */
|
1: the handler processed the request. */
|
||||||
typedef int (* mg_request_handler)(struct mg_connection *conn, void *cbdata);
|
typedef int (*mg_request_handler)(struct mg_connection *conn, void *cbdata);
|
||||||
|
|
||||||
|
|
||||||
/* mg_set_request_handler
|
/* mg_set_request_handler
|
||||||
|
|
||||||
@@ -261,11 +257,16 @@ typedef int (* mg_request_handler)(struct mg_connection *conn, void *cbdata);
|
|||||||
ctx: server context
|
ctx: server context
|
||||||
uri: the URI (exact or pattern) for the handler
|
uri: the URI (exact or pattern) for the handler
|
||||||
handler: the callback handler to use when the URI is requested.
|
handler: the callback handler to use when the URI is requested.
|
||||||
If NULL, an already registered handler for this URI will be removed.
|
If NULL, an already registered handler for this URI will be
|
||||||
The URI used to remove a handler must match exactly the one used to
|
removed.
|
||||||
|
The URI used to remove a handler must match exactly the one used
|
||||||
|
to
|
||||||
register it (not only a pattern match).
|
register it (not only a pattern match).
|
||||||
cbdata: the callback data to give to the handler when it is called. */
|
cbdata: the callback data to give to the handler when it is called. */
|
||||||
CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, const char *uri, mg_request_handler handler, void *cbdata);
|
CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx,
|
||||||
|
const char *uri,
|
||||||
|
mg_request_handler handler,
|
||||||
|
void *cbdata);
|
||||||
|
|
||||||
/* Callback types for websocket handlers in C/C++.
|
/* Callback types for websocket handlers in C/C++.
|
||||||
|
|
||||||
@@ -292,23 +293,25 @@ CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, const char *uri
|
|||||||
|
|
||||||
mg_connection_close_handler
|
mg_connection_close_handler
|
||||||
Is called, when the connection is closed.*/
|
Is called, when the connection is closed.*/
|
||||||
typedef int (*mg_websocket_connect_handler)(const struct mg_connection *, void *);
|
typedef int (*mg_websocket_connect_handler)(const struct mg_connection *,
|
||||||
|
void *);
|
||||||
typedef void (*mg_websocket_ready_handler)(struct mg_connection *, void *);
|
typedef void (*mg_websocket_ready_handler)(struct mg_connection *, void *);
|
||||||
typedef int (*mg_websocket_data_handler)(struct mg_connection *, int, char *, size_t, void *);
|
typedef int (*mg_websocket_data_handler)(struct mg_connection *, int, char *,
|
||||||
typedef void (*mg_websocket_close_handler)(const struct mg_connection *, void *);
|
size_t, void *);
|
||||||
|
typedef void (*mg_websocket_close_handler)(const struct mg_connection *,
|
||||||
|
void *);
|
||||||
|
|
||||||
/* mg_set_websocket_handler
|
/* mg_set_websocket_handler
|
||||||
|
|
||||||
Set or remove handler functions for websocket connections.
|
Set or remove handler functions for websocket connections.
|
||||||
This function works similar to mg_set_request_handler - see there. */
|
This function works similar to mg_set_request_handler - see there. */
|
||||||
CIVETWEB_API void mg_set_websocket_handler(struct mg_context *ctx,
|
CIVETWEB_API void
|
||||||
const char *uri,
|
mg_set_websocket_handler(struct mg_context *ctx, const char *uri,
|
||||||
mg_websocket_connect_handler connect_handler,
|
mg_websocket_connect_handler connect_handler,
|
||||||
mg_websocket_ready_handler ready_handler,
|
mg_websocket_ready_handler ready_handler,
|
||||||
mg_websocket_data_handler data_handler,
|
mg_websocket_data_handler data_handler,
|
||||||
mg_websocket_close_handler close_handler,
|
mg_websocket_close_handler close_handler,
|
||||||
void *cbdata
|
void *cbdata);
|
||||||
);
|
|
||||||
|
|
||||||
/* Get the value of particular configuration parameter.
|
/* Get the value of particular configuration parameter.
|
||||||
The value returned is read-only. Civetweb does not allow changing
|
The value returned is read-only. Civetweb does not allow changing
|
||||||
@@ -316,24 +319,23 @@ CIVETWEB_API void mg_set_websocket_handler(struct mg_context *ctx,
|
|||||||
If given parameter name is not valid, NULL is returned. For valid
|
If given parameter name is not valid, NULL is returned. For valid
|
||||||
names, return value is guaranteed to be non-NULL. If parameter is not
|
names, return value is guaranteed to be non-NULL. If parameter is not
|
||||||
set, zero-length string is returned. */
|
set, zero-length string is returned. */
|
||||||
CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx, const char *name);
|
CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
/* Get context from connection. */
|
/* Get context from connection. */
|
||||||
CIVETWEB_API struct mg_context *mg_get_context(const struct mg_connection *conn);
|
CIVETWEB_API struct mg_context *
|
||||||
|
mg_get_context(const struct mg_connection *conn);
|
||||||
|
|
||||||
/* Get user data passed to mg_start from context. */
|
/* Get user data passed to mg_start from context. */
|
||||||
CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx);
|
CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx);
|
||||||
|
|
||||||
|
|
||||||
/* Set user data for the current connection. */
|
/* Set user data for the current connection. */
|
||||||
CIVETWEB_API void mg_set_user_connection_data(const struct mg_connection *conn, void *data);
|
CIVETWEB_API void mg_set_user_connection_data(const struct mg_connection *conn,
|
||||||
|
void *data);
|
||||||
|
|
||||||
/* Get user data set for the current connection. */
|
/* Get user data set for the current connection. */
|
||||||
CIVETWEB_API void *mg_get_user_connection_data(const struct mg_connection *conn);
|
CIVETWEB_API void *
|
||||||
|
mg_get_user_connection_data(const struct mg_connection *conn);
|
||||||
|
|
||||||
#if defined(MG_LEGACY_INTERFACE)
|
#if defined(MG_LEGACY_INTERFACE)
|
||||||
/* Return array of strings that represent valid configuration options.
|
/* Return array of strings that represent valid configuration options.
|
||||||
@@ -344,11 +346,10 @@ CIVETWEB_API void *mg_get_user_connection_data(const struct mg_connection *conn)
|
|||||||
CIVETWEB_API const char **mg_get_valid_option_names(void);
|
CIVETWEB_API const char **mg_get_valid_option_names(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct mg_option {
|
struct mg_option {
|
||||||
const char * name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
const char * default_value;
|
const char *default_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -361,13 +362,11 @@ enum {
|
|||||||
CONFIG_TYPE_EXT_PATTERN = 0x6
|
CONFIG_TYPE_EXT_PATTERN = 0x6
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Return array of struct mg_option, representing all valid configuration
|
/* Return array of struct mg_option, representing all valid configuration
|
||||||
options of civetweb.c.
|
options of civetweb.c.
|
||||||
The array is terminated by a NULL name option. */
|
The array is terminated by a NULL name option. */
|
||||||
CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
|
CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
|
||||||
|
|
||||||
|
|
||||||
/* Get the list of ports that civetweb is listening on.
|
/* Get the list of ports that civetweb is listening on.
|
||||||
size is the size of the ports int array and ssl int array to fill.
|
size is the size of the ports int array and ssl int array to fill.
|
||||||
It is the caller's responsibility to make sure ports and ssl each
|
It is the caller's responsibility to make sure ports and ssl each
|
||||||
@@ -375,8 +374,8 @@ CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
|
|||||||
Return value is the number of ports and ssl information filled in.
|
Return value is the number of ports and ssl information filled in.
|
||||||
The value returned is read-only. Civetweb does not allow changing
|
The value returned is read-only. Civetweb does not allow changing
|
||||||
configuration at run time. */
|
configuration at run time. */
|
||||||
CIVETWEB_API size_t mg_get_ports(const struct mg_context *ctx, size_t size, int* ports, int* ssl);
|
CIVETWEB_API size_t
|
||||||
|
mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl);
|
||||||
|
|
||||||
/* Add, edit or delete the entry in the passwords file.
|
/* Add, edit or delete the entry in the passwords file.
|
||||||
|
|
||||||
@@ -391,14 +390,12 @@ CIVETWEB_API size_t mg_get_ports(const struct mg_context *ctx, size_t size, int*
|
|||||||
Return:
|
Return:
|
||||||
1 on success, 0 on error. */
|
1 on success, 0 on error. */
|
||||||
CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name,
|
CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name,
|
||||||
const char *domain,
|
const char *domain, const char *user,
|
||||||
const char *user,
|
|
||||||
const char *password);
|
const char *password);
|
||||||
|
|
||||||
|
|
||||||
/* Return information associated with the request. */
|
/* Return information associated with the request. */
|
||||||
CIVETWEB_API const struct mg_request_info *mg_get_request_info(const struct mg_connection *);
|
CIVETWEB_API const struct mg_request_info *
|
||||||
|
mg_get_request_info(const struct mg_connection *);
|
||||||
|
|
||||||
/* Send data to the client.
|
/* Send data to the client.
|
||||||
Return:
|
Return:
|
||||||
@@ -407,7 +404,6 @@ CIVETWEB_API const struct mg_request_info *mg_get_request_info(const struct mg_c
|
|||||||
>0 number of bytes written on success */
|
>0 number of bytes written on success */
|
||||||
CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
|
CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
|
||||||
|
|
||||||
|
|
||||||
/* Send data to a websocket client wrapped in a websocket frame. Uses
|
/* Send data to a websocket client wrapped in a websocket frame. Uses
|
||||||
mg_lock_connection to ensure that the transmission is not interrupted,
|
mg_lock_connection to ensure that the transmission is not interrupted,
|
||||||
i.e., when the application is proactively communicating and responding to
|
i.e., when the application is proactively communicating and responding to
|
||||||
@@ -420,17 +416,16 @@ CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
|
|||||||
0 when the connection has been closed
|
0 when the connection has been closed
|
||||||
-1 on error
|
-1 on error
|
||||||
>0 number of bytes written on success */
|
>0 number of bytes written on success */
|
||||||
CIVETWEB_API int mg_websocket_write(struct mg_connection* conn, int opcode,
|
CIVETWEB_API int mg_websocket_write(struct mg_connection *conn, int opcode,
|
||||||
const char *data, size_t data_len);
|
const char *data, size_t data_len);
|
||||||
|
|
||||||
|
|
||||||
/* Blocks until unique access is obtained to this connection. Intended for use
|
/* Blocks until unique access is obtained to this connection. Intended for use
|
||||||
with websockets only.
|
with websockets only.
|
||||||
Invoke this before mg_write or mg_printf when communicating with a
|
Invoke this before mg_write or mg_printf when communicating with a
|
||||||
websocket if your code has server-initiated communication as well as
|
websocket if your code has server-initiated communication as well as
|
||||||
communication in direct response to a message. */
|
communication in direct response to a message. */
|
||||||
CIVETWEB_API void mg_lock_connection(struct mg_connection* conn);
|
CIVETWEB_API void mg_lock_connection(struct mg_connection *conn);
|
||||||
CIVETWEB_API void mg_unlock_connection(struct mg_connection* conn);
|
CIVETWEB_API void mg_unlock_connection(struct mg_connection *conn);
|
||||||
|
|
||||||
#if defined(MG_LEGACY_INTERFACE)
|
#if defined(MG_LEGACY_INTERFACE)
|
||||||
#define mg_lock mg_lock_connection
|
#define mg_lock mg_lock_connection
|
||||||
@@ -439,9 +434,8 @@ CIVETWEB_API void mg_unlock_connection(struct mg_connection* conn);
|
|||||||
|
|
||||||
/* Lock server context. This lock may be used to protect resources
|
/* Lock server context. This lock may be used to protect resources
|
||||||
that are shared between different connection/worker threads. */
|
that are shared between different connection/worker threads. */
|
||||||
CIVETWEB_API void mg_lock_context(struct mg_context* ctx);
|
CIVETWEB_API void mg_lock_context(struct mg_context *ctx);
|
||||||
CIVETWEB_API void mg_unlock_context(struct mg_context* ctx);
|
CIVETWEB_API void mg_unlock_context(struct mg_context *ctx);
|
||||||
|
|
||||||
|
|
||||||
/* Opcodes, from http://tools.ietf.org/html/rfc6455 */
|
/* Opcodes, from http://tools.ietf.org/html/rfc6455 */
|
||||||
enum {
|
enum {
|
||||||
@@ -453,7 +447,6 @@ enum {
|
|||||||
WEBSOCKET_OPCODE_PONG = 0xa
|
WEBSOCKET_OPCODE_PONG = 0xa
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Macros for enabling compiler-specific checks for printf-like arguments. */
|
/* Macros for enabling compiler-specific checks for printf-like arguments. */
|
||||||
#undef PRINTF_FORMAT_STRING
|
#undef PRINTF_FORMAT_STRING
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||||
@@ -476,13 +469,12 @@ enum {
|
|||||||
/* Send data to the client using printf() semantics.
|
/* Send data to the client using printf() semantics.
|
||||||
Works exactly like mg_write(), but allows to do message formatting. */
|
Works exactly like mg_write(), but allows to do message formatting. */
|
||||||
CIVETWEB_API int mg_printf(struct mg_connection *,
|
CIVETWEB_API int mg_printf(struct mg_connection *,
|
||||||
PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3);
|
PRINTF_FORMAT_STRING(const char *fmt), ...)
|
||||||
|
PRINTF_ARGS(2, 3);
|
||||||
|
|
||||||
/* Send contents of the entire file together with HTTP headers. */
|
/* Send contents of the entire file together with HTTP headers. */
|
||||||
CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
|
CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
|
||||||
|
|
||||||
|
|
||||||
/* Read data from the remote end, return number of bytes read.
|
/* Read data from the remote end, return number of bytes read.
|
||||||
Return:
|
Return:
|
||||||
0 connection has been closed by peer. No more data could be read.
|
0 connection has been closed by peer. No more data could be read.
|
||||||
@@ -490,14 +482,13 @@ CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
|
|||||||
> 0 number of bytes read into the buffer. */
|
> 0 number of bytes read into the buffer. */
|
||||||
CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
|
CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
|
||||||
|
|
||||||
|
|
||||||
/* Get the value of particular HTTP header.
|
/* Get the value of particular HTTP header.
|
||||||
|
|
||||||
This is a helper function. It traverses request_info->http_headers array,
|
This is a helper function. It traverses request_info->http_headers array,
|
||||||
and if the header is present in the array, returns its value. If it is
|
and if the header is present in the array, returns its value. If it is
|
||||||
not present, NULL is returned. */
|
not present, NULL is returned. */
|
||||||
CIVETWEB_API const char *mg_get_header(const struct mg_connection *, const char *name);
|
CIVETWEB_API const char *mg_get_header(const struct mg_connection *,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
/* Get a value of particular form variable.
|
/* Get a value of particular form variable.
|
||||||
|
|
||||||
@@ -521,7 +512,6 @@ CIVETWEB_API const char *mg_get_header(const struct mg_connection *, const char
|
|||||||
CIVETWEB_API int mg_get_var(const char *data, size_t data_len,
|
CIVETWEB_API int mg_get_var(const char *data, size_t data_len,
|
||||||
const char *var_name, char *dst, size_t dst_len);
|
const char *var_name, char *dst, size_t dst_len);
|
||||||
|
|
||||||
|
|
||||||
/* Get a value of particular form variable.
|
/* Get a value of particular form variable.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
@@ -546,8 +536,8 @@ CIVETWEB_API int mg_get_var(const char *data, size_t data_len,
|
|||||||
Destination buffer is guaranteed to be '\0' - terminated if it is not
|
Destination buffer is guaranteed to be '\0' - terminated if it is not
|
||||||
NULL or zero length. */
|
NULL or zero length. */
|
||||||
CIVETWEB_API int mg_get_var2(const char *data, size_t data_len,
|
CIVETWEB_API int mg_get_var2(const char *data, size_t data_len,
|
||||||
const char *var_name, char *dst, size_t dst_len, size_t occurrence);
|
const char *var_name, char *dst, size_t dst_len,
|
||||||
|
size_t occurrence);
|
||||||
|
|
||||||
/* Fetch value of certain cookie variable into the destination buffer.
|
/* Fetch value of certain cookie variable into the destination buffer.
|
||||||
|
|
||||||
@@ -565,7 +555,6 @@ CIVETWEB_API int mg_get_var2(const char *data, size_t data_len,
|
|||||||
CIVETWEB_API int mg_get_cookie(const char *cookie, const char *var_name,
|
CIVETWEB_API int mg_get_cookie(const char *cookie, const char *var_name,
|
||||||
char *buf, size_t buf_len);
|
char *buf, size_t buf_len);
|
||||||
|
|
||||||
|
|
||||||
/* Download data from the remote web server.
|
/* Download data from the remote web server.
|
||||||
host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
|
host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
|
||||||
port: port number, e.g. 80.
|
port: port number, e.g. 80.
|
||||||
@@ -581,37 +570,33 @@ CIVETWEB_API int mg_get_cookie(const char *cookie, const char *var_name,
|
|||||||
conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf),
|
conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf),
|
||||||
"%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n");
|
"%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n");
|
||||||
*/
|
*/
|
||||||
CIVETWEB_API struct mg_connection *mg_download(const char *host, int port, int use_ssl,
|
CIVETWEB_API struct mg_connection *
|
||||||
char *error_buffer, size_t error_buffer_size,
|
mg_download(const char *host, int port, int use_ssl, char *error_buffer,
|
||||||
PRINTF_FORMAT_STRING(const char *request_fmt),
|
size_t error_buffer_size,
|
||||||
...) PRINTF_ARGS(6, 7);
|
PRINTF_FORMAT_STRING(const char *request_fmt), ...)
|
||||||
|
PRINTF_ARGS(6, 7);
|
||||||
|
|
||||||
/* Close the connection opened by mg_download(). */
|
/* Close the connection opened by mg_download(). */
|
||||||
CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
|
CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
|
||||||
|
|
||||||
|
|
||||||
/* File upload functionality. Each uploaded file gets saved into a temporary
|
/* File upload functionality. Each uploaded file gets saved into a temporary
|
||||||
file and MG_UPLOAD event is sent.
|
file and MG_UPLOAD event is sent.
|
||||||
Return number of uploaded files. */
|
Return number of uploaded files. */
|
||||||
CIVETWEB_API int mg_upload(struct mg_connection *conn, const char *destination_dir);
|
CIVETWEB_API int mg_upload(struct mg_connection *conn,
|
||||||
|
const char *destination_dir);
|
||||||
|
|
||||||
/* Convenience function -- create detached thread.
|
/* Convenience function -- create detached thread.
|
||||||
Return: 0 on success, non-0 on error. */
|
Return: 0 on success, non-0 on error. */
|
||||||
typedef void * (*mg_thread_func_t)(void *);
|
typedef void *(*mg_thread_func_t)(void *);
|
||||||
CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p);
|
CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p);
|
||||||
|
|
||||||
|
|
||||||
/* Return builtin mime type for the given file name.
|
/* Return builtin mime type for the given file name.
|
||||||
For unrecognized extensions, "text/plain" is returned. */
|
For unrecognized extensions, "text/plain" is returned. */
|
||||||
CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
|
CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
|
||||||
|
|
||||||
|
|
||||||
/* Return Civetweb version. */
|
/* Return Civetweb version. */
|
||||||
CIVETWEB_API const char *mg_version(void);
|
CIVETWEB_API const char *mg_version(void);
|
||||||
|
|
||||||
|
|
||||||
/* URL-decode input buffer into destination buffer.
|
/* URL-decode input buffer into destination buffer.
|
||||||
0-terminate the destination buffer.
|
0-terminate the destination buffer.
|
||||||
form-url-encoded data differs from URI encoding in a way that it
|
form-url-encoded data differs from URI encoding in a way that it
|
||||||
@@ -621,13 +606,11 @@ CIVETWEB_API const char *mg_version(void);
|
|||||||
CIVETWEB_API int mg_url_decode(const char *src, int src_len, char *dst,
|
CIVETWEB_API int mg_url_decode(const char *src, int src_len, char *dst,
|
||||||
int dst_len, int is_form_url_encoded);
|
int dst_len, int is_form_url_encoded);
|
||||||
|
|
||||||
|
|
||||||
/* URL-encode input buffer into destination buffer.
|
/* URL-encode input buffer into destination buffer.
|
||||||
returns the length of the resulting buffer or -1
|
returns the length of the resulting buffer or -1
|
||||||
is the buffer is too small. */
|
is the buffer is too small. */
|
||||||
CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
|
CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
|
||||||
|
|
||||||
|
|
||||||
/* MD5 hash given strings.
|
/* MD5 hash given strings.
|
||||||
Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
|
Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
|
||||||
ASCIIz strings. When function returns, buf will contain human-readable
|
ASCIIz strings. When function returns, buf will contain human-readable
|
||||||
@@ -636,7 +619,6 @@ CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
|
|||||||
mg_md5(buf, "aa", "bb", NULL); */
|
mg_md5(buf, "aa", "bb", NULL); */
|
||||||
CIVETWEB_API char *mg_md5(char buf[33], ...);
|
CIVETWEB_API char *mg_md5(char buf[33], ...);
|
||||||
|
|
||||||
|
|
||||||
/* Print error message to the opened error log stream.
|
/* Print error message to the opened error log stream.
|
||||||
This utilizes the provided logging configuration.
|
This utilizes the provided logging configuration.
|
||||||
conn: connection
|
conn: connection
|
||||||
@@ -645,22 +627,24 @@ CIVETWEB_API char *mg_md5(char buf[33], ...);
|
|||||||
Example:
|
Example:
|
||||||
mg_cry(conn,"i like %s", "logging"); */
|
mg_cry(conn,"i like %s", "logging"); */
|
||||||
CIVETWEB_API void mg_cry(const struct mg_connection *conn,
|
CIVETWEB_API void mg_cry(const struct mg_connection *conn,
|
||||||
PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3);
|
PRINTF_FORMAT_STRING(const char *fmt), ...)
|
||||||
|
PRINTF_ARGS(2, 3);
|
||||||
|
|
||||||
/* utility method to compare two buffers, case incensitive. */
|
/* utility method to compare two buffers, case incensitive. */
|
||||||
CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
|
CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
|
||||||
|
|
||||||
|
|
||||||
/* Connect to a websocket as a client
|
/* Connect to a websocket as a client
|
||||||
Parameters:
|
Parameters:
|
||||||
host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or "localhost"
|
host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or
|
||||||
|
"localhost"
|
||||||
port: server port
|
port: server port
|
||||||
use_ssl: make a secure connection to server
|
use_ssl: make a secure connection to server
|
||||||
error_buffer, error_buffer_size: buffer for an error message
|
error_buffer, error_buffer_size: buffer for an error message
|
||||||
path: server path you are trying to connect to, i.e. if connection to localhost/app, path should be "/app"
|
path: server path you are trying to connect to, i.e. if connection to
|
||||||
|
localhost/app, path should be "/app"
|
||||||
origin: value of the Origin HTTP header
|
origin: value of the Origin HTTP header
|
||||||
data_func: callback that should be used when data is received from the server
|
data_func: callback that should be used when data is received from the
|
||||||
|
server
|
||||||
user_data: user supplied argument
|
user_data: user supplied argument
|
||||||
|
|
||||||
Return:
|
Return:
|
||||||
@@ -668,16 +652,16 @@ CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
|
|||||||
On error, NULL. Se error_buffer for details.
|
On error, NULL. Se error_buffer for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CIVETWEB_API struct mg_connection *mg_connect_websocket_client(const char *host, int port, int use_ssl,
|
CIVETWEB_API struct mg_connection *mg_connect_websocket_client(
|
||||||
char *error_buffer, size_t error_buffer_size,
|
const char *host, int port, int use_ssl, char *error_buffer,
|
||||||
const char *path, const char *origin,
|
size_t error_buffer_size, const char *path, const char *origin,
|
||||||
mg_websocket_data_handler data_func, mg_websocket_close_handler close_func,
|
mg_websocket_data_handler data_func, mg_websocket_close_handler close_func,
|
||||||
void * user_data);
|
void *user_data);
|
||||||
|
|
||||||
|
|
||||||
/* Connect to a TCP server as a client (can be used to connect to a HTTP server)
|
/* Connect to a TCP server as a client (can be used to connect to a HTTP server)
|
||||||
Parameters:
|
Parameters:
|
||||||
host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or "localhost"
|
host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or
|
||||||
|
"localhost"
|
||||||
port: server port
|
port: server port
|
||||||
use_ssl: make a secure connection to server
|
use_ssl: make a secure connection to server
|
||||||
error_buffer, error_buffer_size: buffer for an error message
|
error_buffer, error_buffer_size: buffer for an error message
|
||||||
@@ -686,27 +670,26 @@ CIVETWEB_API struct mg_connection *mg_connect_websocket_client(const char *host,
|
|||||||
On success, valid mg_connection object.
|
On success, valid mg_connection object.
|
||||||
On error, NULL. Se error_buffer for details.
|
On error, NULL. Se error_buffer for details.
|
||||||
*/
|
*/
|
||||||
CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port, int use_ssl,
|
CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port,
|
||||||
char *error_buffer, size_t error_buffer_size);
|
int use_ssl,
|
||||||
|
char *error_buffer,
|
||||||
|
size_t error_buffer_size);
|
||||||
enum {
|
|
||||||
TIMEOUT_INFINITE = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
|
enum { TIMEOUT_INFINITE = -1 };
|
||||||
|
|
||||||
/* Wait for a response from the server
|
/* Wait for a response from the server
|
||||||
Parameters:
|
Parameters:
|
||||||
conn: connection
|
conn: connection
|
||||||
ebuf, ebuf_len: error message placeholder.
|
ebuf, ebuf_len: error message placeholder.
|
||||||
timeout: time to wait for a response in milliseconds (if < 0 then wait forever)
|
timeout: time to wait for a response in milliseconds (if < 0 then wait
|
||||||
|
forever)
|
||||||
|
|
||||||
Return:
|
Return:
|
||||||
On success, >= 0
|
On success, >= 0
|
||||||
On error/timeout, < 0
|
On error/timeout, < 0
|
||||||
*/
|
*/
|
||||||
CIVETWEB_API int mg_get_response(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int timeout);
|
CIVETWEB_API int mg_get_response(struct mg_connection *conn, char *ebuf,
|
||||||
|
size_t ebuf_len, int timeout);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -15,50 +15,47 @@
|
|||||||
#define UNUSED_PARAMETER(x) (void)(x)
|
#define UNUSED_PARAMETER(x) (void)(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool CivetHandler::handleGet(CivetServer *server, struct mg_connection *conn)
|
bool CivetHandler::handleGet(CivetServer *server, struct mg_connection *conn) {
|
||||||
{
|
|
||||||
UNUSED_PARAMETER(server);
|
UNUSED_PARAMETER(server);
|
||||||
UNUSED_PARAMETER(conn);
|
UNUSED_PARAMETER(conn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CivetHandler::handlePost(CivetServer *server, struct mg_connection *conn)
|
bool CivetHandler::handlePost(CivetServer *server, struct mg_connection *conn) {
|
||||||
{
|
|
||||||
UNUSED_PARAMETER(server);
|
UNUSED_PARAMETER(server);
|
||||||
UNUSED_PARAMETER(conn);
|
UNUSED_PARAMETER(conn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CivetHandler::handlePut(CivetServer *server, struct mg_connection *conn)
|
bool CivetHandler::handlePut(CivetServer *server, struct mg_connection *conn) {
|
||||||
{
|
|
||||||
UNUSED_PARAMETER(server);
|
UNUSED_PARAMETER(server);
|
||||||
UNUSED_PARAMETER(conn);
|
UNUSED_PARAMETER(conn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CivetHandler::handleDelete(CivetServer *server, struct mg_connection *conn)
|
bool CivetHandler::handleDelete(CivetServer *server,
|
||||||
{
|
struct mg_connection *conn) {
|
||||||
UNUSED_PARAMETER(server);
|
UNUSED_PARAMETER(server);
|
||||||
UNUSED_PARAMETER(conn);
|
UNUSED_PARAMETER(conn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CivetHandler::handleOptions(CivetServer *server, struct mg_connection *conn)
|
bool CivetHandler::handleOptions(CivetServer *server,
|
||||||
{
|
struct mg_connection *conn) {
|
||||||
UNUSED_PARAMETER(server);
|
UNUSED_PARAMETER(server);
|
||||||
UNUSED_PARAMETER(conn);
|
UNUSED_PARAMETER(conn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
|
int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata) {
|
||||||
{
|
|
||||||
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
||||||
assert(request_info != NULL);
|
assert(request_info != NULL);
|
||||||
CivetServer *me = (CivetServer*) (request_info->user_data);
|
CivetServer *me = (CivetServer *)(request_info->user_data);
|
||||||
assert(me != NULL);
|
assert(me != NULL);
|
||||||
|
|
||||||
// Happens when a request hits the server before the context is saved
|
// Happens when a request hits the server before the context is saved
|
||||||
if (me->context == NULL) return 0;
|
if (me->context == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
mg_lock_context(me->context);
|
mg_lock_context(me->context);
|
||||||
me->connections[conn] = CivetConnection();
|
me->connections[conn] = CivetConnection();
|
||||||
@@ -84,9 +81,8 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CivetServer::CivetServer(const char **options,
|
CivetServer::CivetServer(const char **options,
|
||||||
const struct mg_callbacks *_callbacks) :
|
const struct mg_callbacks *_callbacks)
|
||||||
context(0)
|
: context(0) {
|
||||||
{
|
|
||||||
struct mg_callbacks callbacks;
|
struct mg_callbacks callbacks;
|
||||||
memset(&callbacks, 0, sizeof(callbacks));
|
memset(&callbacks, 0, sizeof(callbacks));
|
||||||
|
|
||||||
@@ -98,84 +94,82 @@ CivetServer::CivetServer(const char **options,
|
|||||||
}
|
}
|
||||||
callbacks.connection_close = closeHandler;
|
callbacks.connection_close = closeHandler;
|
||||||
context = mg_start(&callbacks, this, options);
|
context = mg_start(&callbacks, this, options);
|
||||||
if (context == NULL) throw CivetException("null context when constructing CivetServer. Possible problem binding to port.");
|
if (context == NULL)
|
||||||
|
throw CivetException("null context when constructing CivetServer. "
|
||||||
|
"Possible problem binding to port.");
|
||||||
}
|
}
|
||||||
|
|
||||||
CivetServer::~CivetServer()
|
CivetServer::~CivetServer() { close(); }
|
||||||
{
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CivetServer::closeHandler(const struct mg_connection *conn)
|
void CivetServer::closeHandler(const struct mg_connection *conn) {
|
||||||
{
|
|
||||||
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
||||||
assert(request_info != NULL);
|
assert(request_info != NULL);
|
||||||
CivetServer *me = (CivetServer*) (request_info->user_data);
|
CivetServer *me = (CivetServer *)(request_info->user_data);
|
||||||
assert(me != NULL);
|
assert(me != NULL);
|
||||||
|
|
||||||
// Happens when a request hits the server before the context is saved
|
// Happens when a request hits the server before the context is saved
|
||||||
if (me->context == NULL) return;
|
if (me->context == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (me->userCloseHandler) me->userCloseHandler(conn);
|
if (me->userCloseHandler)
|
||||||
|
me->userCloseHandler(conn);
|
||||||
mg_lock_context(me->context);
|
mg_lock_context(me->context);
|
||||||
me->connections.erase(const_cast<struct mg_connection *>(conn));
|
me->connections.erase(const_cast<struct mg_connection *>(conn));
|
||||||
mg_unlock_context(me->context);
|
mg_unlock_context(me->context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CivetServer::addHandler(const std::string &uri, CivetHandler *handler)
|
void CivetServer::addHandler(const std::string &uri, CivetHandler *handler) {
|
||||||
{
|
|
||||||
mg_set_request_handler(context, uri.c_str(), requestHandler, handler);
|
mg_set_request_handler(context, uri.c_str(), requestHandler, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CivetServer::removeHandler(const std::string &uri)
|
void CivetServer::removeHandler(const std::string &uri) {
|
||||||
{
|
|
||||||
mg_set_request_handler(context, uri.c_str(), NULL, NULL);
|
mg_set_request_handler(context, uri.c_str(), NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CivetServer::close()
|
void CivetServer::close() {
|
||||||
{
|
|
||||||
if (context) {
|
if (context) {
|
||||||
mg_stop (context);
|
mg_stop(context);
|
||||||
context = 0;
|
context = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CivetServer::getCookie(struct mg_connection *conn, const std::string &cookieName, std::string &cookieValue)
|
int CivetServer::getCookie(struct mg_connection *conn,
|
||||||
{
|
const std::string &cookieName,
|
||||||
//Maximum cookie length as per microsoft is 4096. http://msdn.microsoft.com/en-us/library/ms178194.aspx
|
std::string &cookieValue) {
|
||||||
|
// Maximum cookie length as per microsoft is 4096.
|
||||||
|
// http://msdn.microsoft.com/en-us/library/ms178194.aspx
|
||||||
char _cookieValue[4096];
|
char _cookieValue[4096];
|
||||||
const char *cookie = mg_get_header(conn, "Cookie");
|
const char *cookie = mg_get_header(conn, "Cookie");
|
||||||
int lRead = mg_get_cookie(cookie, cookieName.c_str(), _cookieValue, sizeof(_cookieValue));
|
int lRead = mg_get_cookie(cookie, cookieName.c_str(), _cookieValue,
|
||||||
|
sizeof(_cookieValue));
|
||||||
cookieValue.clear();
|
cookieValue.clear();
|
||||||
cookieValue.append(_cookieValue);
|
cookieValue.append(_cookieValue);
|
||||||
return lRead;
|
return lRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* CivetServer::getHeader(struct mg_connection *conn, const std::string &headerName)
|
const char *CivetServer::getHeader(struct mg_connection *conn,
|
||||||
{
|
const std::string &headerName) {
|
||||||
return mg_get_header(conn, headerName.c_str());
|
return mg_get_header(conn, headerName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void CivetServer::urlDecode(const char *src, std::string &dst,
|
||||||
CivetServer::urlDecode(const char *src, std::string &dst, bool is_form_url_encoded)
|
bool is_form_url_encoded) {
|
||||||
{
|
|
||||||
urlDecode(src, strlen(src), dst, is_form_url_encoded);
|
urlDecode(src, strlen(src), dst, is_form_url_encoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst,
|
||||||
CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst, bool is_form_url_encoded)
|
bool is_form_url_encoded) {
|
||||||
{
|
|
||||||
int i, j, a, b;
|
int i, j, a, b;
|
||||||
#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
|
#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
|
||||||
|
|
||||||
dst.clear();
|
dst.clear();
|
||||||
for (i = j = 0; i < (int)src_len; i++, j++) {
|
for (i = j = 0; i < (int)src_len; i++, j++) {
|
||||||
if (i < (int)src_len - 2 && src[i] == '%' &&
|
if (i < (int)src_len - 2 && src[i] == '%' &&
|
||||||
isxdigit(* (const unsigned char *) (src + i + 1)) &&
|
isxdigit(*(const unsigned char *)(src + i + 1)) &&
|
||||||
isxdigit(* (const unsigned char *) (src + i + 2))) {
|
isxdigit(*(const unsigned char *)(src + i + 2))) {
|
||||||
a = tolower(* (const unsigned char *) (src + i + 1));
|
a = tolower(*(const unsigned char *)(src + i + 1));
|
||||||
b = tolower(* (const unsigned char *) (src + i + 2));
|
b = tolower(*(const unsigned char *)(src + i + 2));
|
||||||
dst.push_back((char) ((HEXTOI(a) << 4) | HEXTOI(b)));
|
dst.push_back((char)((HEXTOI(a) << 4) | HEXTOI(b)));
|
||||||
i += 2;
|
i += 2;
|
||||||
} else if (is_form_url_encoded && src[i] == '+') {
|
} else if (is_form_url_encoded && src[i] == '+') {
|
||||||
dst.push_back(' ');
|
dst.push_back(' ');
|
||||||
@@ -185,14 +179,12 @@ CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst, bool i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||||
CivetServer::getParam(struct mg_connection *conn, const char *name,
|
std::string &dst, size_t occurrence) {
|
||||||
std::string &dst, size_t occurrence)
|
|
||||||
{
|
|
||||||
const char *formParams = NULL;
|
const char *formParams = NULL;
|
||||||
const struct mg_request_info *ri = mg_get_request_info(conn);
|
const struct mg_request_info *ri = mg_get_request_info(conn);
|
||||||
assert(ri != NULL);
|
assert(ri != NULL);
|
||||||
CivetServer *me = (CivetServer*) (ri->user_data);
|
CivetServer *me = (CivetServer *)(ri->user_data);
|
||||||
assert(me != NULL);
|
assert(me != NULL);
|
||||||
mg_lock_context(me->context);
|
mg_lock_context(me->context);
|
||||||
CivetConnection &conobj = me->connections[conn];
|
CivetConnection &conobj = me->connections[conn];
|
||||||
@@ -202,13 +194,15 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
|||||||
if (conobj.postData != NULL) {
|
if (conobj.postData != NULL) {
|
||||||
formParams = conobj.postData;
|
formParams = conobj.postData;
|
||||||
} else {
|
} else {
|
||||||
const char * con_len_str = mg_get_header(conn, "Content-Length");
|
const char *con_len_str = mg_get_header(conn, "Content-Length");
|
||||||
if (con_len_str) {
|
if (con_len_str) {
|
||||||
unsigned long con_len = atoi(con_len_str);
|
unsigned long con_len = atoi(con_len_str);
|
||||||
if (con_len>0) {
|
if (con_len > 0) {
|
||||||
// Add one extra character: in case the post-data is a text, it is required as 0-termination.
|
// Add one extra character: in case the post-data is a text, it
|
||||||
// Do not increment con_len, since the 0 terminating is not part of the content (text or binary).
|
// is required as 0-termination.
|
||||||
conobj.postData = (char*)malloc(con_len + 1);
|
// Do not increment con_len, since the 0 terminating is not part
|
||||||
|
// of the content (text or binary).
|
||||||
|
conobj.postData = (char *)malloc(con_len + 1);
|
||||||
if (conobj.postData != NULL) {
|
if (conobj.postData != NULL) {
|
||||||
// malloc may fail for huge requests
|
// malloc may fail for huge requests
|
||||||
mg_read(conn, conobj.postData, con_len);
|
mg_read(conn, conobj.postData, con_len);
|
||||||
@@ -220,7 +214,8 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (formParams == NULL) {
|
if (formParams == NULL) {
|
||||||
// get requests do store html <form> field values in the http query_string
|
// get requests do store html <form> field values in the http
|
||||||
|
// query_string
|
||||||
formParams = ri->query_string;
|
formParams = ri->query_string;
|
||||||
}
|
}
|
||||||
mg_unlock_connection(conn);
|
mg_unlock_connection(conn);
|
||||||
@@ -232,10 +227,8 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
||||||
CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
std::string &dst, size_t occurrence) {
|
||||||
std::string &dst, size_t occurrence)
|
|
||||||
{
|
|
||||||
const char *p, *e, *s;
|
const char *p, *e, *s;
|
||||||
size_t name_len;
|
size_t name_len;
|
||||||
|
|
||||||
@@ -255,7 +248,7 @@ CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
|||||||
p += name_len + 1;
|
p += name_len + 1;
|
||||||
|
|
||||||
// Point s to the end of the value
|
// Point s to the end of the value
|
||||||
s = (const char *) memchr(p, '&', (size_t)(e - p));
|
s = (const char *)memchr(p, '&', (size_t)(e - p));
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
s = e;
|
s = e;
|
||||||
}
|
}
|
||||||
@@ -269,15 +262,12 @@ CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void CivetServer::urlEncode(const char *src, std::string &dst, bool append) {
|
||||||
CivetServer::urlEncode(const char *src, std::string &dst, bool append)
|
|
||||||
{
|
|
||||||
urlEncode(src, strlen(src), dst, append);
|
urlEncode(src, strlen(src), dst, append);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void CivetServer::urlEncode(const char *src, size_t src_len, std::string &dst,
|
||||||
CivetServer::urlEncode(const char *src, size_t src_len, std::string &dst, bool append)
|
bool append) {
|
||||||
{
|
|
||||||
static const char *dont_escape = "._-$,;~()";
|
static const char *dont_escape = "._-$,;~()";
|
||||||
static const char *hex = "0123456789abcdef";
|
static const char *hex = "0123456789abcdef";
|
||||||
|
|
||||||
@@ -285,20 +275,18 @@ CivetServer::urlEncode(const char *src, size_t src_len, std::string &dst, bool a
|
|||||||
dst.clear();
|
dst.clear();
|
||||||
|
|
||||||
for (; src_len > 0; src++, src_len--) {
|
for (; src_len > 0; src++, src_len--) {
|
||||||
if (isalnum(*(const unsigned char *) src) ||
|
if (isalnum(*(const unsigned char *)src) ||
|
||||||
strchr(dont_escape, * (const unsigned char *) src) != NULL) {
|
strchr(dont_escape, *(const unsigned char *)src) != NULL) {
|
||||||
dst.push_back(*src);
|
dst.push_back(*src);
|
||||||
} else {
|
} else {
|
||||||
dst.push_back('%');
|
dst.push_back('%');
|
||||||
dst.push_back(hex[(* (const unsigned char *) src) >> 4]);
|
dst.push_back(hex[(*(const unsigned char *)src) >> 4]);
|
||||||
dst.push_back(hex[(* (const unsigned char *) src) & 0xf]);
|
dst.push_back(hex[(*(const unsigned char *)src) & 0xf]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int>
|
std::vector<int> CivetServer::getListeningPorts() {
|
||||||
CivetServer::getListeningPorts()
|
|
||||||
{
|
|
||||||
std::vector<int> ports(10);
|
std::vector<int> ports(10);
|
||||||
std::vector<int> ssl(10);
|
std::vector<int> ssl(10);
|
||||||
size_t size = mg_get_ports(context, ports.size(), &ports[0], &ssl[0]);
|
size_t size = mg_get_ports(context, ports.size(), &ports[0], &ssl[0]);
|
||||||
@@ -307,12 +295,9 @@ CivetServer::getListeningPorts()
|
|||||||
return ports;
|
return ports;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CivetServer::CivetConnection::CivetConnection() {
|
CivetServer::CivetConnection::CivetConnection() {
|
||||||
postData = NULL;
|
postData = NULL;
|
||||||
postDataLen = 0;
|
postDataLen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CivetServer::CivetConnection::~CivetConnection() {
|
CivetServer::CivetConnection::~CivetConnection() { free(postData); }
|
||||||
free(postData);
|
|
||||||
}
|
|
||||||
|
905
src/main.c
905
src/main.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user