1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-07-29 21:01:13 +03:00

Issue #11: Method to get POST request parameters via C++ interface

This commit is contained in:
bel
2014-03-22 23:02:07 +01:00
parent ca5967bbdf
commit c9f266e3a7
3 changed files with 85 additions and 18 deletions

View File

@ -1,4 +1,4 @@
/*
/* Copyright (c) 2013-2014 the Civetweb developers
* Copyright (c) 2013 No Face Press, LLC
* License http://opensource.org/licenses/mit-license.php MIT License
*/
@ -12,7 +12,7 @@
#endif
#define DOCUMENT_ROOT "."
#define PORT "8888"
#define PORT "8081"
#define EXAMPLE_URI "/example"
#define EXIT_URI "/exit"
bool exitNow = false;
@ -47,14 +47,27 @@ public:
class AHandler: public CivetHandler
{
public:
bool handleGet(CivetServer *server, struct mg_connection *conn) {
private:
bool handleAll(const char * method, CivetServer *server, struct mg_connection *conn) {
std::string s = "";
mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
mg_printf(conn, "<html><body>");
mg_printf(conn, "<h2>This is the A handler!!!</h2>");
mg_printf(conn, "<h2>This is the A handler for \"%s\" !</h2>", method);
if (CivetServer::getParam(conn, "param", s)) {
mg_printf(conn, "<p>param set to %s</p>", s.c_str());
} else {
mg_printf(conn, "<p>param not set</p>");
}
mg_printf(conn, "</body></html>\n");
return true;
}
public:
bool handleGet(CivetServer *server, struct mg_connection *conn) {
return handleAll("GET", server, conn);
}
bool handlePost(CivetServer *server, struct mg_connection *conn) {
return handleAll("POST", server, conn);
}
};
class ABHandler: public CivetHandler

View File

@ -1,5 +1,6 @@
/*
/* Copyright (c) 2013-2014 the Civetweb developers
* Copyright (c) 2013 No Face Press, LLC
*
* License http://opensource.org/licenses/mit-license.php MIT License
*/
@ -272,6 +273,7 @@ public:
protected:
struct mg_context *context;
char * postData;
private:
/**
@ -285,6 +287,20 @@ private:
*/
static int requestHandler(struct mg_connection *conn, void *cbdata);
/**
* closeHandler(struct mg_connection *)
*
* Handles closing a request (internal handler)
*
* @param conn - the connection information
*/
static void closeHandler(struct mg_connection *conn);
/**
* Stores the user provided close handler
*/
void (*userCloseHandler)(struct mg_connection *conn);
};
#endif /* __cplusplus */

View File

@ -1,5 +1,6 @@
/*
/* Copyright (c) 2013-2014 the Civetweb developers
* Copyright (c) 2013 No Face Press, LLC
*
* License http://opensource.org/licenses/mit-license.php MIT License
*/
@ -44,7 +45,10 @@ bool CivetHandler::handleDelete(CivetServer *server, struct mg_connection *conn)
int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
{
struct mg_request_info *request_info = mg_get_request_info(conn);
assert(request_info != NULL);
CivetServer *me = (CivetServer*) (request_info->user_data);
assert(me != NULL);
CivetHandler *handler = (CivetHandler *)cbdata;
if (handler) {
@ -60,22 +64,23 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
}
return 0; // No handler found
}
CivetServer::CivetServer(const char **options,
const struct mg_callbacks *_callbacks) :
context(0)
context(0), postData(0)
{
if (_callbacks) {
context = mg_start(_callbacks, this, options);
} else {
struct mg_callbacks callbacks;
memset(&callbacks, 0, sizeof(callbacks));
context = mg_start(&callbacks, this, options);
if (_callbacks) {
callbacks = *_callbacks;
userCloseHandler = _callbacks->connection_close;
} else {
userCloseHandler = NULL;
}
callbacks.connection_close = closeHandler;
context = mg_start(&callbacks, this, options);
}
CivetServer::~CivetServer()
@ -83,6 +88,20 @@ CivetServer::~CivetServer()
close();
}
void CivetServer::closeHandler(struct mg_connection *conn)
{
struct mg_request_info *request_info = mg_get_request_info(conn);
assert(request_info != NULL);
CivetServer *me = (CivetServer*) (request_info->user_data);
assert(me != NULL);
if (me->userCloseHandler) me->userCloseHandler(conn);
if (me->postData) {
delete [] (me->postData);
me->postData = 0;
}
}
void CivetServer::addHandler(const std::string &uri, CivetHandler *handler)
{
mg_set_request_handler(context, uri.c_str(), requestHandler, handler);
@ -151,14 +170,33 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
std::string &dst, size_t occurrence)
{
const char *formParams = NULL;
mg_request_info * ri = mg_get_request_info(conn);
struct mg_request_info *ri = mg_get_request_info(conn);
assert(ri != NULL);
CivetServer *me = (CivetServer*) (ri->user_data);
assert(me != NULL);
if (ri) {
if (me->postData != NULL) {
formParams = me->postData;
} else {
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) {
me->postData = new char[con_len];
if (me->postData != NULL) {
/* NULL check is not required according to current C++ standard */
mg_read(conn, me->postData, con_len);
formParams = me->postData;
}
}
}
}
if (formParams == NULL) {
// get requests do store html <form> field values in the http query_string
formParams = ri->query_string;
}
if (formParams) {
if (formParams != NULL) {
return getParam(formParams, strlen(formParams), name, dst, occurrence);
}