/* Copyright (c) 2013-2014 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, rlen);
			if (rlen <= 0) {
				break;
			}
			wlen = mg_write(conn, buf, rlen);
			if (rlen != rlen) {
				break;
			}
			nlen += wlen;
		}
		mg_printf(conn, "\n\n");
		mg_printf(conn, "\n");
		return true;
	}
	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 = (size_t)req_info->content_length;
		char buf[1024];
		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, "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, rlen);
			if (rlen <= 0) {
				break;
			}
			wlen = mg_write(conn, buf, rlen);
			if (rlen != rlen) {
				break;
			}
			nlen += wlen;
		}
		mg_printf(conn, "\n\n");
		mg_printf(conn, "\n");
		return true;
	}
};
int
main(int argc, char *argv[])
{
	const char *options[] = {
	    "document_root", DOCUMENT_ROOT, "listening_ports", PORT, 0};
	CivetServer server(options);
	ExampleHandler h_ex;
	server.addHandler(EXAMPLE_URI, h_ex);
	ExitHandler h_exit;
	server.addHandler(EXIT_URI, h_exit);
	AHandler h_a;
	server.addHandler("/a", h_a);
	ABHandler h_ab;
	server.addHandler("/a/b", h_ab);
	FooHandler h_foo;
	server.addHandler("**.foo$", h_foo);
	printf("Browse files at http://localhost:%s/\n", PORT);
	printf("Run example at http://localhost:%s%s\n", PORT, EXAMPLE_URI);
	printf("Exit at http://localhost:%s%s\n", PORT, EXIT_URI);
	while (!exitNow) {
#ifdef _WIN32
		Sleep(1000);
#else
		sleep(1);
#endif
	}
	printf("Bye!\n");
	return 0;
}