On Mon, 23 Aug 2004 07:45:17 -0700
"Guy Ferraiolo" <[EMAIL PROTECTED]> wrote:
> That's great. I have a need for non-numeric random substitution and I
> don't want to do something contradictory.
I was hoping for a few days dedicated to flood development, but I had to
settle for a few hours. Somehow I managed to prepare a patch which brings this
functionality (see attachment). You can use fixed size random numbers like
this:
<url requesttemplate="http://www.x.com/test?id=${(-6:27)=id}" />
If you omit colon like this:
<url requesttemplate="http://www.x.com/test?id=${(128)=id}" />
It will result in a range from 0 to 128.
This patch is very simple, and nearly offers no protection against wrong
ranges (like 543:-256), so use with care. If there are no objections it will
be commited, as soon, as I prepare paragraph describing this feature.
regards,
Jacek Prucia
--- flood_round_robin.c.orig 2004-09-03 17:51:27.000000000 +0200
+++ flood_round_robin.c 2004-09-03 17:51:06.000000000 +0200
@@ -158,6 +158,58 @@
else
data = NULL;
}
+ else if (*(cur+match[1].rm_so) == '(')
+ {
+ if (set)
+ {
+ /* fixed range random value. */
+ char *colon, *ptr;
+ int offs = 0;
+ int range_beg = 0;
+ int range_end = 0;
+ int range_size = 0;
+
+ while(*(cur + match[1].rm_so + offs) != ')') {
+ if (match[1].rm_so + offs > match[1].rm_eo) {
+ offs = 0;
+ data = NULL;
+ break;
+ }
+ offs++;
+ }
+
+ if(offs)
+ {
+ ptr = cur + match[1].rm_so + offs;
+ colon = strchr(cur + match[1].rm_so, ':');
+ if(colon && colon < ptr) {
+ range_beg = strtol(cur + match[1].rm_so + 1, &colon,
10);
+ range_end = strtol(colon + 1, &ptr, 10);
+ } else {
+ range_end = strtol(cur + match[1].rm_so + 1, &ptr, 10);
+ if(range_end < 1) {
+ range_end = 1;
+ }
+ }
+ range_size = abs(range_beg) + abs(range_end) + 1;
+#if FLOOD_USE_RAND
+ data = apr_psprintf(rp->pool, "%d", (rand() % range_size)
+ range_beg);
+#elif FLOOD_USE_RAND48
+ data = apr_psprintf(rp->pool, "%ld", (lrand48() %
range_size) + range_beg);
+#elif FLOOD_USE_RANDOM
+ data = apr_psprintf(rp->pool, "%ld", ((long)random() %
range_size) + range_beg);
+#endif
+ }
+ else
+ data = NULL;
+
+ matchsize = match[1].rm_eo - match[1].rm_so - offs - 2;
+ apr_hash_set(rp->state, cur + match[1].rm_so + offs + 2,
matchsize, data);
+
+ }
+ else
+ data = NULL;
+ }
else
{
matchsize = match[1].rm_eo - match[1].rm_so;