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