ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CBOR-XS/XS.pm
(Generate patch)

Comparing CBOR-XS/XS.pm (file contents):
Revision 1.40 by root, Sun Jan 5 14:24:54 2014 UTC vs.
Revision 1.51 by root, Sun Apr 24 19:16:15 2016 UTC

64 64
65package CBOR::XS; 65package CBOR::XS;
66 66
67use common::sense; 67use common::sense;
68 68
69our $VERSION = 1.25; 69our $VERSION = 1.41;
70our @ISA = qw(Exporter); 70our @ISA = qw(Exporter);
71 71
72our @EXPORT = qw(encode_cbor decode_cbor); 72our @EXPORT = qw(encode_cbor decode_cbor);
73 73
74use Exporter; 74use Exporter;
218isn't prepared for this will not leak memory. 218isn't prepared for this will not leak memory.
219 219
220If C<$enable> is false (the default), then C<decode> will throw an error 220If C<$enable> is false (the default), then C<decode> will throw an error
221when it encounters a self-referential/cyclic data structure. 221when it encounters a self-referential/cyclic data structure.
222 222
223FUTURE DIRECTION: the motivation behind this option is to avoid I<real>
224cycles - future versions of this module might chose to decode cyclic data
225structures using weak references when this option is off, instead of
226throwing an error.
227
223This option does not affect C<encode> in any way - shared values and 228This option does not affect C<encode> in any way - shared values and
224references will always be decoded properly if present. 229references will always be encoded properly if present.
225 230
226=item $cbor = $cbor->pack_strings ([$enable]) 231=item $cbor = $cbor->pack_strings ([$enable])
227 232
228=item $enabled = $cbor->get_pack_strings 233=item $enabled = $cbor->get_pack_strings
229 234
256The concept of "valid UTF-8" used is perl's concept, which is a superset 261The concept of "valid UTF-8" used is perl's concept, which is a superset
257of the official UTF-8. 262of the official UTF-8.
258 263
259If C<$enable> is false (the default), then C<decode> will blindly accept 264If C<$enable> is false (the default), then C<decode> will blindly accept
260UTF-8 data, marking them as valid UTF-8 in the resulting data structure 265UTF-8 data, marking them as valid UTF-8 in the resulting data structure
261regardless of whether thats true or not. 266regardless of whether that's true or not.
262 267
263Perl isn't too happy about corrupted UTF-8 in strings, but should 268Perl isn't too happy about corrupted UTF-8 in strings, but should
264generally not crash or do similarly evil things. Extensions might be not 269generally not crash or do similarly evil things. Extensions might be not
265so forgiving, so it's recommended to turn on this setting if you receive 270so forgiving, so it's recommended to turn on this setting if you receive
266untrusted CBOR. 271untrusted CBOR.
476 481
477=item hash references 482=item hash references
478 483
479Perl hash references become CBOR maps. As there is no inherent ordering in 484Perl hash references become CBOR maps. As there is no inherent ordering in
480hash keys (or CBOR maps), they will usually be encoded in a pseudo-random 485hash keys (or CBOR maps), they will usually be encoded in a pseudo-random
481order. This order can be different each time a hahs is encoded. 486order. This order can be different each time a hash is encoded.
482 487
483Currently, tied hashes will use the indefinite-length format, while normal 488Currently, tied hashes will use the indefinite-length format, while normal
484hashes will use the fixed-length format. 489hashes will use the fixed-length format.
485 490
486=item array references 491=item array references
799additional tags (such as base64url). 804additional tags (such as base64url).
800 805
801=head2 ENFORCED TAGS 806=head2 ENFORCED TAGS
802 807
803These tags are always handled when decoding, and their handling cannot be 808These tags are always handled when decoding, and their handling cannot be
804overriden by the user. 809overridden by the user.
805 810
806=over 4 811=over 4
807 812
808=item 26 (perl-object, L<http://cbor.schmorp.de/perl-object>) 813=item 26 (perl-object, L<http://cbor.schmorp.de/perl-object>)
809 814
810These tags are automatically created (and decoded) for serialisable 815These tags are automatically created (and decoded) for serialisable
811objects using the C<FREEZE/THAW> methods (the L<Types::Serialier> object 816objects using the C<FREEZE/THAW> methods (the L<Types::Serialier> object
812serialisation protocol). See L<OBJECT SERIALISATION> for details. 817serialisation protocol). See L<OBJECT SERIALISATION> for details.
813 818
814=item 28, 29 (shareable, sharedref, L <http://cbor.schmorp.de/value-sharing>) 819=item 28, 29 (shareable, sharedref, L<http://cbor.schmorp.de/value-sharing>)
815 820
816These tags are automatically decoded when encountered (and they do not 821These tags are automatically decoded when encountered (and they do not
817result in a cyclic data structure, see C<allow_cycles>), resulting in 822result in a cyclic data structure, see C<allow_cycles>), resulting in
818shared values in the decoded object. They are only encoded, however, when 823shared values in the decoded object. They are only encoded, however, when
819C<allow_sharing> is enabled. 824C<allow_sharing> is enabled.
829will be shared, others will not. While non-reference shared values can be 834will be shared, others will not. While non-reference shared values can be
830generated in Perl with some effort, they were considered too unimportant 835generated in Perl with some effort, they were considered too unimportant
831to be supported in the encoder. The decoder, however, will decode these 836to be supported in the encoder. The decoder, however, will decode these
832values as shared values. 837values as shared values.
833 838
834=item 256, 25 (stringref-namespace, stringref, L <http://cbor.schmorp.de/stringref>) 839=item 256, 25 (stringref-namespace, stringref, L<http://cbor.schmorp.de/stringref>)
835 840
836These tags are automatically decoded when encountered. They are only 841These tags are automatically decoded when encountered. They are only
837encoded, however, when C<pack_strings> is enabled. 842encoded, however, when C<pack_strings> is enabled.
838 843
839=item 22098 (indirection, L<http://cbor.schmorp.de/indirection>) 844=item 22098 (indirection, L<http://cbor.schmorp.de/indirection>)
840 845
841This tag is automatically generated when a reference are encountered (with 846This tag is automatically generated when a reference are encountered (with
842the exception of hash and array refernces). It is converted to a reference 847the exception of hash and array references). It is converted to a reference
843when decoding. 848when decoding.
844 849
845=item 55799 (self-describe CBOR, RFC 7049) 850=item 55799 (self-describe CBOR, RFC 7049)
846 851
847This value is not generated on encoding (unless explicitly requested by 852This value is not generated on encoding (unless explicitly requested by
850=back 855=back
851 856
852=head2 NON-ENFORCED TAGS 857=head2 NON-ENFORCED TAGS
853 858
854These tags have default filters provided when decoding. Their handling can 859These tags have default filters provided when decoding. Their handling can
855be overriden by changing the C<%CBOR::XS::FILTER> entry for the tag, or by 860be overridden by changing the C<%CBOR::XS::FILTER> entry for the tag, or by
856providing a custom C<filter> callback when decoding. 861providing a custom C<filter> callback when decoding.
857 862
858When they result in decoding into a specific Perl class, the module 863When they result in decoding into a specific Perl class, the module
859usually provides a corresponding C<TO_CBOR> method as well. 864usually provides a corresponding C<TO_CBOR> method as well.
860 865
902C<URI::TO_CBOR> method again results in a CBOR URI value. 907C<URI::TO_CBOR> method again results in a CBOR URI value.
903 908
904=back 909=back
905 910
906=cut 911=cut
907
908our %FILTER = (
909 # 0 # rfc4287 datetime, utf-8
910 # 1 # unix timestamp, any
911
912 2 => sub { # pos bigint
913 require Math::BigInt;
914 Math::BigInt->new ("0x" . unpack "H*", pop)
915 },
916
917 3 => sub { # neg bigint
918 require Math::BigInt;
919 -Math::BigInt->new ("0x" . unpack "H*", pop)
920 },
921
922 4 => sub { # decimal fraction, array
923 require Math::BigFloat;
924 Math::BigFloat->new ($_[1][1] . "E" . $_[1][0])
925 },
926
927 5 => sub { # bigfloat, array
928 require Math::BigFloat;
929 scalar Math::BigFloat->new ($_[1][1])->blsft ($_[1][0], 2)
930 },
931
932 21 => sub { pop }, # expected conversion to base64url encoding
933 22 => sub { pop }, # expected conversion to base64 encoding
934 23 => sub { pop }, # expected conversion to base16 encoding
935
936 # 24 # embedded cbor, byte string
937
938 32 => sub {
939 require URI;
940 URI->new (pop)
941 },
942
943 # 33 # base64url rfc4648, utf-8
944 # 34 # base64 rfc46484, utf-8
945 # 35 # regex pcre/ecma262, utf-8
946 # 36 # mime message rfc2045, utf-8
947);
948
949 912
950=head1 CBOR and JSON 913=head1 CBOR and JSON
951 914
952CBOR is supposed to implement a superset of the JSON data model, and is, 915CBOR is supposed to implement a superset of the JSON data model, and is,
953with some coercion, able to represent all JSON texts (something that other 916with some coercion, able to represent all JSON texts (something that other
1017 980
1018 981
1019=head1 LIMITATIONS ON PERLS WITHOUT 64-BIT INTEGER SUPPORT 982=head1 LIMITATIONS ON PERLS WITHOUT 64-BIT INTEGER SUPPORT
1020 983
1021On perls that were built without 64 bit integer support (these are rare 984On perls that were built without 64 bit integer support (these are rare
1022nowadays, even on 32 bit architectures), support for any kind of 64 bit 985nowadays, even on 32 bit architectures, as all major Perl distributions
986are built with 64 bit integer support), support for any kind of 64 bit
1023integer in CBOR is very limited - most likely, these 64 bit values will 987integer in CBOR is very limited - most likely, these 64 bit values will
1024be truncated, corrupted, or otherwise not decoded correctly. This also 988be truncated, corrupted, or otherwise not decoded correctly. This also
1025includes string, array and map sizes that are stored as 64 bit integers. 989includes string, array and map sizes that are stored as 64 bit integers.
1026 990
1027 991
1052 # Time::Piece::Strptime uses the "incredibly flexible date parsing routine" 1016 # Time::Piece::Strptime uses the "incredibly flexible date parsing routine"
1053 # from FreeBSD, which can't parse ISO 8601, RFC3339, RFC4287 or much of anything 1017 # from FreeBSD, which can't parse ISO 8601, RFC3339, RFC4287 or much of anything
1054 # else either. Whats incredibe over standard strptime totally escapes me. 1018 # else either. Whats incredibe over standard strptime totally escapes me.
1055 # doesn't do fractional times, either. sigh. 1019 # doesn't do fractional times, either. sigh.
1056 # In fact, it's all a lie, it uses whatever strptime it wants, and of course, 1020 # In fact, it's all a lie, it uses whatever strptime it wants, and of course,
1057 # they are all incomptible. The openbsd one simply ignores %z (but according to the 1021 # they are all incompatible. The openbsd one simply ignores %z (but according to the
1058 # docs, it would be much more incredibly flexible indeed. If it worked, that is.). 1022 # docs, it would be much more incredibly flexible indeed. If it worked, that is.).
1059 scalar eval { 1023 scalar eval {
1060 my $s = $_[1]; 1024 my $s = $_[1];
1061 1025
1062 $s =~ s/Z$/+00:00/; 1026 $s =~ s/Z$/+00:00/;
1090 Math::BigFloat->new ($_[1][1] . "E" . $_[1][0]) 1054 Math::BigFloat->new ($_[1][1] . "E" . $_[1][0])
1091 }, 1055 },
1092 1056
1093 5 => sub { # bigfloat, array 1057 5 => sub { # bigfloat, array
1094 require Math::BigFloat; 1058 require Math::BigFloat;
1095 scalar Math::BigFloat->new ($_[1][1])->blsft ($_[1][0], 2) 1059 scalar Math::BigFloat->new ($_[1][1]) * Math::BigFloat->new (2)->bpow ($_[1][0])
1096 }, 1060 },
1097 1061
1098 21 => sub { pop }, # expected conversion to base64url encoding 1062 21 => sub { pop }, # expected conversion to base64url encoding
1099 22 => sub { pop }, # expected conversion to base64 encoding 1063 22 => sub { pop }, # expected conversion to base64 encoding
1100 23 => sub { pop }, # expected conversion to base16 encoding 1064 23 => sub { pop }, # expected conversion to base16 encoding

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines