From 64e6264676df26b3bd0fd3da6df2e130828b67d1 Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 27 Oct 2015 21:40:48 +0100 Subject: [PATCH] Add example how to handle PUT and POST in C++ --- examples/embedded_cpp/embedded_cpp.cpp | 92 +++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/examples/embedded_cpp/embedded_cpp.cpp b/examples/embedded_cpp/embedded_cpp.cpp index 07e7e4a5..30f7d91a 100644 --- a/examples/embedded_cpp/embedded_cpp.cpp +++ b/examples/embedded_cpp/embedded_cpp.cpp @@ -25,7 +25,7 @@ class ExampleHandler : public CivetHandler bool handleGet(CivetServer *server, struct mg_connection *conn) { - mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n"); mg_printf(conn, "\r\n"); mg_printf(conn, "

This is an example text from a C++ handler

\r\n"); @@ -51,7 +51,7 @@ class ExitHandler : public CivetHandler bool handleGet(CivetServer *server, struct mg_connection *conn) { - mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"); + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\n"); mg_printf(conn, "Bye!\n"); exitNow = true; return true; @@ -67,7 +67,7 @@ class AHandler : public CivetHandler 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, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n"); mg_printf(conn, ""); mg_printf(conn, "

This is the A handler for \"%s\" !

", method); if (CivetServer::getParam(conn, "param", s)) { @@ -98,7 +98,7 @@ class ABHandler : public CivetHandler bool handleGet(CivetServer *server, struct mg_connection *conn) { - mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n"); mg_printf(conn, ""); mg_printf(conn, "

This is the AB handler!!!

"); mg_printf(conn, "\n"); @@ -115,15 +115,91 @@ class FooHandler : public CivetHandler /* 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\n\r\n"); - mg_printf(conn, ""); - mg_printf(conn, "

This is the Foo handler!!!

"); + 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, - "

The request was:

%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, "\n"); + + return true; + } + bool + handlePost(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); + size_t rlen, wlen; + size_t nlen = 0; + size_t 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, "

This is the Foo POST handler!!!

\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; + } + 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); + size_t rlen, wlen; + size_t nlen = 0; + size_t 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, "

This is the Foo PUT handler!!!

\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; } };