/* Copyright (c) 2013-2017 the Civetweb developers
* Copyright (c) 2013 No Face Press, LLC
* License http://opensource.org/licenses/mit-license.php MIT License
*/
// Simple example program on how to use Embedded C++ interface.
#include "CivetServer.h"
#ifdef _WIN32
#include To see a page from the A handler click here To see a page from the A handler with a parameter "
"click here To see a page from the A/B handler click here To see a page from the *.foo handler click here To exit click here param set to %s param not set The request was:This is an example text from a C++ handler
\r\n");
mg_printf(conn,
"This is the A handler for \"%s\" !
", method);
if (CivetServer::getParam(conn, "param", s)) {
mg_printf(conn, "This is the AB handler!!!
");
mg_printf(conn, "\n");
return true;
}
};
class FooHandler : public CivetHandler
{
public:
bool
handleGet(CivetServer *server, struct mg_connection *conn)
{
/* Handler may access the request info using mg_get_request_info */
const struct mg_request_info *req_info = mg_get_request_info(conn);
mg_printf(conn,
"HTTP/1.1 200 OK\r\nContent-Type: "
"text/html\r\nConnection: close\r\n\r\n");
mg_printf(conn, "\n");
mg_printf(conn, "This is the Foo GET handler!!!
\n");
mg_printf(conn,
"%s %s HTTP/%s
The request was:
%s %s HTTP/%s\n", req_info->request_method, req_info->uri, req_info->http_version); mg_printf(conn, "
Content Length: %li
\n", (long)tlen); mg_printf(conn, "\n"); while (nlen < tlen) { rlen = tlen - nlen; if (rlen > sizeof(buf)) { rlen = sizeof(buf); } rlen = mg_read(conn, buf, (size_t)rlen); if (rlen <= 0) { break; } wlen = mg_write(conn, buf, (size_t)rlen); if (rlen != rlen) { break; } nlen += wlen; } mg_printf(conn, "\n\n"); mg_printf(conn, "\n"); return true; } #define fopen_recursive fopen bool handlePut(CivetServer *server, struct mg_connection *conn) { /* Handler may access the request info using mg_get_request_info */ const struct mg_request_info *req_info = mg_get_request_info(conn); long long rlen, wlen; long long nlen = 0; long long tlen = req_info->content_length; FILE * f; char buf[1024]; int fail = 0; #ifdef _WIN32 _snprintf(buf, sizeof(buf), "D:\\somewhere\\%s\\%s", req_info->remote_user, req_info->local_uri); buf[sizeof(buf)-1] = 0; if (strlen(buf)>255) { /* Windows will not work with path > 260 (MAX_PATH), unless we use * the unicode API. However, this is just an example code: A real * code will probably never store anything to D:\\somewhere and * must be adapted to the specific needs anyhow. */ fail = 1; f = NULL; } else { f = fopen_recursive(buf, "wb"); } #else snprintf(buf, sizeof(buf), "~/somewhere/%s/%s", req_info->remote_user, req_info->local_uri); buf[sizeof(buf)-1] = 0; if (strlen(buf)>1020) { /* The string is too long and probably truncated. Make sure an * UTF-8 string is never truncated between the UTF-8 code bytes. * This example code must be adapted to the specific needs. */ fail = 1; f = NULL; } else { f = fopen_recursive(buf, "w"); } #endif if (!f) { fail = 1; } else { while (nlen < tlen) { rlen = tlen - nlen; if (rlen > sizeof(buf)) { rlen = sizeof(buf); } rlen = mg_read(conn, buf, (size_t)rlen); if (rlen <= 0) { fail = 1; break; } wlen = fwrite(buf, 1, (size_t)rlen, f); if (rlen != rlen) { fail = 1; break; } nlen += wlen; } fclose(f); } if (fail) { mg_printf(conn, "HTTP/1.1 409 Conflict\r\n" "Content-Type: text/plain\r\n" "Connection: close\r\n\r\n"); } else { mg_printf(conn, "HTTP/1.1 201 Created\r\n" "Content-Type: text/plain\r\n" "Connection: close\r\n\r\n"); } return true; } }; int main(int argc, char *argv[]) { const char *options[] = { "document_root", DOCUMENT_ROOT, "listening_ports", PORT, 0}; std::vector