handling length of data in POST requests
diff --git a/ChangeLog b/ChangeLog
index f6f275a..fd9794f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2023-04-11 Massimo Manghi <mxmanghi@apache.org>
+	* src/mod_rivet_ng/TclWebapache.c:
+	* src/mod_rivet_ng/rivetCore.c:
+	* src/mod_rivet_ng/rivet_types.h:
+	* src/request/apache_request.c:
+	* src/request/apache_request.h: handling length of data in POST requests. It
+	fixes ::rivet::raw_post when the POSTed data don't have variable sections (patch
+	provided by Scott Pitcher <scotty@svptechnicalservices.com.au>)
+
 2023-01-11 Massimo Manghi <mxmanghi@apache.org>
 	* src/TclWeb.h: also this include file had a CONST84 specifier that needed to
 	be converted as CONST86
diff --git a/src/mod_rivet_ng/TclWebapache.c b/src/mod_rivet_ng/TclWebapache.c
index b9191f1..1b9ed59 100644
--- a/src/mod_rivet_ng/TclWebapache.c
+++ b/src/mod_rivet_ng/TclWebapache.c
@@ -1079,7 +1079,7 @@
  */
 
 char *
-TclWeb_GetRawPost ( TclWebRequest *req )
+TclWeb_GetRawPost ( TclWebRequest *req, int *len )
 {
-    return ApacheRequest_get_raw_post(req->apachereq);
+    return ApacheRequest_get_raw_post(req->apachereq, len);
 }
diff --git a/src/mod_rivet_ng/rivetCore.c b/src/mod_rivet_ng/rivetCore.c
index 09a9d86..ffa4381 100644
--- a/src/mod_rivet_ng/rivetCore.c
+++ b/src/mod_rivet_ng/rivetCore.c
@@ -63,7 +63,7 @@
 #define COOKIES_ARRAY_NAME "cookies"
 
 extern module rivet_module;
-extern char* TclWeb_GetRawPost (TclWebRequest *req);
+extern char* TclWeb_GetRawPost (TclWebRequest *req, int *len);
 extern mod_rivet_globals* module_globals;
 extern apr_threadkey_t*  rivet_thread_key;
 
@@ -1274,18 +1274,19 @@
 TCL_CMD_HEADER ( Rivet_RawPost )
 {
     char*                   data;
+    int                     length;
     Tcl_Obj*                retval;
     rivet_thread_private*   private;
 
     THREAD_PRIVATE_DATA(private)
     CHECK_REQUEST_REC(private,"::rivet::raw_post")
 
-    data = TclWeb_GetRawPost(private->req);
+    data = TclWeb_GetRawPost(private->req, &length);
 
     if (!data) {
         data = "";
     }
-    retval = Tcl_NewStringObj(data, -1);
+    retval = Tcl_NewByteArrayObj((const unsigned char *)data, length);
     Tcl_SetObjResult(interp, retval);
     return TCL_OK;
 }
diff --git a/src/mod_rivet_ng/rivet_types.h b/src/mod_rivet_ng/rivet_types.h
index d3f30ca..8aebea0 100644
--- a/src/mod_rivet_ng/rivet_types.h
+++ b/src/mod_rivet_ng/rivet_types.h
@@ -75,6 +75,7 @@
     void*           hook_data;
     const char*     temp_dir;
     char*           raw_post;           /* Raw post data. */
+    int             raw_length;
     request_rec*    r;
     int             nargs;
 } ApacheRequest;
diff --git a/src/request/apache_request.c b/src/request/apache_request.c
index 0db8ec5..1cbda0d 100644
--- a/src/request/apache_request.c
+++ b/src/request/apache_request.c
@@ -37,7 +37,7 @@
 }
 
 static int
-util_read(ApacheRequest *req, const char **rbuf)
+util_read(ApacheRequest *req, const char **rbuf, int *rlen)
 {
     request_rec *r = req->r;
     int rc = OK;
@@ -61,6 +61,7 @@
         }
 
         *rbuf = apr_pcalloc(r->pool, length + 1);
+	*rlen = length;
 
         while ((len_read =
                     ap_get_client_block(r, buff, sizeof(buff))) > 0) {
@@ -215,6 +216,7 @@
     req->hook_data      = NULL;
     req->temp_dir       = NULL;
     req->raw_post       = NULL;
+    req->raw_length     = 0;
     req->parsed         = 0;
     req->r              = NULL;
     req->nargs          = 0;
@@ -234,6 +236,7 @@
     req->hook_data      = NULL;
     req->temp_dir       = NULL;
     req->raw_post       = NULL;
+    req->raw_length     = 0;
     req->parsed         = 0;
     req->r              = r;
     req->nargs          = 0;
@@ -432,6 +435,7 @@
 
     if (r->method_number == M_POST || r->method_number == M_PUT || r->method_number == M_DELETE) {
     	const char *data = NULL;
+	int length = 0;
 
     /*
         const char *type;
@@ -443,12 +447,13 @@
     	}
     */
 
-    	if ((rc = util_read(req, &data)) != OK) {
+    	if ((rc = util_read(req, &data, &length)) != OK) {
     	    return rc;
     	}
 
     	if (data) {
     	    req->raw_post = (char*) data; /* Give people a way of getting at the raw data. */
+    	    req->raw_length = length;
     	    split_to_parms(req, data);
     	}
     }
@@ -738,3 +743,9 @@
     return ApacheUtil_expires(req->r->pool, time_str, EXPIRES_HTTP);
 }
 
+char *ApacheRequest_get_raw_post(ApacheRequest *req, int *len)
+{
+    if (len)
+	*len = req->raw_length;
+    return req->raw_post;
+}
diff --git a/src/request/apache_request.h b/src/request/apache_request.h
index 0e05b95..f9e0c5e 100644
--- a/src/request/apache_request.h
+++ b/src/request/apache_request.h
@@ -121,7 +121,7 @@
 #define ApacheRequest_set_post_max(req, max) ((req)->post_max = (max))
 #define ApacheRequest_set_temp_dir(req, dir) ((req)->temp_dir = (dir))
 
-#define ApacheRequest_get_raw_post(req) ((req)->raw_post)
+char *ApacheRequest_get_raw_post(ApacheRequest *req, int *len);
 
 char *ApacheUtil_expires(apr_pool_t *p, char *time_str, int type);
 #define EXPIRES_HTTP   1