hi,
i have made a small patch to the session-module which allows
the script to inject some user-defined data into the
url_rewriter.
why do i need this?
- i want to be able to open a 2nd browserwindow
- this window will use the same session as the 1st one
- i need to be able to differentiate the two windows on the
PHP side
right now the session module can "only" store one cookie (or
one info in trans-sid) my patch extends that to one
user-defined variable so that:
<?php
session_start();
session_set_userdata("thies", "1");
?>
<a href=test.php>test</a>
<form>
<input type=text>
<input type=submit>
</form>
will generate:
<a href="test.php?MOFL=34b91e4e3d0974c3722c1298172dfb08&thies=1">test</a>
<form><input type="hidden" name="MOFL"
value="34b91e4e3d0974c3722c1298172dfb08" /><input type="hidden"
name="thies" value="1" />
<input type=text>
<input type=submit>
</form>
as you can see "thies" = "1" will now be kept on the page.
so to open a new window _and_ have a unique identifier for
each openend window you would do something like:
--------------------------------------------------------------------
<?php
session_start();
if (! isset($_SESSION[ 'mydata' ])) {
$_SESSION[ 'mydata' ] = array();
}
if (isset($_REQUEST[ 'newwindow' ])) {
$windowid = time();
} elseif (isset($_REQUEST[ 'windowid' ])) {
$windowid = $_REQUEST[ 'windowid' ];
} else {
$windowid = 0;
}
session_set_userdata("windowid", (string) $windowid);
if (! isset($_SESSION[ 'mydata' ][ $windowid ])) {
$_SESSION[ 'mydata' ][ $windowid ] = 0;
}
echo "clicks in this window ". ++$_SESSION[ 'mydata' ][ $windowid ]."<br>";
?>
<a href="test.php?newwindow=1" target=0>New Window</a>
testform:
<form>
<input type=text>
<input type=submit>
</form>
--------------------------------------------------------------------
is it OK to commit?
tc
Index: session/php_session.h
===================================================================
RCS file: /repository/php4/ext/session/php_session.h,v
retrieving revision 1.75
diff -u -r1.75 php_session.h
--- session/php_session.h 30 Mar 2002 16:29:15 -0000 1.75
+++ session/php_session.h 25 Apr 2002 11:30:36 -0000
@@ -93,6 +93,8 @@
char *save_path;
char *session_name;
char *id;
+ char *udata_name;
+ char *udata_value;
char *extern_referer_chk;
char *entropy_file;
char *cache_limiter;
@@ -141,6 +143,7 @@
PHP_FUNCTION(session_set_cookie_params);
PHP_FUNCTION(session_get_cookie_params);
PHP_FUNCTION(session_write_close);
+PHP_FUNCTION(session_set_userdata);
#ifdef ZTS
#define PS(v) TSRMG(ps_globals_id, php_ps_globals *, v)
Index: session/session.c
===================================================================
RCS file: /repository/php4/ext/session/session.c,v
retrieving revision 1.296
diff -u -r1.296 session.c
--- session/session.c 30 Mar 2002 16:29:15 -0000 1.296
+++ session/session.c 25 Apr 2002 11:30:37 -0000
@@ -71,10 +71,13 @@
PHP_FE(session_set_cookie_params, NULL)
PHP_FE(session_get_cookie_params, NULL)
PHP_FE(session_write_close, NULL)
+ PHP_FE(session_set_userdata, NULL)
{NULL, NULL, NULL}
};
/* }}} */
+#define SAFE_STRING(s) ((s)?(s):"")
+
ZEND_DECLARE_MODULE_GLOBALS(ps);
static ps_module *_php_find_ps_module(char *name TSRMLS_DC);
@@ -84,7 +87,7 @@
static void php_session_output_handler(char *output, uint output_len, char
**handled_output, uint *handled_output_len, int mode TSRMLS_DC)
{
if ((PS(session_status) == php_session_active)) {
- *handled_output = url_adapt_ext_ex(output, output_len,
PS(session_name), PS(id), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END
? 1 : 0) TSRMLS_CC);
+ *handled_output = url_adapt_ext_ex(output, output_len,
+PS(session_name), PS(id), SAFE_STRING(PS(udata_name)), SAFE_STRING(PS(udata_value)),
+handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC);
} else {
*handled_output = NULL;
}
@@ -1403,11 +1406,32 @@
}
/* }}} */
+/* {{{ proto bool session_set_userdata(string var, string value)
+ sets one additional variable that will be added by in trans-SID mode */
+PHP_FUNCTION(session_set_userdata)
+{
+ zval **str;
+ zval **val;
+
+ if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &str, &val) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ if ((Z_TYPE_PP(str) != IS_STRING) || (Z_TYPE_PP(val) != IS_STRING)) {
+ php_error(E_ERROR,"session_set_userdata expects both parameters to be
+strings");
+ RETURN_FALSE;
+ }
+
+ PS(udata_name) = estrndup(Z_STRVAL_PP(str), Z_STRLEN_PP(str));
+ PS(udata_value) = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val));
+
+ RETURN_TRUE;
+}
+/* }}} */
PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t
*newlen TSRMLS_DC)
{
if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) {
- *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id),
newlen TSRMLS_CC);
+ *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id),
+PS(udata_name), PS(udata_value), newlen TSRMLS_CC);
}
}
@@ -1430,6 +1454,17 @@
if (PS(id)) {
efree(PS(id));
}
+
+ if (PS(udata_name)) {
+ efree(PS(udata_name));
+ PS(udata_name) = NULL;
+ }
+
+ if (PS(udata_value)) {
+ efree(PS(udata_value));
+ PS(udata_value) = NULL;
+ }
+
zend_hash_destroy(&PS(vars));
}
Index: standard/url_scanner_ex.c
===================================================================
RCS file: /repository/php4/ext/standard/url_scanner_ex.c,v
retrieving revision 1.53
diff -u -r1.53 url_scanner_ex.c
--- standard/url_scanner_ex.c 25 Apr 2002 09:02:01 -0000 1.53
+++ standard/url_scanner_ex.c 25 Apr 2002 11:30:37 -0000
@@ -1,5 +1,5 @@
-/* Generated by re2c 0.5 on Thu Apr 25 08:29:22 2002 */
-#line 1 "url_scanner_ex.re"
+/* Generated by re2c 0.5 on Thu Apr 25 13:23:42 2002 */
+#line 1 "/home/thies/devel/php4/ext/standard/url_scanner_ex.re"
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
@@ -95,7 +95,7 @@
#define YYLIMIT q
#define YYMARKER r
-static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str
*name, smart_str *val, const char *separator)
+static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str
+*name, smart_str *val, smart_str *udata_name, smart_str *udata_value, const char
+*separator)
{
register const char *p, *q;
const char *bash = NULL;
@@ -188,6 +188,12 @@
smart_str_append(dest, name);
smart_str_appendc(dest, '=');
smart_str_append(dest, val);
+ if (udata_name->len && udata_value->len) {
+ smart_str_appends(dest, separator);
+ smart_str_append(dest, udata_name);
+ smart_str_appendc(dest, '=');
+ smart_str_append(dest, udata_value);
+ }
if (bash)
smart_str_appendl(dest, bash, q - bash);
@@ -210,7 +216,7 @@
if (quotes)
smart_str_appendc(&ctx->result, type);
if (f) {
- append_modified_url(&ctx->val, &ctx->result, &ctx->q_name,
&ctx->q_value, PG(arg_separator).output);
+ append_modified_url(&ctx->val, &ctx->result, &ctx->q_name,
+&ctx->q_value, &ctx->q_udata_name, &ctx->q_udata_value, PG(arg_separator).output);
} else {
smart_str_append(&ctx->result, &ctx->val);
}
@@ -252,6 +258,14 @@
smart_str_appends(&ctx->result, "\" value=\"");
smart_str_append(&ctx->result, &ctx->q_value);
smart_str_appends(&ctx->result, "\" />");
+
+ if (ctx->q_udata_name.len) {
+ smart_str_appends(&ctx->result, "<input type=\"hidden\"
+name=\"");
+ smart_str_append(&ctx->result, &ctx->q_udata_name);
+ smart_str_appends(&ctx->result, "\" value=\"");
+ smart_str_append(&ctx->result, &ctx->q_udata_value);
+ smart_str_appends(&ctx->result, "\" />");
+ }
}
}
@@ -366,17 +380,17 @@
if(yybm[0+yych] & 128) goto yy15;
yy13: yych = *++YYCURSOR;
yy14:
-#line 265
+#line 279
{ passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; }
yy15: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy16: if(yybm[0+yych] & 128) goto yy15;
yy17:
-#line 266
+#line 280
{ passthru(STD_ARGS); goto state_plain; }
}
-#line 267
+#line 281
state_tag:
@@ -430,11 +444,11 @@
yy20: yych = *++YYCURSOR;
goto yy25;
yy21:
-#line 272
+#line 286
{ handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE ==
STATE_PLAIN) goto state_plain; else goto state_next_arg; }
yy22: yych = *++YYCURSOR;
yy23:
-#line 273
+#line 287
{ passthru(STD_ARGS); goto state_plain_begin; }
yy24: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
@@ -442,7 +456,7 @@
yy25: if(yybm[0+yych] & 128) goto yy24;
goto yy21;
}
-#line 274
+#line 288
state_next_arg_begin:
@@ -513,20 +527,20 @@
}
yy28: yych = *++YYCURSOR;
yy29:
-#line 282
+#line 296
{ passthru(STD_ARGS); handle_form(STD_ARGS); goto state_plain_begin; }
yy30: yych = *++YYCURSOR;
goto yy37;
yy31:
-#line 283
+#line 297
{ passthru(STD_ARGS); goto state_next_arg; }
yy32: yych = *++YYCURSOR;
yy33:
-#line 284
+#line 298
{ --YYCURSOR; STATE = STATE_ARG; goto state_arg; }
yy34: yych = *++YYCURSOR;
yy35:
-#line 285
+#line 299
{ passthru(STD_ARGS); goto state_plain_begin; }
yy36: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
@@ -534,7 +548,7 @@
yy37: if(yybm[0+yych] & 128) goto yy36;
goto yy31;
}
-#line 286
+#line 300
state_arg:
@@ -588,11 +602,11 @@
yy40: yych = *++YYCURSOR;
goto yy45;
yy41:
-#line 291
+#line 305
{ passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto
state_before_val; }
yy42: yych = *++YYCURSOR;
yy43:
-#line 292
+#line 306
{ passthru(STD_ARGS); STATE = STATE_NEXT_ARG; goto state_next_arg; }
yy44: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
@@ -600,7 +614,7 @@
yy45: if(yybm[0+yych] & 128) goto yy44;
goto yy41;
}
-#line 293
+#line 307
state_before_val:
@@ -655,12 +669,12 @@
if(yych == ' ') goto yy55;
if(yych == '=') goto yy53;
yy49:
-#line 299
+#line 313
{ --YYCURSOR; goto state_next_arg_begin; }
yy50: yych = *++YYCURSOR;
goto yy54;
yy51:
-#line 298
+#line 312
{ passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; }
yy52: yych = *++YYCURSOR;
goto yy49;
@@ -679,7 +693,7 @@
case 0: goto yy49;
}
}
-#line 300
+#line 314
@@ -749,7 +763,7 @@
yych = *(YYMARKER = ++YYCURSOR);
if(yych != '>') goto yy74;
yy61:
-#line 309
+#line 323
{ passthru(STD_ARGS); goto state_next_arg_begin; }
yy62: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
@@ -758,7 +772,7 @@
yy63: yych = *++YYCURSOR;
goto yy67;
yy64:
-#line 308
+#line 322
{ handle_val(STD_ARGS, 0, '"'); goto state_next_arg_begin; }
yy65: yych = *++YYCURSOR;
goto yy61;
@@ -778,7 +792,7 @@
}
yy71: yych = *++YYCURSOR;
yy72:
-#line 307
+#line 321
{ handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; }
yy73: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
@@ -787,10 +801,10 @@
if(yych >= '>') goto yy70;
yy75: yych = *++YYCURSOR;
yy76:
-#line 306
+#line 320
{ handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; }
}
-#line 310
+#line 324
stop:
@@ -804,18 +818,22 @@
}
-char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
char *value, size_t *newlen TSRMLS_DC)
+char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
+char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC)
{
smart_str surl = {0};
smart_str buf = {0};
smart_str sname = {0};
smart_str sval = {0};
+ smart_str aname = {0};
+ smart_str avalue = {0};
smart_str_setl(&surl, url, urllen);
smart_str_sets(&sname, name);
smart_str_sets(&sval, value);
+ smart_str_sets(&aname, udata_name);
+ smart_str_sets(&avalue, udata_value);
- append_modified_url(&surl, &buf, &sname, &sval, PG(arg_separator).output);
+ append_modified_url(&surl, &buf, &sname, &sval, &aname, &avalue,
+PG(arg_separator).output);
smart_str_0(&buf);
if (newlen) *newlen = buf.len;
@@ -823,7 +841,7 @@
return buf.c;
}
-char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
*value, size_t *newlen, zend_bool do_flush TSRMLS_DC)
+char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
+*value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush
+TSRMLS_DC)
{
url_adapt_state_ex_t *ctx;
char *retval;
@@ -832,6 +850,10 @@
smart_str_sets(&ctx->q_name, name);
smart_str_sets(&ctx->q_value, value);
+
+ smart_str_sets(&ctx->q_udata_name, udata_name);
+ smart_str_sets(&ctx->q_udata_value, udata_value);
+
xx_mainloop(ctx, src, srclen TSRMLS_CC);
*newlen = ctx->result.len;
Index: standard/url_scanner_ex.h
===================================================================
RCS file: /repository/php4/ext/standard/url_scanner_ex.h,v
retrieving revision 1.16
diff -u -r1.16 url_scanner_ex.h
--- standard/url_scanner_ex.h 28 Feb 2002 08:26:50 -0000 1.16
+++ standard/url_scanner_ex.h 25 Apr 2002 11:30:37 -0000
@@ -24,9 +24,9 @@
int php_url_scanner_ex_activate(TSRMLS_D);
int php_url_scanner_ex_deactivate(TSRMLS_D);
-char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char
*value, size_t *newlen, zend_bool do_flush TSRMLS_DC);
+char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char
+*value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush
+TSRMLS_DC);
-char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
char *value, size_t *newlen TSRMLS_DC);
+char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
+char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC);
char *url_adapt_flush(size_t * TSRMLS_DC);
@@ -45,6 +45,9 @@
/* The data which is appended to each relative URL */
smart_str q_name;
smart_str q_value;
+
+ smart_str q_udata_name;
+ smart_str q_udata_value;
char *lookup_data;
int state;
Index: standard/url_scanner_ex.re
===================================================================
RCS file: /repository/php4/ext/standard/url_scanner_ex.re,v
retrieving revision 1.48
diff -u -r1.48 url_scanner_ex.re
--- standard/url_scanner_ex.re 25 Apr 2002 06:30:09 -0000 1.48
+++ standard/url_scanner_ex.re 25 Apr 2002 11:30:37 -0000
@@ -96,7 +96,7 @@
#define YYLIMIT q
#define YYMARKER r
-static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str
*name, smart_str *val, const char *separator)
+static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str
+*name, smart_str *val, smart_str *udata_name, smart_str *udata_value, const char
+*separator)
{
register const char *p, *q;
const char *bash = NULL;
@@ -128,6 +128,12 @@
smart_str_append(dest, name);
smart_str_appendc(dest, '=');
smart_str_append(dest, val);
+ if (udata_name->len && udata_value->len) {
+ smart_str_appends(dest, separator);
+ smart_str_append(dest, udata_name);
+ smart_str_appendc(dest, '=');
+ smart_str_append(dest, udata_value);
+ }
if (bash)
smart_str_appendl(dest, bash, q - bash);
@@ -150,7 +156,7 @@
if (quotes)
smart_str_appendc(&ctx->result, type);
if (f) {
- append_modified_url(&ctx->val, &ctx->result, &ctx->q_name,
&ctx->q_value, PG(arg_separator).output);
+ append_modified_url(&ctx->val, &ctx->result, &ctx->q_name,
+&ctx->q_value, &ctx->q_udata_name, &ctx->q_udata_value, PG(arg_separator).output);
} else {
smart_str_append(&ctx->result, &ctx->val);
}
@@ -192,6 +198,14 @@
smart_str_appends(&ctx->result, "\" value=\"");
smart_str_append(&ctx->result, &ctx->q_value);
smart_str_appends(&ctx->result, "\" />");
+
+ if (ctx->q_udata_name.len) {
+ smart_str_appends(&ctx->result, "<input type=\"hidden\"
+name=\"");
+ smart_str_append(&ctx->result, &ctx->q_udata_name);
+ smart_str_appends(&ctx->result, "\" value=\"");
+ smart_str_append(&ctx->result, &ctx->q_udata_value);
+ smart_str_appends(&ctx->result, "\" />");
+ }
}
}
@@ -320,18 +334,22 @@
}
-char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
char *value, size_t *newlen TSRMLS_DC)
+char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const
+char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC)
{
smart_str surl = {0};
smart_str buf = {0};
smart_str sname = {0};
smart_str sval = {0};
+ smart_str aname = {0};
+ smart_str avalue = {0};
smart_str_setl(&surl, url, urllen);
smart_str_sets(&sname, name);
smart_str_sets(&sval, value);
+ smart_str_sets(&aname, udata_name);
+ smart_str_sets(&avalue, udata_value);
- append_modified_url(&surl, &buf, &sname, &sval, PG(arg_separator).output);
+ append_modified_url(&surl, &buf, &sname, &sval, &aname, &avalue,
+PG(arg_separator).output);
smart_str_0(&buf);
if (newlen) *newlen = buf.len;
@@ -339,7 +357,7 @@
return buf.c;
}
-char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
*value, size_t *newlen, zend_bool do_flush TSRMLS_DC)
+char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
+*value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush
+TSRMLS_DC)
{
url_adapt_state_ex_t *ctx;
char *retval;
@@ -348,6 +366,10 @@
smart_str_sets(&ctx->q_name, name);
smart_str_sets(&ctx->q_value, value);
+
+ smart_str_sets(&ctx->q_udata_name, udata_name);
+ smart_str_sets(&ctx->q_udata_value, udata_value);
+
xx_mainloop(ctx, src, srclen TSRMLS_CC);
*newlen = ctx->result.len;
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php