helly           Sun May 14 01:06:09 2006 UTC

  Added files:                 (Branch: PHP_5_2)
    /php-src/ext/standard/tests/file    stream_rfc2397_002.phpt 

  Modified files:              
    /php-src/main/streams       memory.c 
  Log:
  - MFH RFC 2397 meta data handling
  
http://cvs.php.net/viewcvs.cgi/php-src/main/streams/memory.c?r1=1.8.2.6.2.1&r2=1.8.2.6.2.2&diff_format=u
Index: php-src/main/streams/memory.c
diff -u php-src/main/streams/memory.c:1.8.2.6.2.1 
php-src/main/streams/memory.c:1.8.2.6.2.2
--- php-src/main/streams/memory.c:1.8.2.6.2.1   Sat May 13 17:58:58 2006
+++ php-src/main/streams/memory.c       Sun May 14 01:06:09 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: memory.c,v 1.8.2.6.2.1 2006/05/13 17:58:58 helly Exp $ */
+/* $Id: memory.c,v 1.8.2.6.2.2 2006/05/14 01:06:09 helly Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -560,9 +560,11 @@
 {
        php_stream *stream;
        php_stream_temp_data *ts;
-       char *comma, *semi;
-       size_t mlen, dlen;
+       char *comma, *semi, *sep, *key;
+       size_t mlen, dlen, plen, vlen;
        off_t newoffs;
+       zval *meta = NULL;
+       int base64 = 0;
 
        if (memcmp(path, "data:", 5)) {
                return NULL;
@@ -581,22 +583,91 @@
                return NULL;
        }
 
-       if ((stream = php_stream_temp_create_rel(0, ~0u)) != NULL) {
-               if (comma != path) {
-                       /* meta info */
-                       mlen = comma - path;
-                       dlen -= mlen;
+       if (comma != path) {
+               /* meta info */
+               mlen = comma - path;
+               dlen -= mlen;
+               semi = memchr(path, ';', mlen);
+               sep = memchr(path, '/', mlen);
+               
+               if (!semi && !sep) {
+                       php_stream_wrapper_log_error(wrapper, options 
TSRMLS_CC, "rfc2397: illegal media type");
+                       return NULL;
+               }
+
+               MAKE_STD_ZVAL(meta);
+               array_init(meta);
+               if (!semi) { /* there is only a mime type */
+                       add_assoc_stringl(meta, "mediatype", path, mlen, 1);
+                       mlen = 0;
+               } else if (sep && sep < semi) { /* there is a mime type */
+                       plen = semi - path;
+                       add_assoc_stringl(meta, "mediatype", path, plen, 1);
+                       mlen -= plen;
+                       path += plen;
+               } else if (semi != path || mlen != sizeof(";base64")-1 || 
memcmp(path, ";base64", sizeof(";base64")-1)) { /* must be error since 
parameters are only allowed after mediatype */
+                       zval_ptr_dtor(&meta);
+                       php_stream_wrapper_log_error(wrapper, options 
TSRMLS_CC, "rfc2397: illegal media type");
+                       return NULL;
+               }
+               /* get parameters and potentially ';base64' */
+               while(semi && (semi == path)) {
+                       path++;
+                       mlen--;
+                       sep = memchr(path, '=', mlen);
                        semi = memchr(path, ';', mlen);
+                       if (!sep || (semi && semi < sep)) { /* must be 
';base64' or failure */
+                               if (mlen != sizeof("base64")-1 || memcmp(path, 
"base64", sizeof("base64")-1)) {
+                                       /* must be error since parameters are 
only allowed after mediatype and we have no '=' sign */
+                                       zval_ptr_dtor(&meta);
+                                       php_stream_wrapper_log_error(wrapper, 
options TSRMLS_CC, "rfc2397: illegal parameter");
+                                       return NULL;
+                               }
+                               base64 = 1;
+                               mlen -= sizeof("base64") - 1;
+                               path += sizeof("base64") - 1;
+                               break;
+                       }
+                       /* found parameter ... the heart of cs ppl lies in 
+1/-1 or was it +2 this time? */
+                       plen = sep - path;
+                       vlen = (semi ? semi - sep : mlen - plen) - 1 /* '=' */;
+                       key = estrndup(path, plen);
+                       add_assoc_stringl_ex(meta, key, plen + 1, sep + 1, 
vlen, 1);
+                       efree(key);
+                       plen += vlen + 1;
+                       mlen -= plen;
+                       path += plen;
                }
+               if (mlen) {
+                       zval_ptr_dtor(&meta);
+                       php_stream_wrapper_log_error(wrapper, options 
TSRMLS_CC, "rfc2397: illegal url");
+                       return NULL;
+               }
+       } else {
+               MAKE_STD_ZVAL(meta);
+               array_init(meta);
+       }
+       add_assoc_bool(meta, "base64", base64);
+
+       if ((stream = php_stream_temp_create_rel(0, ~0u)) != NULL) {
                /* skip ',' */
                comma++;
                dlen--;
                /* store data */
                php_stream_temp_write(stream, comma, dlen TSRMLS_CC);
                php_stream_temp_seek(stream, 0, SEEK_SET, &newoffs TSRMLS_CC);
+               /* set special stream stuff (enforce exact mode) */
+               vlen = strlen(mode);
+               if (vlen >= sizeof(stream->mode)) {
+                       vlen = sizeof(stream->mode) - 1;
+               }
+               memcpy(stream->mode, mode, vlen);
+               stream->mode[vlen] = '\0';
+               stream->ops = &php_stream_rfc2397_ops;
                ts = (php_stream_temp_data*)stream->abstract;
                assert(ts != NULL);
                ts->mode = mode && mode[0] == 'r' ? TEMP_STREAM_READONLY : 0;
+               ts->meta = meta;
        }
 
        return stream;

