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