summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2006-05-14 01:42:03 +0000
committerMarcus Boerger <helly@php.net>2006-05-14 01:42:03 +0000
commit5b44266a5f17681f855551cd55f8486e8033cdce (patch)
tree438c53ef119b32de93f017cd332248dcf20c99c7
parent0c09d4cb63930a79203481aa3168bd863d5df6f3 (diff)
downloadphp-git-5b44266a5f17681f855551cd55f8486e8033cdce.tar.gz
- MFH RFC2397 decoding
-rwxr-xr-xext/standard/tests/file/stream_rfc2397_003.gifbin0 -> 273 bytes
-rwxr-xr-xext/standard/tests/file/stream_rfc2397_003.phpt36
-rw-r--r--main/streams/memory.c16
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
new file mode 100755
index 0000000000..3dc4fc65f0
--- /dev/null
+++ b/ext/standard/tests/file/stream_rfc2397_003.gif
Binary files differ
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);