http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/file/stream_rfc2397_002.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/file/stream_rfc2397_002.phpt
+++ php-src/ext/standard/tests/file/stream_rfc2397_002.phpt
--TEST--
Stream: RFC2397 getting meta data
--FILE--
<?php

$streams = array(
        'data://,',
        'data://',
        'data://;base64,',
        'data://;base64',
        'data://foo,',
        'data://foo=bar,',
        'data://text/plain,',
        'data://text/plain;foo,',
        'data://text/plain;foo=bar,',
        'data://text/plain;foo=bar;bla,',
        'data://text/plain;foo=bar;base64,',
        'data://text/plain;foo=bar;bar=baz',
        'data://text/plain;foo=bar;bar=baz,',
        );

foreach($streams as $stream)
{
        $stream = fopen($stream, 'r');
        $meta = @stream_get_meta_data($stream);
        var_dump($meta);
        var_dump(isset($meta['foo']) ? $meta['foo'] : null);
}

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
array(8) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(8) "data://,"
  ["base64"]=>
  bool(false)
}
NULL

Warning: fopen(data://): failed to open stream: rfc2397: no comma in url in 
%sstream_rfc2397_002.php on line %d
bool(false)
NULL
array(8) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(15) "data://;base64,"
  ["base64"]=>
  bool(true)
}
NULL

Warning: fopen(data://;base64): failed to open stream: rfc2397: no comma in url 
in %sstream_rfc2397_002.php on line %d
bool(false)
NULL

Warning: fopen(data://foo,): failed to open stream: rfc2397: illegal media type 
in %sstream_rfc2397_002.php on line %d
bool(false)
NULL

Warning: fopen(data://foo=bar,): failed to open stream: rfc2397: illegal media 
type in %sstream_rfc2397_002.php on line %d
bool(false)
NULL
array(9) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(18) "data://text/plain,"
  ["mediatype"]=>
  string(10) "text/plain"
  ["base64"]=>
  bool(false)
}
NULL

Warning: fopen(data://text/plain;foo,): failed to open stream: rfc2397: illegal 
parameter in %sstream_rfc2397_002.php on line %d
bool(false)
NULL
array(10) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(26) "data://text/plain;foo=bar,"
  ["mediatype"]=>
  string(10) "text/plain"
  ["foo"]=>
  string(3) "bar"
  ["base64"]=>
  bool(false)
}
string(3) "bar"

Warning: fopen(data://text/plain;foo=bar;bla,): failed to open stream: rfc2397: 
illegal parameter in %sstream_rfc2397_002.php on line %d
bool(false)
NULL
array(10) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(33) "data://text/plain;foo=bar;base64,"
  ["mediatype"]=>
  string(10) "text/plain"
  ["foo"]=>
  string(3) "bar"
  ["base64"]=>
  bool(true)
}
string(3) "bar"

Warning: fopen(data://text/plain;foo=bar;bar=baz): failed to open stream: 
rfc2397: no comma in url in %sstream_rfc2397_002.php on line %d
bool(false)
NULL
array(11) {
  ["wrapper_type"]=>
  string(7) "RFC2397"
  ["stream_type"]=>
  string(4) "TEMP"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["unread_chars"]=>
  int(0)
  ["seekable"]=>
  bool(true)
  ["uri"]=>
  string(34) "data://text/plain;foo=bar;bar=baz,"
  ["mediatype"]=>
  string(10) "text/plain"
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "baz"
  ["base64"]=>
  bool(false)
}
string(3) "bar"
===DONE===
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to