Gruta/CGI.pm now generates an ETag HTTP header.
[gruta.git] / Gruta / CGI.pm
blob66d5e61831a7587486fb4ba41c4be2ec2b7b6ab1
1 package Gruta::CGI;
3 use CGI;
4 use Carp;
6 sub vars { return $_[0]->{cgi}->Vars(); }
7 sub upload_dirs { return @{ $_[0]->{upload_dirs} }; }
9 sub http_headers {
10 my $self = shift;
11 my %headers = @_;
13 foreach my $k (keys(%headers)) {
14 $self->{http_headers}->{$k} = $headers{$k};
17 return $self->{http_headers};
20 sub cookie {
21 my $self = shift;
23 if (@_) {
24 $self->http_headers( 'Set-Cookie', shift );
27 return $ENV{HTTP_COOKIE};
30 sub redirect { $_[0]->http_headers( 'Location', $_[1] ); }
32 sub data {
33 my $self = shift;
34 my $data = shift;
36 if (defined($data)) {
37 $self->{data} = $data;
40 return $self->{data};
44 sub upload {
45 my $self = shift;
46 my $dir = shift;
47 my $field = shift;
49 my $file = $self->{cgi}->param($field);
50 my ($basename) = ($file =~ /([^\/\\]+)$/);
52 if (! grep(/^$dir$/, $self->upload_dirs())) {
53 croak "Unauthorized upload directory $dir";
56 my $filename = $dir . '/' . $basename;
58 open F, '>' . $filename or croak "Can't write $filename";
59 while(<$file>) {
60 print F $_;
63 close F;
67 sub new {
68 my $class = shift;
70 my $obj = bless( { @_ }, $class );
72 $obj->{http_headers} = {
73 'Content-Type' => 'text/html; charset=ISO-8859-1',
74 'X-Gateway-Interface' => $ENV{'GATEWAY_INTERFACE'},
75 'X-Server-Name' => $ENV{'SERVER_NAME'}
78 $obj->{upload_dirs} ||= [];
80 $obj->{cgi} = CGI->new();
82 return $obj;
86 sub run {
87 my $self = shift;
89 my $data = $self->data();
90 my $vars = $self->vars();
92 $data->template->cgi_vars($vars);
94 if ($ENV{REMOTE_USER} and my $u = $data->user($ENV{REMOTE_USER})) {
95 $data->auth( $u );
97 elsif (my $cookie = $self->cookie()) {
98 if (my ($sid) = ($cookie =~ /^sid\s*=\s*(\d+)$/)) {
99 $data->auth_from_sid( $sid );
103 my $st = 'INDEX';
105 if ($vars->{t}) {
106 $st = uc($vars->{t});
109 $st = 'INDEX' unless $st =~ /^[-\w0-9_]+$/;
111 my $body = undef;
113 eval { $body = $data->template->process( $st ) };
115 if ($@) {
116 $data->log($@);
117 # $self->redirect('?t=INDEX');
118 $body = "<pre>$@</pre>";
121 $self->http_headers('X-Powered-By' => 'Gruta ' . $self->data->version());
123 if (!$data->auth()) {
124 use Digest::MD5;
126 my $md5 = Digest::MD5->new();
127 $md5->add($body);
129 $self->http_headers('ETag' => $md5->hexdigest());
132 my $h = $self->http_headers();
133 foreach my $k (keys(%{ $h })) {
134 print $k, ': ', $h->{$k}, "\n";
136 print "\n";
138 print $body;