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

Reply via email to