]> granicus.if.org Git - php/commitdiff
Move the trans-sid mechanism to use the output buffering mechanism.
authorZeev Suraski <zeev@php.net>
Sat, 25 Aug 2001 15:57:42 +0000 (15:57 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 25 Aug 2001 15:57:42 +0000 (15:57 +0000)
Advantages:
- Would work with the output buffering mechanism in general, and with
  output compression in particular
- Should yield better performance (untested as of yet)

ext/session/php_session.h
ext/session/session.c
ext/standard/basic_functions.c
ext/standard/url_scanner_ex.c
ext/standard/url_scanner_ex.h
ext/standard/url_scanner_ex.re
main/output.c

index 18539685d81951e08978bff93c6f0a010e388550..453f3a7d82f01711f1741db81860b188474aa5b1 100644 (file)
@@ -144,17 +144,16 @@ typedef struct ps_serializer_struct {
        { #x, PS_SERIALIZER_ENCODE_NAME(x), PS_SERIALIZER_DECODE_NAME(x) }
 
 #ifdef TRANS_SID
-void session_adapt_uris(const char *, size_t, char **, size_t * TSRMLS_DC);
+void session_adapt_uris(const char *, size_t, char **, size_t *,zend_bool TSRMLS_DC);
 void session_adapt_url(const char *, size_t, char **, size_t * TSRMLS_DC);
-void session_adapt_flush(int (*)(const char *, uint TSRMLS_DC) TSRMLS_DC);
 #else
-#define session_adapt_uris(a,b,c,d) do { } while(0)
+#define session_adapt_uris(a,b,c,d,e) do { } while(0)
 #define session_adapt_url(a,b,c,d) do { } while(0)
-#define session_adapt_flush(a) do { } while(0)
 #endif
 
 void php_set_session_var(char *name, size_t namelen, zval *state_val,HashTable *var_hash TSRMLS_DC);
 int php_get_session_var(char *name, size_t namelen, zval ***state_var TSRMLS_DC);
+void php_session_start_output_handler(INIT_FUNC_ARGS, uint chunk_size);
 
 int php_session_register_module(ps_module *);
 
index 538f9d126440c1e0dbde706f9c05f26baa7c133c..af3c63a4d5596a602453e6ffe166367803000b68 100644 (file)
@@ -523,6 +523,7 @@ static void php_session_initialize(TSRMLS_D)
        }
 }
 
+
 static void php_session_save_current_state(TSRMLS_D)
 {
        char *val;
@@ -1280,25 +1281,18 @@ PHP_FUNCTION(session_destroy)
 /* }}} */
 
 #ifdef TRANS_SID
-void session_adapt_uris(const char *src, size_t srclen, char **new, size_t *newlen TSRMLS_DC)
+void session_adapt_uris(const char *src, size_t srclen, char **new, size_t *newlen, zend_bool do_flush TSRMLS_DC)
 {
-       if (PS(define_sid) && (PS(session_status) == php_session_active))
-               *new = url_adapt_ext_ex(src, srclen, PS(session_name), PS(id), newlen TSRMLS_CC);
+       if (PS(define_sid) && (PS(session_status) == php_session_active)) {
+               *new = url_adapt_ext_ex(src, srclen, PS(session_name), PS(id), newlen, do_flush TSRMLS_CC);
+       }
 }
 
 void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC)
 {
-       if (PS(define_sid) && (PS(session_status) == php_session_active))
+       if (PS(define_sid) && (PS(session_status) == php_session_active)) {
                *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC);
-}
-
-void session_adapt_flush(int (*write)(const char *, uint TSRMLS_DC) TSRMLS_DC)
-{
-       char *str;
-       size_t len;
-       
-       str = url_adapt_flush(&len TSRMLS_CC);
-       if (str) write(str, len TSRMLS_CC);
+       }
 }
 
 #endif
@@ -1426,6 +1420,26 @@ PHP_MINFO_FUNCTION(session)
        DISPLAY_INI_ENTRIES();
 }
 
