@@ -112,11 +112,6 @@ ZEND_BEGIN_ARG_INFO(arginfo_iconv, 0)
112
112
ZEND_ARG_INFO (0 , str )
113
113
ZEND_END_ARG_INFO ()
114
114
115
- ZEND_BEGIN_ARG_INFO (arginfo_ob_iconv_handler , 0 )
116
- ZEND_ARG_INFO (0 , contents )
117
- ZEND_ARG_INFO (0 , status )
118
- ZEND_END_ARG_INFO ()
119
-
120
115
ZEND_BEGIN_ARG_INFO (arginfo_iconv_set_encoding , 0 )
121
116
ZEND_ARG_INFO (0 , type )
122
117
ZEND_ARG_INFO (0 , charset )
@@ -132,7 +127,6 @@ ZEND_END_ARG_INFO()
132
127
*/
133
128
const zend_function_entry iconv_functions [] = {
134
129
PHP_RAW_NAMED_FE (iconv ,php_if_iconv , arginfo_iconv )
135
- PHP_FE (ob_iconv_handler , arginfo_ob_iconv_handler )
136
130
PHP_FE (iconv_get_encoding , arginfo_iconv_get_encoding )
137
131
PHP_FE (iconv_set_encoding , arginfo_iconv_set_encoding )
138
132
PHP_FE (iconv_strlen , arginfo_iconv_strlen )
@@ -214,6 +208,10 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
214
208
215
209
static php_iconv_err_t php_iconv_stream_filter_register_factory (TSRMLS_D );
216
210
static php_iconv_err_t php_iconv_stream_filter_unregister_factory (TSRMLS_D );
211
+
212
+ static int php_iconv_output_conflict (const char * handler_name , size_t handler_name_len TSRMLS_DC );
213
+ static php_output_handler * php_iconv_output_handler_init (const char * name , size_t name_len , size_t chunk_size , int flags TSRMLS_DC );
214
+ static int php_iconv_output_handler (void * * nothing , php_output_context * output_context );
217
215
/* }}} */
218
216
219
217
/* {{{ static globals */
@@ -278,6 +276,9 @@ PHP_MINIT_FUNCTION(miconv)
278
276
return FAILURE ;
279
277
}
280
278
279
+ php_output_handler_alias_register (ZEND_STRL ("ob_iconv_handler" ), php_iconv_output_handler_init TSRMLS_CC );
280
+ php_output_handler_conflict_register (ZEND_STRL ("ob_iconv_handler" ), php_iconv_output_conflict TSRMLS_CC );
281
+
281
282
return SUCCESS ;
282
283
}
283
284
/* }}} */
@@ -312,6 +313,62 @@ PHP_MINFO_FUNCTION(miconv)
312
313
}
313
314
/* }}} */
314
315
316
+ static int php_iconv_output_conflict (const char * handler_name , size_t handler_name_len TSRMLS_DC )
317
+ {
318
+ if (php_output_get_level (TSRMLS_C )) {
319
+ if (php_output_handler_conflict (handler_name , handler_name_len , ZEND_STRL ("ob_iconv_handler" ) TSRMLS_CC )
320
+ || php_output_handler_conflict (handler_name , handler_name_len , ZEND_STRL ("mb_output_handler" ) TSRMLS_CC )) {
321
+ return FAILURE ;
322
+ }
323
+ }
324
+ return SUCCESS ;
325
+ }
326
+
327
+ static php_output_handler * php_iconv_output_handler_init (const char * handler_name , size_t handler_name_len , size_t chunk_size , int flags TSRMLS_DC )
328
+ {
329
+ return php_output_handler_create_internal (handler_name , handler_name_len , php_iconv_output_handler , chunk_size , flags TSRMLS_CC );
330
+ }
331
+
332
+ static int php_iconv_output_handler (void * * nothing , php_output_context * output_context )
333
+ {
334
+ char * s , * content_type , * mimetype = NULL ;
335
+ int output_status , mimetype_len = 0 ;
336
+ PHP_OUTPUT_TSRMLS (output_context );
337
+
338
+ if (output_context -> op & PHP_OUTPUT_HANDLER_START ) {
339
+ output_status = php_output_get_status (TSRMLS_C );
340
+ if (output_status & PHP_OUTPUT_SENT ) {
341
+ return FAILURE ;
342
+ }
343
+
344
+ if (SG (sapi_headers ).mimetype && !strncasecmp (SG (sapi_headers ).mimetype , "text/" , 5 )) {
345
+ if ((s = strchr (SG (sapi_headers ).mimetype ,';' )) == NULL ){
346
+ mimetype = SG (sapi_headers ).mimetype ;
347
+ } else {
348
+ mimetype = SG (sapi_headers ).mimetype ;
349
+ mimetype_len = s - SG (sapi_headers ).mimetype ;
350
+ }
351
+ } else if (SG (sapi_headers ).send_default_content_type ) {
352
+ mimetype = SG (default_mimetype ) ? SG (default_mimetype ) : SAPI_DEFAULT_MIMETYPE ;
353
+ }
354
+
355
+ if (mimetype != NULL && !(output_context -> op & PHP_OUTPUT_HANDLER_CLEAN )) {
356
+ int len = spprintf (& content_type , 0 , "Content-Type: %.*s; charset=%s" , mimetype_len ?mimetype_len :strlen (mimetype ), mimetype , ICONVG (output_encoding ));
357
+ if (content_type && SUCCESS == sapi_add_header (content_type , len , 0 )) {
358
+ SG (sapi_headers ).send_default_content_type = 0 ;
359
+ php_output_handler_hook (PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE , NULL TSRMLS_CC );
360
+ }
361
+ }
362
+ }
363
+
364
+ if (output_context -> in .used ) {
365
+ output_context -> out .free = 1 ;
366
+ _php_iconv_show_error (php_iconv_string (output_context -> in .data , output_context -> in .used , & output_context -> out .data , & output_context -> out .used , ICONVG (output_encoding ), ICONVG (internal_encoding )), ICONVG (output_encoding ), ICONVG (internal_encoding ) TSRMLS_CC );
367
+ }
368
+
369
+ return SUCCESS ;
370
+ }
371
+
315
372
/* {{{ _php_iconv_appendl() */
316
373
static php_iconv_err_t _php_iconv_appendl (smart_str * d , const char * s , size_t l , iconv_t cd )
317
374
{
@@ -1131,7 +1188,7 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
1131
1188
goto out ;
1132
1189
}
1133
1190
break ;
1134
-
1191
+
1135
1192
default :
1136
1193
err = PHP_ICONV_ERR_UNKNOWN ;
1137
1194
goto out ;
@@ -1725,7 +1782,7 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
1725
1782
break ;
1726
1783
1727
1784
case '\n' :
1728
- scan_stat = 8 ;
1785
+ scan_stat = 8 ;
1729
1786
break ;
1730
1787
1731
1788
case '=' : /* first letter of an encoded chunk */
@@ -2308,58 +2365,6 @@ PHP_NAMED_FUNCTION(php_if_iconv)
2308
2365
}
2309
2366
/* }}} */
2310
2367
2311
- /* {{{ proto string ob_iconv_handler(string contents, int status)
2312
- Returns str in output buffer converted to the iconv.output_encoding character set */
2313
- PHP_FUNCTION (ob_iconv_handler )
2314
- {
2315
- char * out_buffer , * content_type , * mimetype = NULL , * s ;
2316
- zval * zv_string ;
2317
- size_t out_len ;
2318
- int mimetype_alloced = 0 ;
2319
- long status ;
2320
-
2321
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "zl" , & zv_string , & status ) == FAILURE )
2322
- return ;
2323
-
2324
- convert_to_string (zv_string );
2325
-
2326
- if (SG (sapi_headers ).mimetype &&
2327
- strncasecmp (SG (sapi_headers ).mimetype , "text/" , 5 ) == 0 ) {
2328
- if ((s = strchr (SG (sapi_headers ).mimetype ,';' )) == NULL ){
2329
- mimetype = SG (sapi_headers ).mimetype ;
2330
- } else {
2331
- mimetype = estrndup (SG (sapi_headers ).mimetype , s - SG (sapi_headers ).mimetype );
2332
- mimetype_alloced = 1 ;
2333
- }
2334
- } else if (SG (sapi_headers ).send_default_content_type ) {
2335
- mimetype = (SG (default_mimetype ) ? SG (default_mimetype ) : SAPI_DEFAULT_MIMETYPE );
2336
- }
2337
- if (mimetype != NULL ) {
2338
- php_iconv_err_t err = php_iconv_string (Z_STRVAL_P (zv_string ),
2339
- Z_STRLEN_P (zv_string ), & out_buffer , & out_len ,
2340
- ICONVG (output_encoding ), ICONVG (internal_encoding ));
2341
- _php_iconv_show_error (err , ICONVG (output_encoding ), ICONVG (internal_encoding ) TSRMLS_CC );
2342
- if (out_buffer != NULL ) {
2343
- int len = spprintf (& content_type , 0 , "Content-Type:%s; charset=%s" , mimetype , ICONVG (output_encoding ));
2344
- if (content_type && sapi_add_header (content_type , len , 0 ) != FAILURE ) {
2345
- SG (sapi_headers ).send_default_content_type = 0 ;
2346
- }
2347
- if (mimetype_alloced ) {
2348
- efree (mimetype );
2349
- }
2350
- RETURN_STRINGL (out_buffer , out_len , 0 );
2351
- }
2352
- if (mimetype_alloced ) {
2353
- efree (mimetype );
2354
- }
2355
- }
2356
-
2357
- zval_dtor (return_value );
2358
- * return_value = * zv_string ;
2359
- zval_copy_ctor (return_value );
2360
- }
2361
- /* }}} */
2362
-
2363
2368
/* {{{ proto bool iconv_set_encoding(string type, string charset)
2364
2369
Sets internal encoding and output encoding for ob_iconv_handler() */
2365
2370
PHP_FUNCTION (iconv_set_encoding )
@@ -2488,7 +2493,7 @@ static int php_iconv_stream_filter_append_bucket(
2488
2493
char * pd , * pt ;
2489
2494
size_t ocnt , prev_ocnt , icnt , tcnt ;
2490
2495
size_t initial_out_buf_size ;
2491
-
2496
+
2492
2497
if (ps == NULL ) {
2493
2498
initial_out_buf_size = 64 ;
2494
2499
icnt = 1 ;
@@ -2784,7 +2789,7 @@ static php_stream_filter *php_iconv_stream_filter_factory_create(const char *nam
2784
2789
pefree (inst , persistent );
2785
2790
}
2786
2791
2787
- return retval ;
2792
+ return retval ;
2788
2793
}
2789
2794
/* }}} */
2790
2795
0 commit comments