diff options
author | Marcus Boerger <helly@php.net> | 2006-05-14 01:42:03 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2006-05-14 01:42:03 +0000 |
commit | 5b44266a5f17681f855551cd55f8486e8033cdce (patch) | |
tree | 438c53ef119b32de93f017cd332248dcf20c99c7 | |
parent | 0c09d4cb63930a79203481aa3168bd863d5df6f3 (diff) | |
download | php-git-5b44266a5f17681f855551cd55f8486e8033cdce.tar.gz |
- MFH RFC2397 decoding
-rwxr-xr-x | ext/standard/tests/file/stream_rfc2397_003.gif | bin | 0 -> 273 bytes | |||
-rwxr-xr-x | ext/standard/tests/file/stream_rfc2397_003.phpt | 36 | ||||
-rw-r--r-- | main/streams/memory.c | 16 |
3 files changed, 50 insertions, 2 deletions
diff --git a/ext/standard/tests/file/stream_rfc2397_003.gif b/ext/standard/tests/file/stream_rfc2397_003.gif Binary files differnew file mode 100755 index 0000000000..3dc4fc65f0 --- /dev/null +++ b/ext/standard/tests/file/stream_rfc2397_003.gif diff --git a/ext/standard/tests/file/stream_rfc2397_003.phpt b/ext/standard/tests/file/stream_rfc2397_003.phpt new file mode 100755 index 0000000000..a4d019d182 --- /dev/null +++ b/ext/standard/tests/file/stream_rfc2397_003.phpt @@ -0,0 +1,36 @@ +--TEST-- +Stream: RFC2397 decoding data +--FILE-- +<?php + +$streams = array( + 'data://,A%20brief%20note', + 'data://application/vnd-xxx-query,select_vcount,fcol_from_fieldtable/local', + 'data://;base64,Zm9vYmFyIGZvb2Jhcg==', + 'stream_rfc2397_003.gif' => 'data://image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw +AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz +ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp +a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl +ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis +F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH +hhx4dbgYKAAA7', + ); + +foreach($streams as $original => $stream) +{ + if (is_string($original)) { + var_dump(file_get_contents(dirname(__FILE__) . '/' . $original) == file_get_contents($stream)); + } else { + var_dump(file_get_contents($stream)); + } +} + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +string(12) "A brief note" +string(40) "select_vcount,fcol_from_fieldtable/local" +string(13) "foobar foobar" +bool(true) +===DONE=== diff --git a/main/streams/memory.c b/main/streams/memory.c index 344b7c7a6c..decf5dcc49 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -21,6 +21,9 @@ #define _GNU_SOURCE #include "php.h" +PHPAPI int php_url_decode(char *str, int len); +PHPAPI unsigned char *php_base64_decode(const unsigned char *str, int length, int *ret_length); + /* Memory streams use a dynamic memory buffer to emulate a stream. * You can use php_stream_memory_open to create a readonly stream * from an existing memory buffer. @@ -564,7 +567,7 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, cha size_t mlen, dlen, plen, vlen; off_t newoffs; zval *meta = NULL; - int base64 = 0; + int base64 = 0, ilen; if (memcmp(path, "data:", 5)) { return NULL; @@ -654,7 +657,16 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, cha comma++; dlen--; /* store data */ - php_stream_temp_write(stream, comma, dlen TSRMLS_CC); + if (base64) { + comma = (char*)php_base64_decode((const unsigned char *)comma, dlen, &ilen); + php_stream_temp_write(stream, comma, ilen TSRMLS_CC); + efree(comma); + } else { + comma = estrndup(comma, dlen); + dlen = php_url_decode(comma, dlen); + php_stream_temp_write(stream, comma, dlen TSRMLS_CC); + efree(comma); + } php_stream_temp_seek(stream, 0, SEEK_SET, &newoffs TSRMLS_CC); /* set special stream stuff (enforce exact mode) */ vlen = strlen(mode); |