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.
|
||||
*/
|
||||
class CIVETWEB_API CivetException : public std::runtime_error
|
||||
{
|
||||
class CIVETWEB_API CivetException : public std::runtime_error {
|
||||
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
|
||||
* must be reentrant.
|
||||
*/
|
||||
class CIVETWEB_API CivetHandler
|
||||
{
|
||||
public:
|
||||
|
||||
class CIVETWEB_API CivetHandler {
|
||||
public:
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
virtual ~CivetHandler() {
|
||||
}
|
||||
virtual ~CivetHandler() {}
|
||||
|
||||
/**
|
||||
* Callback method for GET request.
|
||||
@@ -91,10 +87,8 @@ public:
|
||||
*
|
||||
* Basic class for embedded web server. This has an URL mapping built-in.
|
||||
*/
|
||||
class CIVETWEB_API CivetServer
|
||||
{
|
||||
public:
|
||||
|
||||
class CIVETWEB_API CivetServer {
|
||||
public:
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
@@ -126,9 +120,7 @@ public:
|
||||
*
|
||||
* @return the context or 0 if not running.
|
||||
*/
|
||||
const struct mg_context *getContext() const {
|
||||
return context;
|
||||
}
|
||||
const struct mg_context *getContext() const { return context; }
|
||||
|
||||
/**
|
||||
* addHandler(const std::string &, CivetHandler *)
|
||||
@@ -167,16 +159,20 @@ public:
|
||||
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 cookieName - cookie name to get the value from
|
||||
* @param cookieValue - cookie value is returned using thiis reference
|
||||
* @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)
|
||||
@@ -184,28 +180,34 @@ public:
|
||||
* @param headerName - header name to get the value from
|
||||
* @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)
|
||||
*
|
||||
* Returns a query paramter contained in the supplied buffer. The
|
||||
* 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
|
||||
* 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,
|
||||
* you may use a getParam version that directly takes the data instead of the
|
||||
* html forms with method="GET" and method="POST" attributes. In other
|
||||
*cases,
|
||||
* you may use a getParam version that directly takes the data instead of
|
||||
*the
|
||||
* 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 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
|
||||
*/
|
||||
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)
|
||||
@@ -217,11 +219,12 @@ public:
|
||||
* @param data - the query string (text)
|
||||
* @param name - the key to search for
|
||||
* @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
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -236,12 +239,12 @@ public:
|
||||
* @param data_len - length of the query string
|
||||
* @param name - the key to search for
|
||||
* @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
|
||||
*/
|
||||
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)
|
||||
@@ -253,7 +256,8 @@ public:
|
||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||
* 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);
|
||||
}
|
||||
|
||||
@@ -268,7 +272,8 @@ public:
|
||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||
* 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)
|
||||
@@ -280,7 +285,8 @@ public:
|
||||
* uses '+' as character for space, see RFC 1866 section 8.2.1
|
||||
* 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)
|
||||
@@ -289,7 +295,8 @@ public:
|
||||
* @param dst - destination string
|
||||
* @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);
|
||||
}
|
||||
|
||||
@@ -300,7 +307,8 @@ public:
|
||||
* @param dst - destination string
|
||||
* @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)
|
||||
@@ -310,12 +318,13 @@ public:
|
||||
* @param dst - destination string
|
||||
* @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 {
|
||||
public:
|
||||
char * postData;
|
||||
char *postData;
|
||||
unsigned long postDataLen;
|
||||
|
||||
CivetConnection();
|
||||
@@ -325,7 +334,7 @@ protected:
|
||||
struct mg_context *context;
|
||||
std::map<struct mg_connection *, class CivetConnection> connections;
|
||||
|
||||
private:
|
||||
private:
|
||||
/**
|
||||
* requestHandler(struct mg_connection *, void *cbdata)
|
||||
*
|
||||
@@ -350,7 +359,6 @@ private:
|
||||
* Stores the user provided close handler
|
||||
*/
|
||||
void (*userCloseHandler)(const struct mg_connection *conn);
|
||||
|
||||
};
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
@@ -26,17 +26,17 @@
|
||||
#define CIVETWEB_VERSION "1.7"
|
||||
|
||||
#ifndef CIVETWEB_API
|
||||
#if defined(_WIN32)
|
||||
#if defined(CIVETWEB_DLL_EXPORTS)
|
||||
#define CIVETWEB_API __declspec(dllexport)
|
||||
#elif defined(CIVETWEB_DLL_IMPORTS)
|
||||
#define CIVETWEB_API __declspec(dllimport)
|
||||
#else
|
||||
#define CIVETWEB_API
|
||||
#endif
|
||||
#else
|
||||
#define CIVETWEB_API
|
||||
#endif
|
||||
#if defined(_WIN32)
|
||||
#if defined(CIVETWEB_DLL_EXPORTS)
|
||||
#define CIVETWEB_API __declspec(dllexport)
|
||||
#elif defined(CIVETWEB_DLL_IMPORTS)
|
||||
#define CIVETWEB_API __declspec(dllimport)
|
||||
#else
|
||||
#define CIVETWEB_API
|
||||
#endif
|
||||
#else
|
||||
#define CIVETWEB_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -49,7 +49,6 @@ extern "C" {
|
||||
struct mg_context; /* Handle for the HTTP service itself */
|
||||
struct mg_connection; /* Handle for the individual connection */
|
||||
|
||||
|
||||
/* This structure contains information about the HTTP request. */
|
||||
struct mg_request_info {
|
||||
const char *request_method; /* "GET", "POST", etc */
|
||||
@@ -60,7 +59,9 @@ struct mg_request_info {
|
||||
const char *remote_user; /* Authenticated user, or NULL if no auth
|
||||
used */
|
||||
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,
|
||||
can be -1 if no length was given. */
|
||||
@@ -76,7 +77,6 @@ struct mg_request_info {
|
||||
} http_headers[64]; /* Maximum 64 headers */
|
||||
};
|
||||
|
||||
|
||||
/* This structure needs to be passed to mg_start(), to let civetweb know
|
||||
which callbacks to invoke. For a detailed description, see
|
||||
https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md */
|
||||
@@ -136,8 +136,8 @@ struct mg_callbacks {
|
||||
1: keep this websocket connection open.
|
||||
0: close this websocket connection.
|
||||
This callback is deprecated, use mg_set_websocket_handler instead. */
|
||||
int (*websocket_data)(struct mg_connection *, int bits,
|
||||
char *data, size_t data_len);
|
||||
int (*websocket_data)(struct mg_connection *, int bits, char *data,
|
||||
size_t data_len);
|
||||
|
||||
/* Called when civetweb is closing a connection. The per-context mutex is
|
||||
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.
|
||||
non-NULL: pointer to the file contents in memory. data_len must be
|
||||
initilized with the size of the memory block. */
|
||||
const char * (*open_file)(const struct mg_connection *,
|
||||
const char *path, size_t *data_len);
|
||||
const char *(*open_file)(const struct mg_connection *, const char *path,
|
||||
size_t *data_len);
|
||||
|
||||
/* Called when civetweb is about to serve Lua server page, if
|
||||
Lua support is enabled.
|
||||
@@ -185,15 +185,14 @@ struct mg_callbacks {
|
||||
are processed.
|
||||
Parameters:
|
||||
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.
|
||||
Parameters:
|
||||
ctx: context handle */
|
||||
void (*exit_context)(const struct mg_context * ctx);
|
||||
void (*exit_context)(const struct mg_context *ctx);
|
||||
};
|
||||
|
||||
|
||||
/* Start web server.
|
||||
|
||||
Parameters:
|
||||
@@ -223,7 +222,6 @@ CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
||||
void *user_data,
|
||||
const char **configuration_options);
|
||||
|
||||
|
||||
/* Stop the web server.
|
||||
|
||||
Must be called last, when an application wants to stop the web server and
|
||||
@@ -231,7 +229,6 @@ CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
||||
threads are stopped. Context pointer becomes invalid. */
|
||||
CIVETWEB_API void mg_stop(struct mg_context *);
|
||||
|
||||
|
||||
/* mg_request_handler
|
||||
|
||||
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:
|
||||
0: the handler could not handle the request, so fall through.
|
||||
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
|
||||
|
||||
@@ -261,11 +257,16 @@ typedef int (* mg_request_handler)(struct mg_connection *conn, void *cbdata);
|
||||
ctx: server context
|
||||
uri: the URI (exact or pattern) for the handler
|
||||
handler: the callback handler to use when the URI is requested.
|
||||
If NULL, an already registered handler for this URI will be removed.
|
||||
The URI used to remove a handler must match exactly the one used to
|
||||
If NULL, an already registered handler for this URI will be
|
||||
removed.
|
||||
The URI used to remove a handler must match exactly the one used
|
||||
to
|
||||
register it (not only a pattern match).
|
||||
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++.
|
||||
|
||||
@@ -292,23 +293,25 @@ CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, const char *uri
|
||||
|
||||
mg_connection_close_handler
|
||||
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 int (*mg_websocket_data_handler)(struct mg_connection *, int, char *, size_t, void *);
|
||||
typedef void (*mg_websocket_close_handler)(const struct mg_connection *, void *);
|
||||
typedef int (*mg_websocket_data_handler)(struct mg_connection *, int, char *,
|
||||
size_t, void *);
|
||||
typedef void (*mg_websocket_close_handler)(const struct mg_connection *,
|
||||
void *);
|
||||
|
||||
/* mg_set_websocket_handler
|
||||
|
||||
Set or remove handler functions for websocket connections.
|
||||
This function works similar to mg_set_request_handler - see there. */
|
||||
CIVETWEB_API void mg_set_websocket_handler(struct mg_context *ctx,
|
||||
const char *uri,
|
||||
CIVETWEB_API void
|
||||
mg_set_websocket_handler(struct mg_context *ctx, const char *uri,
|
||||
mg_websocket_connect_handler connect_handler,
|
||||
mg_websocket_ready_handler ready_handler,
|
||||
mg_websocket_data_handler data_handler,
|
||||
mg_websocket_close_handler close_handler,
|
||||
void *cbdata
|
||||
);
|
||||
void *cbdata);
|
||||
|
||||
/* Get the value of particular configuration parameter.
|
||||
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
|
||||
names, return value is guaranteed to be non-NULL. If parameter is not
|
||||
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. */
|
||||
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. */
|
||||
CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx);
|
||||
|
||||
|
||||
/* 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. */
|
||||
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)
|
||||
/* 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);
|
||||
#endif
|
||||
|
||||
|
||||
struct mg_option {
|
||||
const char * name;
|
||||
const char *name;
|
||||
int type;
|
||||
const char * default_value;
|
||||
const char *default_value;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -361,13 +362,11 @@ enum {
|
||||
CONFIG_TYPE_EXT_PATTERN = 0x6
|
||||
};
|
||||
|
||||
|
||||
/* Return array of struct mg_option, representing all valid configuration
|
||||
options of civetweb.c.
|
||||
The array is terminated by a NULL name option. */
|
||||
CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
|
||||
|
||||
|
||||
/* 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.
|
||||
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.
|
||||
The value returned is read-only. Civetweb does not allow changing
|
||||
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.
|
||||
|
||||
@@ -391,14 +390,12 @@ CIVETWEB_API size_t mg_get_ports(const struct mg_context *ctx, size_t size, int*
|
||||
Return:
|
||||
1 on success, 0 on error. */
|
||||
CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name,
|
||||
const char *domain,
|
||||
const char *user,
|
||||
const char *domain, const char *user,
|
||||
const char *password);
|
||||
|
||||
|
||||
/* 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.
|
||||
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 */
|
||||
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
|
||||
mg_lock_connection to ensure that the transmission is not interrupted,
|
||||
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
|
||||
-1 on error
|
||||
>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);
|
||||
|
||||
|
||||
/* Blocks until unique access is obtained to this connection. Intended for use
|
||||
with websockets only.
|
||||
Invoke this before mg_write or mg_printf when communicating with a
|
||||
websocket if your code has server-initiated communication as well as
|
||||
communication in direct response to a message. */
|
||||
CIVETWEB_API void mg_lock_connection(struct mg_connection* conn);
|
||||
CIVETWEB_API void mg_unlock_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);
|
||||
|
||||
#if defined(MG_LEGACY_INTERFACE)
|
||||
#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
|
||||
that are shared between different connection/worker threads. */
|
||||
CIVETWEB_API void mg_lock_context(struct mg_context* ctx);
|
||||
CIVETWEB_API void mg_unlock_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);
|
||||
|
||||
/* Opcodes, from http://tools.ietf.org/html/rfc6455 */
|
||||
enum {
|
||||
@@ -453,7 +447,6 @@ enum {
|
||||
WEBSOCKET_OPCODE_PONG = 0xa
|
||||
};
|
||||
|
||||
|
||||
/* Macros for enabling compiler-specific checks for printf-like arguments. */
|
||||
#undef PRINTF_FORMAT_STRING
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
@@ -476,13 +469,12 @@ enum {
|
||||
/* Send data to the client using printf() semantics.
|
||||
Works exactly like mg_write(), but allows to do message formatting. */
|
||||
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. */
|
||||
CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
|
||||
|
||||
|
||||
/* Read data from the remote end, return number of bytes read.
|
||||
Return:
|
||||
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. */
|
||||
CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
|
||||
|
||||
|
||||
/* Get the value of particular HTTP header.
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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,
|
||||
const char *var_name, char *dst, size_t dst_len);
|
||||
|
||||
|
||||
/* Get a value of particular form variable.
|
||||
|
||||
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
|
||||
NULL or zero length. */
|
||||
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.
|
||||
|
||||
@@ -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,
|
||||
char *buf, size_t buf_len);
|
||||
|
||||
|
||||
/* Download data from the remote web server.
|
||||
host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
|
||||
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),
|
||||
"%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,
|
||||
char *error_buffer, size_t error_buffer_size,
|
||||
PRINTF_FORMAT_STRING(const char *request_fmt),
|
||||
...) PRINTF_ARGS(6, 7);
|
||||
|
||||
CIVETWEB_API struct mg_connection *
|
||||
mg_download(const char *host, int port, int use_ssl, char *error_buffer,
|
||||
size_t error_buffer_size,
|
||||
PRINTF_FORMAT_STRING(const char *request_fmt), ...)
|
||||
PRINTF_ARGS(6, 7);
|
||||
|
||||
/* Close the connection opened by mg_download(). */
|
||||
CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
|
||||
|
||||
|
||||
/* File upload functionality. Each uploaded file gets saved into a temporary
|
||||
file and MG_UPLOAD event is sent.
|
||||
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.
|
||||
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);
|
||||
|
||||
|
||||
/* Return builtin mime type for the given file name.
|
||||
For unrecognized extensions, "text/plain" is returned. */
|
||||
CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
|
||||
|
||||
|
||||
/* Return Civetweb version. */
|
||||
CIVETWEB_API const char *mg_version(void);
|
||||
|
||||
|
||||
/* URL-decode input buffer into destination buffer.
|
||||
0-terminate the destination buffer.
|
||||
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,
|
||||
int dst_len, int is_form_url_encoded);
|
||||
|
||||
|
||||
/* URL-encode input buffer into destination buffer.
|
||||
returns the length of the resulting buffer or -1
|
||||
is the buffer is too small. */
|
||||
CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
|
||||
|
||||
|
||||
/* MD5 hash given strings.
|
||||
Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
|
||||
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); */
|
||||
CIVETWEB_API char *mg_md5(char buf[33], ...);
|
||||
|
||||
|
||||
/* Print error message to the opened error log stream.
|
||||
This utilizes the provided logging configuration.
|
||||
conn: connection
|
||||
@@ -645,22 +627,24 @@ CIVETWEB_API char *mg_md5(char buf[33], ...);
|
||||
Example:
|
||||
mg_cry(conn,"i like %s", "logging"); */
|
||||
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. */
|
||||
CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
|
||||
|
||||
|
||||
/* Connect to a websocket as a client
|
||||
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
|
||||
use_ssl: make a secure connection to server
|
||||
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
|
||||
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
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
CIVETWEB_API struct mg_connection *mg_connect_websocket_client(const char *host, int port, int use_ssl,
|
||||
char *error_buffer, size_t error_buffer_size,
|
||||
const char *path, const char *origin,
|
||||
CIVETWEB_API struct mg_connection *mg_connect_websocket_client(
|
||||
const char *host, int port, int use_ssl, char *error_buffer,
|
||||
size_t error_buffer_size, const char *path, const char *origin,
|
||||
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)
|
||||
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
|
||||
use_ssl: make a secure connection to server
|
||||
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 error, NULL. Se error_buffer for details.
|
||||
*/
|
||||
CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port, int use_ssl,
|
||||
char *error_buffer, size_t error_buffer_size);
|
||||
|
||||
|
||||
enum {
|
||||
TIMEOUT_INFINITE = -1
|
||||
};
|
||||
CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port,
|
||||
int use_ssl,
|
||||
char *error_buffer,
|
||||
size_t error_buffer_size);
|
||||
|
||||
enum { TIMEOUT_INFINITE = -1 };
|
||||
|
||||
/* Wait for a response from the server
|
||||
Parameters:
|
||||
conn: connection
|
||||
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:
|
||||
On success, >= 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
|
||||
}
|
||||
|
@@ -15,50 +15,47 @@
|
||||
#define UNUSED_PARAMETER(x) (void)(x)
|
||||
#endif
|
||||
|
||||
bool CivetHandler::handleGet(CivetServer *server, struct mg_connection *conn)
|
||||
{
|
||||
bool CivetHandler::handleGet(CivetServer *server, struct mg_connection *conn) {
|
||||
UNUSED_PARAMETER(server);
|
||||
UNUSED_PARAMETER(conn);
|
||||
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(conn);
|
||||
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(conn);
|
||||
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(conn);
|
||||
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(conn);
|
||||
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);
|
||||
assert(request_info != NULL);
|
||||
CivetServer *me = (CivetServer*) (request_info->user_data);
|
||||
CivetServer *me = (CivetServer *)(request_info->user_data);
|
||||
assert(me != NULL);
|
||||
|
||||
// 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);
|
||||
me->connections[conn] = CivetConnection();
|
||||
@@ -84,9 +81,8 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
|
||||
}
|
||||
|
||||
CivetServer::CivetServer(const char **options,
|
||||
const struct mg_callbacks *_callbacks) :
|
||||
context(0)
|
||||
{
|
||||
const struct mg_callbacks *_callbacks)
|
||||
: context(0) {
|
||||
struct mg_callbacks callbacks;
|
||||
memset(&callbacks, 0, sizeof(callbacks));
|
||||
|
||||
@@ -98,84 +94,82 @@ CivetServer::CivetServer(const char **options,
|
||||
}
|
||||
callbacks.connection_close = closeHandler;
|
||||
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()
|
||||
{
|
||||
close();
|
||||
}
|
||||
CivetServer::~CivetServer() { 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);
|
||||
assert(request_info != NULL);
|
||||
CivetServer *me = (CivetServer*) (request_info->user_data);
|
||||
CivetServer *me = (CivetServer *)(request_info->user_data);
|
||||
assert(me != NULL);
|
||||
|
||||
// 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);
|
||||
me->connections.erase(const_cast<struct mg_connection *>(conn));
|
||||
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);
|
||||
}
|
||||
|
||||
void CivetServer::removeHandler(const std::string &uri)
|
||||
{
|
||||
void CivetServer::removeHandler(const std::string &uri) {
|
||||
mg_set_request_handler(context, uri.c_str(), NULL, NULL);
|
||||
}
|
||||
|
||||
void CivetServer::close()
|
||||
{
|
||||
void CivetServer::close() {
|
||||
if (context) {
|
||||
mg_stop (context);
|
||||
mg_stop(context);
|
||||
context = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int CivetServer::getCookie(struct mg_connection *conn, const std::string &cookieName, std::string &cookieValue)
|
||||
{
|
||||
//Maximum cookie length as per microsoft is 4096. http://msdn.microsoft.com/en-us/library/ms178194.aspx
|
||||
int CivetServer::getCookie(struct mg_connection *conn,
|
||||
const std::string &cookieName,
|
||||
std::string &cookieValue) {
|
||||
// Maximum cookie length as per microsoft is 4096.
|
||||
// http://msdn.microsoft.com/en-us/library/ms178194.aspx
|
||||
char _cookieValue[4096];
|
||||
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.append(_cookieValue);
|
||||
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());
|
||||
}
|
||||
|
||||
void
|
||||
CivetServer::urlDecode(const char *src, std::string &dst, bool is_form_url_encoded)
|
||||
{
|
||||
void CivetServer::urlDecode(const char *src, std::string &dst,
|
||||
bool is_form_url_encoded) {
|
||||
urlDecode(src, strlen(src), dst, is_form_url_encoded);
|
||||
}
|
||||
|
||||
void
|
||||
CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst, bool is_form_url_encoded)
|
||||
{
|
||||
void CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst,
|
||||
bool is_form_url_encoded) {
|
||||
int i, j, a, b;
|
||||
#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
|
||||
|
||||
dst.clear();
|
||||
for (i = j = 0; i < (int)src_len; i++, j++) {
|
||||
if (i < (int)src_len - 2 && src[i] == '%' &&
|
||||
isxdigit(* (const unsigned char *) (src + i + 1)) &&
|
||||
isxdigit(* (const unsigned char *) (src + i + 2))) {
|
||||
a = tolower(* (const unsigned char *) (src + i + 1));
|
||||
b = tolower(* (const unsigned char *) (src + i + 2));
|
||||
dst.push_back((char) ((HEXTOI(a) << 4) | HEXTOI(b)));
|
||||
isxdigit(*(const unsigned char *)(src + i + 1)) &&
|
||||
isxdigit(*(const unsigned char *)(src + i + 2))) {
|
||||
a = tolower(*(const unsigned char *)(src + i + 1));
|
||||
b = tolower(*(const unsigned char *)(src + i + 2));
|
||||
dst.push_back((char)((HEXTOI(a) << 4) | HEXTOI(b)));
|
||||
i += 2;
|
||||
} else if (is_form_url_encoded && src[i] == '+') {
|
||||
dst.push_back(' ');
|
||||
@@ -185,14 +179,12 @@ CivetServer::urlDecode(const char *src, size_t src_len, std::string &dst, bool i
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||
std::string &dst, size_t occurrence)
|
||||
{
|
||||
bool CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||
std::string &dst, size_t occurrence) {
|
||||
const char *formParams = NULL;
|
||||
const struct mg_request_info *ri = mg_get_request_info(conn);
|
||||
assert(ri != NULL);
|
||||
CivetServer *me = (CivetServer*) (ri->user_data);
|
||||
CivetServer *me = (CivetServer *)(ri->user_data);
|
||||
assert(me != NULL);
|
||||
mg_lock_context(me->context);
|
||||
CivetConnection &conobj = me->connections[conn];
|
||||
@@ -202,13 +194,15 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||
if (conobj.postData != NULL) {
|
||||
formParams = conobj.postData;
|
||||
} 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) {
|
||||
unsigned long con_len = atoi(con_len_str);
|
||||
if (con_len>0) {
|
||||
// Add one extra character: in case the post-data is a text, it is required as 0-termination.
|
||||
// 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 (con_len > 0) {
|
||||
// Add one extra character: in case the post-data is a text, it
|
||||
// is required as 0-termination.
|
||||
// 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) {
|
||||
// malloc may fail for huge requests
|
||||
mg_read(conn, conobj.postData, con_len);
|
||||
@@ -220,7 +214,8 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
mg_unlock_connection(conn);
|
||||
@@ -232,10 +227,8 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
||||
std::string &dst, size_t occurrence)
|
||||
{
|
||||
bool CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
||||
std::string &dst, size_t occurrence) {
|
||||
const char *p, *e, *s;
|
||||
size_t name_len;
|
||||
|
||||
@@ -255,7 +248,7 @@ CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
||||
p += name_len + 1;
|
||||
|
||||
// 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) {
|
||||
s = e;
|
||||
}
|
||||
@@ -269,15 +262,12 @@ CivetServer::getParam(const char *data, size_t data_len, const char *name,
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
CivetServer::urlEncode(const char *src, std::string &dst, bool append)
|
||||
{
|
||||
void CivetServer::urlEncode(const char *src, std::string &dst, bool append) {
|
||||
urlEncode(src, strlen(src), dst, append);
|
||||
}
|
||||
|
||||
void
|
||||
CivetServer::urlEncode(const char *src, size_t src_len, std::string &dst, bool append)
|
||||
{
|
||||
void CivetServer::urlEncode(const char *src, size_t src_len, std::string &dst,
|
||||
bool append) {
|
||||
static const char *dont_escape = "._-$,;~()";
|
||||
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();
|
||||
|
||||
for (; src_len > 0; src++, src_len--) {
|
||||
if (isalnum(*(const unsigned char *) src) ||
|
||||
strchr(dont_escape, * (const unsigned char *) src) != NULL) {
|
||||
if (isalnum(*(const unsigned char *)src) ||
|
||||
strchr(dont_escape, *(const unsigned char *)src) != NULL) {
|
||||
dst.push_back(*src);
|
||||
} else {
|
||||
dst.push_back('%');
|
||||
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) >> 4]);
|
||||
dst.push_back(hex[(*(const unsigned char *)src) & 0xf]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<int>
|
||||
CivetServer::getListeningPorts()
|
||||
{
|
||||
std::vector<int> CivetServer::getListeningPorts() {
|
||||
std::vector<int> ports(10);
|
||||
std::vector<int> ssl(10);
|
||||
size_t size = mg_get_ports(context, ports.size(), &ports[0], &ssl[0]);
|
||||
@@ -307,12 +295,9 @@ CivetServer::getListeningPorts()
|
||||
return ports;
|
||||
}
|
||||
|
||||
|
||||
CivetServer::CivetConnection::CivetConnection() {
|
||||
postData = NULL;
|
||||
postDataLen = 0;
|
||||
}
|
||||
|
||||
CivetServer::CivetConnection::~CivetConnection() {
|
||||
free(postData);
|
||||
}
|
||||
CivetServer::CivetConnection::~CivetConnection() { free(postData); }
|
||||
|
801
src/main.c
801
src/main.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user