summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2001-08-25 15:57:42 +0000
committerZeev Suraski <zeev@php.net>2001-08-25 15:57:42 +0000
commit13ff183225ef9159a33b8489cbaab9685e4820da (patch)
treecdb17863950ceaadcb10619befa34f1c5bd29add
parentbc596544a18b3efc1c249c5ebe18f01c420a142c (diff)
downloadphp-git-13ff183225ef9159a33b8489cbaab9685e4820da.tar.gz
Move the trans-sid mechanism to use the output buffering mechanism.
Advantages: - Would work with the output buffering mechanism in general, and with output compression in particular - Should yield better performance (untested as of yet)
-rw-r--r--ext/session/php_session.h7
-rw-r--r--ext/session/session.c40
-rw-r--r--ext/standard/basic_functions.c4
-rw-r--r--ext/standard/url_scanner_ex.c11
-rw-r--r--ext/standard/url_scanner_ex.h2
-rw-r--r--ext/standard/url_scanner_ex.re11
-rw-r--r--main/output.c11
7 files changed, 52 insertions, 34 deletions
diff --git a/ext/session/php_session.h b/ext/session/php_session.h
index 18539685d8..453f3a7d82 100644
--- a/ext/session/php_session.h
+++ b/ext/session/php_session.h
@@ -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 *);
diff --git a/ext/session/session.c b/ext/session/session.c
index 538f9d1264..af3c63a4d5 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -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
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index dd3487e567..7f680af675 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -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
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c
index 35dff9f381..0c397cd2a6 100644
--- a/ext/standard/url_scanner_ex.c
+++ b/ext/standard/url_scanner_ex.c
@@ -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;
}
diff --git a/ext/standard/url_scanner_ex.h b/ext/standard/url_scanner_ex.h
index d5595570ae..7a90a6d7bf 100644
--- a/ext/standard/url_scanner_ex.h
+++ b/ext/standard/url_scanner_ex.h
@@ -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);
diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re
index 2bcc2a286b..b0dc0af4ee 100644
--- a/ext/standard/url_scanner_ex.re
+++ b/ext/standard/url_scanner_ex.re
@@ -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;
}
diff --git a/main/output.c b/main/output.c
index d8a10cfa6d..e78b9e2d5a 100644
--- a/main/output.c
+++ b/main/output.c
@@ -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;