/[suikacvs]/messaging/manakai/lib/Message/Field/Warning.pm
Suika

Contents of /messaging/manakai/lib/Message/Field/Warning.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Sat Aug 3 23:32:04 2002 UTC (22 years, 3 months ago) by wakaba
Branch: MAIN
CVS Tags: before-dis2-200411, manakai-release-0-3-2, manakai-release-0-3-1, manakai-release-0-4-0, manakai-200612, msg-0-1, HEAD
Branch point for: branch-suikawiki-1, experimental-xml-parser-200401, stable
2002-08-04  Wakaba <w@suika.fam.cx>

	* Warning.pm: New module.
	* CSV.pm (_delete_empty): Don't remove reference
	if the length of its stringified value is zero.
	* Domain.pm: Parse and output port number if enabled by option.
	* Date.pm (overload '==', '<=', '>='): Added.

1 wakaba 1.1
2     =head1 NAME
3    
4     Message::Field::Warning --- A element of "Warning:" HTTP general header field
5    
6     =cut
7    
8     package Message::Field::Warning;
9     use strict;
10     use vars qw(%DEFAULT @ISA $REASON %REG $VERSION);
11     $VERSION=do{my @r=(q$Revision: 1.1 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
12     require Message::Field::Structured;
13     push @ISA, qw(Message::Field::Structured);
14    
15     *REG = \%Message::Util::REG;
16    
17     ## Initialize of this class -- called by constructors
18     %DEFAULT = (
19     -_MEMBERS => [qw|warn_agent warn_text warn_date|],
20     -_METHODS => [qw|value warn_code warn_agent warn_text warn_date|],
21     -encoding_after_encode => 'iso-8859-1',
22     -encoding_before_decode => 'iso-8859-1',
23     #field_param_name
24     #field_name
25     #field_ns
26     -fill_warn_date => 0,
27     #format
28     #hook_encode_string
29     #hook_decode_string
30     -output_two_digit => 0,
31     #parse_all
32     -reason_default_set => 'http_1_1_rfc2616',
33     -use_warn_date => 1,
34     -value_pattern => '%03d %s %s%s',
35     );
36    
37     %{ $REASON->{common} } = grep {length} split /[\t\x0D\x0A]+/, q(
38     10 Response is stale
39     11 Revalidation failed
40     12 Disconnected operation
41     13 Heuristic expiration
42     14 Transformation applied
43     99 Miscellaneous warning
44    
45     110 Response is stale
46     111 Revalidation failed
47     112 Disconnected operation
48     113 Heuristic expiration
49     199 Miscellaneous warning
50     214 Transformation applied
51     299 Miscellaneous persistent warning
52    
53     300 Incompatible network protocol
54     301 Incompatible network address formats
55     302 Incompatible transport protocol
56     303 Incompatible bandwidth units
57     304 Media type not available
58     305 Incompatible media format
59     306 Attribute not understood
60     307 Session description parameter not understood
61     330 Multicast not available
62     331 Unicast not available
63     370 Insufficient bandwidth
64     399 Miscellaneous warning
65     );
66    
67     #%{ $REASON->{http_1_0} } = (%{ $REASON->{common} }, grep {length} split /[\t\x0D\x0A]#+/, q(
68     #));
69     $REASON->{http_1_0} = $REASON->{common}; ## Warning is not defined by RFC 1945
70     $REASON->{http_1_1_rfc2068} = $REASON->{common};
71     $REASON->{http_1_1_rfc2616} = $REASON->{common};
72     $REASON->{sip_2_0} = $REASON->{common};
73    
74     my %_two_to_three = qw(10 110 11 111 12 112 13 113 14 214 99 199);
75     my %_three_to_two = reverse %_two_to_three;
76    
77     =head1 CONSTRUCTORS
78    
79     The following methods construct new objects:
80    
81     =over 4
82    
83     =cut
84    
85     sub _init ($;%) {
86     my $self = shift; my %opt = @_;
87     my $DEFAULT = Message::Util::make_clone (\%DEFAULT);
88     $self->SUPER::_init (%$DEFAULT, %opt);
89    
90     my $format = $self->{option}->{format};
91     if ($format =~ /http-1\.0/) {
92     $self->{option}->{reason_default_set} = 'http_1_0'
93     unless defined $opt{-reason_default_set};
94     } elsif ($format =~ /rfc2068/) {
95     $self->{option}->{reason_default_set} = 'http_1_1_rfc2068'
96     unless defined $opt{-reason_default_set};
97     $self->{option}->{value_pattern} = '%02d %s %s'
98     unless defined $opt{-value_pattern};
99     $self->{option}->{output_two_digit} = 1 unless defined $opt{-output_two_digit};
100     } elsif ($format =~ /sip/) {
101     $self->{option}->{encoding_after_encode} = 'utf-8'
102     unless defined $opt{-encoding_after_encode};
103     $self->{option}->{encoding_before_decode} = 'utf-8'
104     unless defined $opt{-encoding_before_decode};
105     $self->{option}->{reason_default_set} = 'sip_2_0'
106     unless defined $opt{-reason_default_set};
107     $self->{option}->{value_pattern} = '%03d %s %s'
108     unless defined $opt{-value_pattern};
109     }
110    
111     $self->{option}->{value_type}->{warn_agent} = ['Message::Field::Domain',{
112     -fill_default_value => 1,
113     -fill_default_name => 1,
114     -fill_default_port => 0,
115     -format_ipv4 => '%vd',
116     -format_ipv6 => '%s',
117     -output_comment => 0,
118     -output_port => 1,
119     -use_port => 1,
120     }];
121     $self->{option}->{value_type}->{warn_date} = ['Message::Field::Date',{
122     -output_comment => 0,
123     }];
124     }
125    
126     =item $addr = Message::Field::Domain->new ([%options])
127    
128     Constructs a new object. You might pass some options as parameters
129     to the constructor.
130    
131     =cut
132    
133     ## Inherited
134    
135     =item $addr = Message::Field::Domain->parse ($field-body, [%options])
136    
137     Constructs a new object with given field body. You might pass
138     some options as parameters to the constructor.
139    
140     =cut
141    
142     sub parse ($$;%) {
143     my $class = shift;
144     my $self = bless {}, $class;
145     my $body = shift;
146     $self->_init (@_);
147     if ($body =~ /^([0-9]+)$REG{FWS}($REG{token}(?::[0-9]+)?)$REG{FWS}$REG{M_quoted_string}(?:$REG{FWS}$REG{M_quoted_string})?/x) {
148     $self->{value} = 0+$1;
149     $self->{value} = $_two_to_three{ $self->{value} } || $self->{value};
150     $self->{warn_agent} = $2;
151     $self->{warn_date} = $4;
152     my %s = &{$self->{option}->{hook_decode_string}} ($self,
153     $3, type => 'text',
154     charset => $self->{option}->{encoding_before_decode},
155     );
156     if ($s{charset}) { ## Convertion failed
157     $self->{_charset} = $s{charset};
158     $self->{value} = $s{value};
159     return $self;
160     } elsif (!$s{success}) {
161     $self->{_charset} = $self->{option}->{header_default_charset_input};
162     $self->{value} = $s{value};
163     return $self;
164     }
165     $self->{warn_agent} = $self->_parse_value (warn_agent => $self->{warn_agent})
166     if $self->{option}->{parse_all};
167     $self->{warn_date} = $self->_parse_value (warn_date => $self->{warn_date})
168     if $self->{option}->{parse_all};
169     $self->{warn_text} = $s{value};
170     } else {
171     $self->{value} = 0;
172     $self->{warn_text} = '';
173     $self->{warn_agent} = '';
174     $self->{warn_date} = '';
175     }
176     $self;
177     }
178    
179     sub value ($;$) {
180     my $self = shift;
181     my ($newvalue) = @_;
182     if ($newvalue) {
183     $self->{value} = $newvalue;
184     }
185     $self->{value};
186     }
187     *warn_code = \&value;
188    
189     sub warn_agent ($;$) {
190     my $self = shift;
191     my ($newvalue) = @_;
192     if ($newvalue) {
193     $self->{warn_agent} = $newvalue;
194     }
195     $self->{warn_agent} = $self->_parse_value (warn_agent => $self->{warn_agent})
196     if $self->{option}->{parse_all};
197     $self->{warn_agent};
198     }
199    
200     sub warn_text ($;$) {
201     my $self = shift;
202     my ($newvalue) = @_;
203     if ($newvalue) {
204     $self->{warn_text} = $newvalue;
205     }
206     $self->{warn_text};
207     }
208    
209     sub warn_date ($;$) {
210     my $self = shift;
211     my ($newvalue) = @_;
212     if ($newvalue) {
213     $self->{warn_date} = $newvalue;
214     }
215     $self->{warn_date} = $self->_parse_value (warn_date => $self->{warn_date})
216     if $self->{option}->{parse_all};
217     $self->{warn_date};
218     }
219    
220     sub stringify ($;%) {
221     my $self = shift;
222     my %o = @_; my %option = %{$self->{option}};
223     for (grep {/^-/} keys %o) {$option{substr ($_, 1)} = $o{$_}}
224     my $status = $self->{value};
225     return '' unless $status;
226     $status = $_three_to_two{$status} || $status if $option{output_two_digit};
227     $status += 0;
228     my ($host, $reason, $date);
229     $host = $self->warn_agent;
230     $date = $self->warn_date;
231     if ($date == 0 && $option{fill_warn_date}) {
232     $self->{warn_date}->unix_time (time);
233     }
234     if ($date == 0 || !$option{use_warn_date}) {
235     $date = '';
236     } else {
237     $date = ' '.Message::Util::quote_unsafe_string ($date, unsafe => 'MATCH_ALL');
238     }
239     if ($self->{_charset}) {
240     $reason = $self->{warn_text};
241     } else {
242     my (%e) = &{$option{hook_encode_string}} ($self,
243     $self->{warn_text}, type => 'text',
244     charset => $option{encoding_after_encode},
245     current_charset => $option{internal_charset},
246     );
247     $reason = $e{value};
248     }
249     if (!$reason) {
250     $reason = $REASON->{ $option{reason_default_set} }{ $status };
251     }
252     $reason = Message::Util::quote_unsafe_string ($reason, unsafe => 'MATCH_ALL') || '""';
253     sprintf $option{value_pattern}, $status, $host, $reason, $date;
254     }
255    
256     =head1 LICENSE
257    
258     Copyright 2002 wakaba E<lt>w@suika.fam.cxE<gt>.
259    
260     This program is free software; you can redistribute it and/or modify
261     it under the terms of the GNU General Public License as published by
262     the Free Software Foundation; either version 2 of the License, or
263     (at your option) any later version.
264    
265     This program is distributed in the hope that it will be useful,
266     but WITHOUT ANY WARRANTY; without even the implied warranty of
267     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
268     GNU General Public License for more details.
269    
270     You should have received a copy of the GNU General Public License
271     along with this program; see the file COPYING. If not, write to
272     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
273     Boston, MA 02111-1307, USA.
274    
275     =head1 CHANGE
276    
277     See F<ChangeLog>.
278     $Date: 2002/07/13 09:27:35 $
279    
280     =cut
281    
282     1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24