1 package URI::data; # RFC 2397
8 use MIME::Base64 qw(encode_base64 decode_base64);
9 use URI::Escape qw(uri_unescape);
14 my $opaque = $self->opaque;
15 $opaque =~ /^([^,]*),?/ or die;
18 $base64 = $1 if $old =~ s/(;base64)$//i;
21 $new = "" unless defined $new;
24 $base64 = "" unless defined $base64;
25 $opaque =~ s/^[^,]*,?/$new$base64,/;
26 $self->opaque($opaque);
28 return uri_unescape($old) if $old; # media_type can't really be "0"
29 "text/plain;charset=US-ASCII"; # default type
35 my($enc, $data) = split(",", $self->opaque, 2);
36 unless (defined $data) {
38 $enc = "" unless defined $enc;
40 my $base64 = ($enc =~ /;base64$/i);
42 $enc =~ s/;base64$//i if $base64;
44 $new = "" unless defined $new;
45 my $uric_count = _uric_count($new);
46 my $urienc_len = $uric_count + (length($new) - $uric_count) * 3;
47 my $base64_len = int((length($new)+2) / 3) * 4;
48 $base64_len += 7; # because of ";base64" marker
49 if ($base64_len < $urienc_len || $_[0]) {
51 $new = encode_base64($new, "");
55 $self->opaque("$enc,$new");
57 return unless defined wantarray;
58 return $base64 ? decode_base64($data) : uri_unescape($data);
61 # I could not find a better way to interpolate the tr/// chars from
66 eval <<EOT; die $@ if $@;
79 URI::data - URI that contains immediate data
85 $u = URI->new("data:");
86 $u->media_type("image/gif");
87 $u->data(scalar(`cat camel.gif`));
89 open(XV, "|xv -") and print XV $u->data;
93 The C<URI::data> class supports C<URI> objects belonging to the I<data>
94 URI scheme. The I<data> URI scheme is specified in RFC 2397. It
95 allows inclusion of small data items as "immediate" data, as if it had
96 been included externally. Examples:
98 data:,Perl%20is%20good
100 data:image/gif;base64,R0lGODdhIAAgAIAAAAAAAPj8+CwAAAAAI
101 AAgAAAClYyPqcu9AJyCjtIKc5w5xP14xgeO2tlY3nWcajmZZdeJcG
102 Kxrmimms1KMTa1Wg8UROx4MNUq1HrycMjHT9b6xKxaFLM6VRKzI+p
103 KS9XtXpcbdun6uWVxJXA8pNPkdkkxhxc21LZHFOgD2KMoQXa2KMWI
104 JtnE2KizVUkYJVZZ1nczBxXlFopZBtoJ2diXGdNUymmJdFMAADs=
108 C<URI> objects belonging to the data scheme support the common methods
109 (described in L<URI>) and the following two scheme-specific methods:
113 =item $uri->media_type( [$new_media_type] )
115 Can be used to get or set the media type specified in the
116 URI. If no media type is specified, then the default
117 C<"text/plain;charset=US-ASCII"> is returned.
119 =item $uri->data( [$new_data] )
121 Can be used to get or set the data contained in the URI.
122 The data is passed unescaped (in binary form). The decision about
123 whether to base64 encode the data in the URI is taken automatically,
124 based on the encoding that produces the shorter URI string.
134 Copyright 1995-1998 Gisle Aas.
136 This library is free software; you can redistribute it and/or
137 modify it under the same terms as Perl itself.