+
+static void php_session_output_handler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC)
+{
+       zend_bool do_flush;
+       
+       if (mode&PHP_OUTPUT_HANDLER_END) {
+               do_flush=1;
+       }
+       session_adapt_uris(output, output_len, handled_output, handled_output_len, do_flush TSRMLS_CC);
+}
+
+
+void php_session_start_output_handler(INIT_FUNC_ARGS, uint chunk_size)
+{
+       PHP_RINIT(url_scanner)(INIT_FUNC_ARGS_PASSTHRU);
+       PHP_RINIT(url_scanner_ex)(INIT_FUNC_ARGS_PASSTHRU);
+       php_start_ob_buffer(NULL, chunk_size TSRMLS_CC);
+       php_ob_set_internal_handler(php_session_output_handler, chunk_size TSRMLS_CC);
+}
+
 /*
  * Local variables:
  * tab-width: 4
index dd3487e567bcdde9d26519e150c48d89d01a4dc4..7f680af6750b5a3c62c0f7983d7241e8227aac2d 100644 (file)
@@ -28,6 +28,7 @@
 #include "php_math.h"
 #include "php_incomplete_class.h"
 #include "ext/standard/info.h"
+#include "ext/session/php_session.h"
 #include "zend_operators.h"
 #include <stdarg.h>
 #include <stdlib.h>
@@ -882,8 +883,7 @@ PHP_RINIT_FUNCTION(basic)
 
 #ifdef TRANS_SID
        if (BG(use_trans_sid)) {
-               PHP_RINIT(url_scanner)(INIT_FUNC_ARGS_PASSTHRU);
-               PHP_RINIT(url_scanner_ex)(INIT_FUNC_ARGS_PASSTHRU);
+               php_session_start_output_handler(INIT_FUNC_ARGS_PASSTHRU, 4096);
        }
 #endif
 
index 35dff9f381b952fc1ebb83066b12060e471b2bdf..0c397cd2a6dcfbdbb403cfd68a323da9a217026a 100644 (file)
@@ -836,7 +836,7 @@ char *url_adapt_single_url(const char *url, size_t urllen, const char *name, con
        return buf.c;
 }
 
-char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC)
+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 *ret;
        url_adapt_state_ex_t *ctx;
@@ -848,9 +848,16 @@ char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
        mainloop(ctx, src, srclen TSRMLS_CC);
 
        *newlen = ctx->result.len;
-       if (!ctx->result.c) 
+       if (!ctx->result.c) {
                smart_str_appendl(&ctx->result, "", 0);
+       }
        smart_str_0(&ctx->result);
+       if (do_flush) {
+               smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
+               *newlen += ctx->buf.len;
+               ctx->buf.c = 0;
+               ctx->buf.len = 0;
+       }
        ctx->result.len = 0;
        return ctx->result.c;
 }
index d5595570ae4d53274fa1264a28a65d8b02e115d5..7a90a6d7bf4a0ff9b243a9158cc9da3a8cd91f70 100644 (file)
@@ -24,7 +24,7 @@ PHP_MSHUTDOWN_FUNCTION(url_scanner_ex);
 PHP_RSHUTDOWN_FUNCTION(url_scanner_ex);
 PHP_RINIT_FUNCTION(url_scanner_ex);
 
-char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC);
+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_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC);
 
index 2bcc2a286b9eebb04d4ffd626c94a0a88ce9c539..b0dc0af4eed1d20ca6ecb24369a5efca7c9df824 100644 (file)
@@ -352,7 +352,7 @@ char *url_adapt_single_url(const char *url, size_t urllen, const char *name, con
        return buf.c;
 }
 
-char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC)
+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 *ret;
        url_adapt_state_ex_t *ctx;
@@ -364,9 +364,16 @@ char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
        mainloop(ctx, src, srclen TSRMLS_CC);
 
        *newlen = ctx->result.len;
-       if (!ctx->result.c) 
+       if (!ctx->result.c) {
                smart_str_appendl(&ctx->result, "", 0);
+       }
        smart_str_0(&ctx->result);
+       if (do_flush) {
+               smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
+               *newlen += ctx->buf.len;
+               ctx->buf.c = 0;
+               ctx->buf.len = 0;
+       }
        ctx->result.len = 0;
        return ctx->result.c;
 }
index d8a10cfa6d653f36e57732dd4531128cb738948e..e78b9e2d5a93f73d871d25bf9e7b7f17cb8af75b 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "php.h"
 #include "ext/standard/head.h"
-#include "ext/session/php_session.h"
 #include "ext/standard/basic_functions.h"
 #include "SAPI.h"
 
@@ -253,10 +252,6 @@ PHPAPI void php_end_ob_buffers(zend_bool send_buffer TSRMLS_DC)
        while (OG(ob_nesting_level)!=0) {
                php_end_ob_buffer(send_buffer, 0 TSRMLS_CC);
        }
-
-       if (!OG(disable_output) && send_buffer && BG(use_trans_sid)) {
-               session_adapt_flush(OG(php_header_write) TSRMLS_CC);
-       }
 }
 /* }}} */
 
@@ -427,11 +422,7 @@ static int php_ub_body_write_no_header(const char *str, uint str_length TSRMLS_D
 
        if (OG(disable_output)) {
                return 0;
-       }
-       if (BG(use_trans_sid)) {
-               session_adapt_uris(str, str_length, &newstr, &new_length TSRMLS_CC);
-       }
-               
+       }               
        if (newstr) {
                str = newstr;
                str_length = new_length;