瀏覽代碼

C++ Wrapper: Store post data per connection instead of per server

Fix #2 as proposed on June 16 2014 - see:
See https://groups.google.com/forum/#!topic/civetweb/ri0mNRJ_5-4
bel 11 年之前
父節點
當前提交
db1e1eb028
共有 2 個文件被更改,包括 32 次插入21 次删除
  1. 18 4
      include/CivetServer.h
  2. 14 17
      src/CivetServer.cpp

+ 18 - 4
include/CivetServer.h

@@ -9,10 +9,11 @@
 #ifdef __cplusplus
 
 #include "civetweb.h"
-#include <vector>
+#include <map>
 #include <string>
 
-class CivetServer; // forward declaration
+// forward declaration
+class CivetServer;
 
 /**
  * Basic interface for a URI request handler.  Handlers implementations
@@ -271,10 +272,23 @@ public:
     static void urlEncode(const char *src, size_t src_len, std::string &dst, bool append=false);
 
 protected:
+    class CivetConnection {
+    public:
+        char * postData;
+        unsigned long postDataLen;
+
+        CivetConnection() {
+            postData = NULL;
+            postDataLen = 0;
+        }
+
+        ~CivetConnection() {
+            free(postData);
+        }
+    };
 
     struct mg_context *context;
-    char * postData;
-    unsigned long postDataLen;
+    std::map<struct mg_connection *, class CivetConnection> connections;
 
 private:
     /**

+ 14 - 17
src/CivetServer.cpp

@@ -48,6 +48,7 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
     assert(request_info != NULL);
     CivetServer *me = (CivetServer*) (request_info->user_data);
     assert(me != NULL);
+    me->connections[conn] = CivetConnection();
 
     CivetHandler *handler = (CivetHandler *)cbdata;
 
@@ -68,11 +69,11 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
 
 CivetServer::CivetServer(const char **options,
                          const struct mg_callbacks *_callbacks) :
-    context(0), postData(0)
+    context(0)
 {
-    struct mg_callbacks callbacks;    
+    struct mg_callbacks callbacks;
     memset(&callbacks, 0, sizeof(callbacks));
-    
+
     if (_callbacks) {
         callbacks = *_callbacks;
         userCloseHandler = _callbacks->connection_close;
@@ -80,7 +81,6 @@ CivetServer::CivetServer(const char **options,
         userCloseHandler = NULL;
     }
     callbacks.connection_close = closeHandler;
-    postDataLen = 0;
     context = mg_start(&callbacks, this, options);
 }
 
@@ -97,11 +97,7 @@ void CivetServer::closeHandler(struct mg_connection *conn)
     assert(me != NULL);
 
     if (me->userCloseHandler) me->userCloseHandler(conn);
-    if (me->postData) {
-        free(me->postData);
-        me->postData = 0;
-    }
-    me->postDataLen = 0;
+    me->connections.erase(conn);
 }
 
 void CivetServer::addHandler(const std::string &uri, CivetHandler *handler)
@@ -176,22 +172,23 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
     assert(ri != NULL);
     CivetServer *me = (CivetServer*) (ri->user_data);
     assert(me != NULL);
+    CivetConnection &conobj = me->connections[conn];
 
-    if (me->postData != NULL) {
-        formParams = me->postData;
+    if (conobj.postData != NULL) {
+        formParams = conobj.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) {
                 // Add one extra character for 0-termination of strings
-                me->postData = (char*)malloc(con_len + 1);
-                if (me->postData != NULL) {
+                conobj.postData = (char*)malloc(con_len + 1);
+                if (conobj.postData != NULL) {
                     // malloc may fail for huge requests
-                    mg_read(conn, me->postData, con_len);
-                    me->postData[con_len] = 0;
-                    formParams = me->postData;
-                    me->postDataLen = con_len;
+                    mg_read(conn, conobj.postData, con_len);
+                    conobj.postData[con_len] = 0;
+                    formParams = conobj.postData;
+                    conobj.postDataLen = con_len;
                 }
             }
         }