/[pub]/suikawiki/script/lib/SuikaWiki/Input/HTTP.pm
Suika

Contents of /suikawiki/script/lib/SuikaWiki/Input/HTTP.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Fri Oct 10 10:52:03 2003 UTC (22 years, 8 months ago) by wakaba
Branch: MAIN
New

1
2 =head1 NAME
3
4 SuikaWiki::Input::HTTP --- SuikaWiki: HTTP or HTTP CGI input support
5
6 =head1 DESCRIPTION
7
8 This module provides HTTP or HTTP CGI input support,
9 although current version of this module supports HTTP CGI only.
10
11 This module is part of SuikaWiki.
12
13 =cut
14
15 package SuikaWiki::Input::HTTP;
16 use strict;
17 our $VERSION = do{my @r=(q$Revision: 1.1 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
18
19 =head1 METHODS
20
21 =over 4
22
23 =item $http = SuikaWiki::Input::HTTP->new
24
25 Constructs new instance of HTTP input implementation
26
27 =cut
28
29 sub new ($;%) {
30 my $self = bless {
31 decoder => {
32 '#default' => sub {$_[1]},
33 },
34 option => {
35 param_input_encoding => 'ie',
36 },
37 }, shift;
38 my %opt = @_;
39 $self->{wiki} = $opt{wiki};
40 $self;
41 }
42
43 =item $value = $http->meta_variable ($name)
44
45 Returns variable value. $name should be a meta-variable name
46 defined by CGI specification, eg. CONTENT_TYPE, HTTP_USER_AGENT and so on.
47
48 =cut
49
50 sub meta_variable ($$) {
51 $main::ENV{ $_[1] };
52 }
53
54 =item $value = $http->parameter ($name)
55
56 Returns parameter value if any.
57 Parameter value is set by query-string of Request-URI
58 and/or entity-body value.
59
60 When multiple values with same parameter name is specified,
61 the first one is returned in scalar context or
62 an array reference of all values is returned in array context.
63 (Note that query-string is "earlier" than entity-body.)
64
65 =cut
66
67 sub parameter ($$) {
68 my ($self, $name) = @_;
69 $self->{param} ||= $self->__get_parameter;
70 wantarray ? ( $self->{param}->{$name}||[] ) :
71 ${$self->{param}->{$name}||[]}[0];
72 }
73
74 sub __get_parameter ($) {
75 my $self = shift;
76 my @src;
77
78 ## Query-string of Request-URI
79 my $qs = $self->meta_variable ('QUERY_STRING');
80 push @src, $qs if (index ($qs, '=') > -1)
81 || (index ($qs, ';') > -1)
82 || (index ($qs, '&') > -1);
83
84 ## Entity-body
85 if ($self->meta_variable ('REQUEST_METHOD') eq 'POST') {
86 my $mt = $self->meta_variable ('CONTENT_TYPE');
87 if ($mt =~ m<^application/(?:x-www|sgml)-form-urlencoded\b>) {
88 push @src, $self->body_text;
89 }
90 }
91
92 for my $src (@src) {
93 for (split /[;&]/, $src) {
94 my ($name, $val) = split '=', $_, 2;
95 $name = &{$self->{decoder}->{'#name'}
96 ||$self->{decoder}->{'#default'}} ($self, $name);
97 $self->{param}->{$name} ||= [];
98 push @{$self->{param}->{$name}},
99 &{$self->{decoder}->{$name}
100 ||$self->{decoder}->{'#default'}} ($self, $val);
101 }
102 }
103 }
104
105 =item $body = $http->body
106
107 Returns entity-body content if any.
108
109 It is expected that in future version of this module,
110 this method returns an object instantiated with body content
111 rather than body text itself.
112
113 =item $body = $http->body_text
114
115 Returnes entity-body context as a string.
116
117 =cut
118
119 sub body ($) {
120 my $self = shift;
121 $self->__get_entity_body unless defined $self->{body};
122 $self->{body};
123 }
124
125 sub body_text ($) {
126 $_[0]->body;
127 }
128
129 sub __get_entity_body ($) {
130 my $self = shift;
131 binmode STDIN;
132 read STDIN, $self->{body}, $main::ENV{CONTENT_LENGTH};
133 }
134
135 sub request_uri ($) {
136 ## TOTO: implement
137 }
138
139 =head1 TODO
140
141 =over 4
142
143 =item Use manakai
144
145 =item multipart/form-data support
146
147 =item HTTP (non-CGI) support
148
149 =cut
150
151 =head1 LICENSE
152
153 Copyright 2003 Wakaba <w@suika.fam.cx>
154
155 This program is free software; you can redistribute it and/or
156 modify it under the same terms as Perl itself.
157
158 =cut
159
160 1; # $Date: 2003/10/05 11:55:29 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24